Usando deckgl en R para la visualización de datos espaciales

Quiero proporcionar un ejemplo de cómo trazar diagramas de mapas 3D con el paquete deckgl en R. Genero un diagrama de barras en un diseño de mapa desde Mapbox.

Primero, defino nuestra función de geocodificación Open Street Map, que se encuentra en datascienceplus.com. Geocodifica cadenas de direcciones en coordenadas de longitud y latitud utilizando la API Open Street Map (OSM-API).

## documentación: http://wiki.openstreetmap.org/wiki/Nominatim
# fuente: https://datascienceplus.com/osm-nominatim-with-r-getting-locations-geo-coordinates-by-its-address/
osm_geocoder <- function(address = NULL)
{
  if(suppressWarnings(is.null(address)))
    return(data.frame())
  
  tryCatch(
    d <- jsonlite::fromJSON( 
      gsub('\\@addr\\@', gsub('\\s+', '\\%20', address), 
           'http://nominatim.openstreetmap.org/search/@addr@?format=json&addressdetails=0&limit=1')
    ), error = function(c) return(data.frame())
  )
  
  if(length(d) == 0) 
    return(data.frame())
  
  return(data.frame(lon = as.numeric(d$lon), lat = as.numeric(d$lat)))
}

Después de eso, creo una lista con los nombres de las ciudades. Suministro esta lista a la función de codificación geográfica, generando así un marco de datos codificado geográficamente.

city_list <- c("Frankfurt, Germany",
               "Dortmund, Germany",
               "Berlin, Germany",
               "Stuttgart, Germany",
               "Karlsruhe, Germany",
               "Zurich, Switzerland", 
               "Wien, Austria", 
               "Bern, Switzerland",
               "Munich, Germany",
               "Marburg, Germany",
               "Giessen, Germany",
               "Pforzheim, Germany",
               "Cologne, Germany", 
               "Essen, Germany", 
               "Heidelberg, Germany",
               "Kassel, Germany",
               "Paderborn, Germany",
               "Leipzig, Germany",
               "Dresden, Germany",
               "Nuremberg, Germany",
               "Augsburg, Germany",
               "Regensburg, Germany",
               "Pilsen, Czech Republic",
               "Linz, Austria",
               "Innsbruck, Austria",
               "Bamberg, Germany",
               "Fulda, Germany",
               "Hanover, Germany",
               "Wolfsburg, Germany",
               "Magdeburg, Germany",
               "Jena, Germany",
               "Chemnitz, Germany",
               "Zwickau, Germany",
               "Cottbus, Germany",
               "Bautzen, Germany",
               "Mainz, Germany",
               "Bonn, Germany",
               "Duesseldorf, Germany",
               "Trier, Germany",
               "Mannheim, Germany",
               "Aachen, Germany",
               "Freiburg, Germany",
               "Ulm, Germany",
               "Kempten, Germany",
               "Ingolstadt, Germany")

# vamos a generar un marco de datos que podemos usar para la función add_grid_layer
data_df_columns <- data.frame(matrix(nrow=3500*length(city_list),ncol=4))
colnames(data_df_columns) <- c("ADDRESS","RACKS","SPACES","COORDINATES")

data_df_columns$RACKS <- 2
data_df_columns$SPACES <- 4

for(i in 1:length(city_list)){
  print(i)
  dum_coord <- osm_geocoder(city_list[i])
  for(j in 1:3500){
    data_df_columns$ADDRESS <- paste0(city_list[i]," : ",j)
    dum_long <- rnorm(1, mean=as.numeric(dum_coord[1]),sd=0.75)  
    dum_lat <- rnorm(1,mean=as.numeric(dum_coord[2]),sd=0.75)
    data_df_columns$COORDINATES[(i-1)*3500+j] <- list(c(dum_long, dum_lat))
  }
}

properties_grid <- list(
  pickable = TRUE,
  extruded = TRUE,
  cellSize = 1600,
  elevationScale = 8,
  coverage = 0.5,
  colorRange = list(c(0,255,255),
                    c(0,204,255),
                    c(0,153,255),
                    c(0,51,255),
                    c(0,0,255),
                    c(0,0,204)),
  getPosition = JS("data => data.COORDINATES"),
  getTooltip = JS("object => object.count")
)

Una vez que tengo un conjunto de datos con mis puntos de datos espaciales creados artificialmente, geocodificados con la función de geocodificación, puedo trazarlos usando el paquete deckgl en R. Los mapas base se crean en Mapbox.

deckgl(zoom = 10, pitch = 120, longitude = 8.682092, latitude = 50.11064) %>%
  add_grid_layer(data = data_df_columns,properties = properties_grid) %>%
  add_mapbox_basemap(style = "mapbox://styles/linnartsf/cjq6p9q8f8zwf2rp74qf2o3d5")
Gráfico de mapa 3D que visualiza el conjunto de datos espaciales creado artificialmente (geocodificado con OSM-API)

He publicado algunas otras publicaciones de visualización de datos espaciales en R que es posible que desee consultar.

You May Also Like

Leave a Reply

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.