Kartenplots in R mit ggplot2

In diesem Beitrag möchte ich zeigen, wie räumliche Standortdaten mit dem Paket ggplot2 in R auf einem Kartenhintergrund visualisiert werden können.

Dazu laden bzw. importieren wir zunächst die entsprechenden R-Pakete. Darüber hinaus definieren wir eine Geokodierungsfunktion mithilfe der Open Street Map-API. Die Geokodierungsfunktion wurde von https://datascienceplus.com/osm-nominatim-with-r-getting-locations-geo-coordinates-by-its-address/ übernommen.

Im nächsten Schritt erfassen wir mithilfe der Funktion map_data aus dem Paket ggplot2 eine Karte in Form eines Datenrahmens, der zum Plotten geeignet ist. Anschließend erstellen wir auch manuell eine Liste der Städtenamen und konvertieren diese Städtenamen mithilfe der Geokodierungsfunktion in Koordinaten.

Mit ggplot2 werden die geokodierten Datenpunkte dann auf einer Weltkarte darstellen.

# relevante Bibliotheken importieren
library(ggplot2)
library(ggrepel)

# osm Geocoder
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)))
}

# Kernteil
# Datenaufbereitung
world <- map_data("world")

points_df <- data.frame(matrix(nrow=0,ncol=2))
colnames(points_df) <- c("long","lat")
city_list <- c("New York City, New York, USA",
               "Detroit, Michigan, USA",
               "Atlanta, Georgia, USA",
               "Birmingham, Alabama, USA",
               "Miami, Florida, USA",
               "Nashville, Tennessee, USA",
               "Knoxville, Tennessee, USA")

for(i in city_list){
  dum_coord <- osm_geocoder(i)
  points_df <- rbind(points_df,data.frame("long"=c(as.numeric(dum_coord[1])),"lat"=c(as.numeric(dum_coord[2]))))
}

gg_1 <- ggplot(world) +
  geom_polygon(mapping=aes(x=long,y=lat, group=group),fill="white",colour="black")

gg_dots <- gg_1 + geom_point(data=points_df,mapping=aes(x=long, y=lat),colour="red",size=3)

gg_text <- gg_dots + geom_text_repel(data=data.frame("long"=points_df$long,"lat"=points_df$lat,"city"=city_list),
                                                                    mapping=aes(x=long,y=lat,label=c("New York",
                                                                                                     "Detroit",
                                                                                                     "Atlanta",
                                                                                                     "Birmingham",
                                                                                                     "Miami",
                                                                                                     "Nashville",
                                                                                                     "Knoxville")),
                                     color="blue",
                                     size=6)

# den Plot ausgeben
gg_text

Leave a Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Close

Meta