¡Maño qué mapa!

Esta mañana casi me da esa tontería de sentirme orgulloso de ser de donde soy, Zaragoza. Al fin y al cabo, podría haber sido de cualquier otro lugar. Pero es que Zaragoza tiene uno de los portales de datos públicos municipales más avanzados. En eso es una ciudad pionera.

(Se lo hemos de agradecer a nuestro alcalde, Belloch, que, dicen las malas lenguas, además de socialista y barbudo, es linuxero).

Entre los datos disponibles, los hay de tráfico en tiempo real. En particular, existe una serie de tramos de calle y un fichero que se actualiza cada pocos segundos que indica el estado del tráfico en ellos.

Y he pensado que tal vez podría hacer una virguería con R.

Así que he escrito lo siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
library(rjson)

# tmp <- readLines("http://www.zaragoza.es/trafico/estado/tramos23030.json")
tmp <- readLines("http://www.zaragoza.es/trafico/estado/tramoswgs84.json")
tmp <- fromJSON(tmp)[[1]]

status <- fromJSON(readLines("http://www.zaragoza.es/trafico/estado/estado.json"))

status.time <- status$timestamp
status <- strsplit(status$estados, "")[[1]]

# length(kkk)

tmp <- lapply(tmp, function(x) {
  id     <- x$id
  name   <- x$name
  status <- status[id]
  lat    <- sapply(x$points, function(y) y$lat)
  lon    <- sapply(x$points, function(y) y$lon)

  data.frame(id = id, name = name, status = status, lat = lat, lon = lon)

})

tmp <- do.call(rbind, tmp)

# tmp <- merge(tmp, status)

plot(range(tmp$lon), - range(-tmp$lat),
  xaxt = "n", yaxt = "n", type = "n",
  main = paste(
      "Estado del tráfico en Zaragoza",
      strptime(gsub("-|Z", " ", status.time),
        format = "%Y%m%d %H%M%S"), sep = "\n"),
  xlab = "", ylab = "")

foo <- function(x, y, status){
  colores <- c("black", "red", "yellow",  "green", "lightgray")
  color   <- colores[ match(status, c("b", "r", "y", "g"), nomatch = 5) ]
  lines(x,y, col = color, lwd = ifelse(status == "-", 1, 2))
}

by(tmp, tmp$id, function(x) foo(x$lon, x$lat, status = x$status))

Que da como resultado (a la hora en la que lo he ejecutado, cuando los zaragozanos están ya casi todos en su casa)

Pero me ha sabido a poco y he querido hacerlo todavía más a lo maño. Así que he añadido

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
library(OpenStreetMap)

map <- openmap(c(max(tmp$lat), min(tmp$lon)), c(min(tmp$lat), max(tmp$lon)), type = "osm")
plot(map,raster=TRUE)

tmp.mercator <- data.frame(projectMercator(tmp$lat, tmp$lon))
tmp.mercator$status <- tmp$status

foo <- function(x, y, status){
  colores <- c("black", "red", "yellow",  "green", "lightgray")
  color   <- colores[ match(status, c("b", "r", "y", "g"), nomatch = 5) ]
  lines(x,y, col = color, lwd = ifelse(status == "-", 1, 2))
}

by(tmp.mercator, tmp$id, function(x) foo(x$x, x$y, status = x$status))

Y he obtenido

Hay algunas cosas que me gustaría poder añadir, minucias, pero que estoy demasiado ocupado para investigar y que me gustaría dejar de tarea a mis lectores:

  • ¿Cómo poner un título al segundo gráfico?
  • ¿Cómo difuminar la imagen de fondo para que resalten más los tramos de tráfico sobre el excesivo detalle del mapa subyacente?