ggmap: Plotten Sie das Polygon aus dem Shapefile


9

Mit ggmap möchte ich Gemeindegrenzen (Polygon) aus einem Shapefile auf einer Karte mit einigen Standortpunkten einfügen. Dieses Skript erledigt alles außer dem Zeichnen des Polygons:

library(rgdal)
library(ggmap)

# Get shapefile with Drammen municipality borders
tmpzip<-tempfile()
tmpdir<-tempfile()
dir.create(tmpdir)
download.file("http://www.kartverket.no/Documents/Kart/N50-N5000%20Kartdata/33_N5000_shape.zip",tmpzip)
unzip(tmpzip, exdir=tmpdir)
kommune <- readOGR(dsn=tmpdir, layer="NO_AdminOmrader_pol")
kommune<-kommune[kommune$NAVN=="Drammen",]
kommune<-spTransform(kommune, CRS("+init=epsg:4326"))

# Get location point data 
subscr<-data.frame(lon=c(10.1237,10.2161,10.2993),lat=c(59.7567,59.7527,59.6863), pop=c(58,12,150))
coordinates(subscr)<-~lon+lat
proj4string(subscr)<-CRS("+init=epsg:4326")

lon <- c(10.0937,10.3293)
lat <- c(59.7916,59.6563)
map <- get_map(location = c(lon[1], lat[2], lon[2], lat[1]),
               maptype = "roadmap", source = "osm", zoom = 11)
p <- ggmap(map) +
  geom_point(data = as.data.frame(subscr), aes(x = lon, y = lat, size=pop),
             colour = "darkgreen") +
  theme_bw()
print(p)

Wie kann ich das Polygon aus dem Shapefile zeichnen? Ich habe versucht, die vorletzte Zeile durch folgende zu ersetzen:

p <- ggmap(map) +
  geom_point(data = as.data.frame(subscr), aes(x = lon, y = lat, size=pop),
             colour = "darkgreen") +
  geom_polygon(data = as.data.frame(kommune)) +
  theme_bw()

Aber dann bekomme ich folgenden Fehler:

Error: Aesthetics must be either length 1 or the same as the data (1): x, y

Antworten:


9

as.data.frame()funktioniert nicht für SpatialPolgonsin geom_polygon, da die Geometrie verloren geht. Sie müssen verwenden ggplot2::fortify(möglicherweise in Zukunft veraltet, siehe ?fortify). Der empfohlene Weg ist jetzt zu verwenden broom::tidy:

R> library("broom")
R> head(tidy(kommune))
Regions defined for each Polygons
   long   lat order  hole piece group  id
1 10.29 59.72     1 FALSE     1 153.1 153
2 10.32 59.70     2 FALSE     1 153.1 153
3 10.32 59.69     3 FALSE     1 153.1 153
4 10.31 59.68     4 FALSE     1 153.1 153
5 10.30 59.67     5 FALSE     1 153.1 153
6 10.28 59.67     6 FALSE     1 153.1 153

Bei Ihrem Beispiel tritt jedoch ein anderes Problem auf. Da das Polygon größer als die Kartenausdehnung ist, ggmapwird das Polygon nicht richtig abgeschnitten. ggmapWenn Sie die Grenzwerte für die Skala festlegen, werden alle Daten verworfen, die nicht innerhalb dieser Grenzwerte liegen.

Hier ist eine modifizierte Version Ihres Codes:

p <- ggmap(map, extent = "normal", maprange = FALSE) +
     geom_point(data = as.data.frame(subscr),
                aes(x = lon, y = lat, size=pop),
                colour = "darkgreen") +
     geom_polygon(data = fortify(kommune),
                  aes(long, lat, group = group),
                  fill = "orange", colour = "red", alpha = 0.2) +
     theme_bw() +
     coord_map(projection="mercator",
               xlim=c(attr(map, "bb")$ll.lon, attr(map, "bb")$ur.lon),
               ylim=c(attr(map, "bb")$ll.lat, attr(map, "bb")$ur.lat))

print(p)

ggmap


Du hast meinen Tag wieder gerettet!
Matthiash

2

Um die obige Antwort zu ergänzen: Für diejenigen, die ihrem hervorragenden Tutorial / ihrer Antwort folgen und sich fragen, wie sie das nächste Problem mit dem Ausschneiden von Polygonen lösen können (wie ich es war!)

Hier ist die Antwort mit freundlicher Genehmigung des Benutzers 'streamlinedmethod' unter /programming/13982773/crop-for-spatialpolygonsdataframe

library(maptools)
library(raster)   ## To convert an "Extent" object to a "SpatialPolygons" object.
library(raster)   ## To convert an "Extent" object to a "SpatialPolygons" object.
library(rgeos)
data(wrld_simpl)

# Create the clipping polygon
CP <- as(extent(130, 180, 40, 70), "SpatialPolygons")
proj4string(CP) <- CRS(proj4string(wrld_simpl))

# Clip the map
out <- gIntersection(wrld_simpl, CP, byid=TRUE)

Wenn Sie dann planen, werden Sie nicht das seltsame Clipping-Problem haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.