ggmap: plot poligon dari shapefile


9

Menggunakan ggmap, saya ingin memasukkan batas kota (poligon) dari shapefile pada peta yang berisi beberapa titik lokasi. Script ini melakukan segalanya kecuali merencanakan poligon:

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)

Bagaimana saya bisa menggambar poligon dari shapefile? Saya telah mencoba mengganti baris terakhir kedua dengan yang berikut:

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()

Tapi kemudian saya mendapatkan kesalahan berikut:

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

Jawaban:


9

as.data.frame()tidak berfungsi untuk SpatialPolgonsdalam geom_polygon, karena geometri hilang. Anda harus menggunakan ggplot2::fortify(mungkin sudah usang di masa depan, lihat ?fortify). Cara yang disarankan sekarang adalah menggunakan 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

Tetapi masalah lain muncul dengan contoh Anda. Karena poligon lebih besar dari luas peta, ggmaptidak dapat memotong poligon dengan benar. ggmapmenetapkan batas pada skala, ini akan membuang semua data yang tidak di dalam batas ini.

Ini adalah versi modifikasi dari kode Anda:

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


Anda menyelamatkan hari saya lagi!
matthiash

2

Untuk menambah jawaban di atas: Bagi mereka yang mengikuti tutorial / jawaban yang sangat baik dan bertanya-tanya bagaimana menyelesaikan masalah selanjutnya tentang kliping poligon (seperti saya!)

Inilah jawabannya, milik pengguna 'streamlinedmethod' di /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)

maka ketika Anda merencanakan, Anda tidak akan memiliki masalah kliping yang aneh.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.