ggmap: vẽ đa giác từ shapefile


9

Sử dụng ggmap, tôi muốn bao gồm các đường viền đô thị (đa giác) từ một shapefile trên bản đồ có chứa một số điểm vị trí. Kịch bản này thực hiện mọi thứ trừ việc vẽ đa giác:

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)

Làm thế nào tôi có thể vẽ đa giác từ shapefile? Tôi đã thử thay thế dòng cuối cùng thứ hai bằng cách sau:

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

Nhưng sau đó tôi nhận được lỗi sau:

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

Câu trả lời:


9

as.data.frame()không hoạt động SpatialPolgonstrong geom_polygon, bởi vì hình học bị mất. Bạn phải sử dụng ggplot2::fortify(có thể không dùng nữa trong tương lai, xem ?fortify). Cách được đề xuất bây giờ là sử dụng 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

Nhưng một vấn đề khác phát sinh với ví dụ của bạn. Vì đa giác lớn hơn phạm vi bản đồ, ggmapkhông cắt chính xác đa giác. ggmapđặt các giới hạn trên thang đo, điều này sẽ loại bỏ tất cả dữ liệu không nằm trong các giới hạn này.

Đây là phiên bản sửa đổi của mã của bạn:

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


Bạn đã cứu ngày của tôi một lần nữa!
matthiash

2

Để thêm vào câu trả lời ở trên: Dành cho những người theo dõi hướng dẫn / câu trả lời tuyệt vời của họ và tự hỏi làm thế nào để giải quyết vấn đề tiếp theo về việc cắt đa giác (như tôi đã từng!)

Đây là câu trả lời, lịch sự của người dùng 'tinh giản đối tượng' tại /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)

sau đó khi bạn vạch ra, bạn sẽ không gặp phải vấn đề cắt xén kỳ lạ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.