Jeg vil give et eksempel på, hvordan man tegner 3D-kortplot med deckgl-pakken i R. Jeg genererer et kortbaseret søjlediagram på et kortlayout fra Mapbox.
Først definerer jeg en Open Street Map geokodningsfunktion, som findes på datascienceplus.com. Funktionen geokoder adresser til længde- og breddegradskoordinater ved hjælp af Open Street Map API (OSM-API).
## dokumentation: http://wiki.openstreetmap.org/wiki/Nominatim
# kilde: 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)))
}
Derefter bygger jeg en liste med bynavne. Jeg overgiver denne liste til geokodningsfunktionen og genererer derved en geokodet dataramme.
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")
# generer en dataramme, som vi kan bruge til funktionen 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")
)
Når jeg har et datasæt med mine kunstigt oprettede geografiske datapunkter, geokodet med geokodningsfunktionen, kan jeg plotte dem ved hjælp af deckgl-pakken i R. Basiskortet oprettes i 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")
Industriingeniør som gerne beskæftiger sig med optimering, simulation og matematisk modellering i R, SQL, VBA og Python
Leave a Reply