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")
He publicado algunas otras publicaciones de visualización de datos espaciales en R que es posible que desee consultar.
Ingeniero industrial especializado en optimización y simulación (R, Python, SQL, VBA)
Leave a Reply