ggmap: รูปหลายเหลี่ยมพล็อตจาก shapefile


9

ใช้ ggmap ฉันต้องการรวมเขตเทศบาล (รูปหลายเหลี่ยม) จาก shapefile บนแผนที่ที่มีจุดสถานที่ตั้งบางจุด สคริปต์นี้ทำทุกอย่างยกเว้นการวางแผนรูปหลายเหลี่ยม:

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)

ฉันจะพล็อตรูปหลายเหลี่ยมจาก shapefile ได้อย่างไร ฉันได้ลองแทนบรรทัดสุดท้ายที่สองด้วยสิ่งต่อไปนี้:

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

แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

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

คำตอบ:


9

as.data.frame()ไม่ทำงานสำหรับSpatialPolgonsในgeom_polygonเพราะรูปทรงเรขาคณิตที่สูญหาย คุณต้องใช้ggplot2::fortify(อาจเลิกใช้ในอนาคตดู?fortify) วิธีที่แนะนำให้ใช้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

แต่ปัญหาอื่นที่เกิดขึ้นกับตัวอย่างของคุณ เนื่องจากรูปหลายเหลี่ยมมีขนาดใหญ่กว่าขอบเขตแผนที่ggmapจึงไม่สามารถตัดรูปหลายเหลี่ยมได้อย่างถูกต้อง ggmapตั้งค่าขีด จำกัด บนสเกลซึ่งจะเป็นการโยนข้อมูลทั้งหมดที่ไม่ได้อยู่ภายในขีด จำกัด เหล่านี้

นี่คือรหัสที่แก้ไขแล้วของคุณ:

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


คุณบันทึกวันของฉันอีกครั้ง!
matthiash

2

เพื่อเพิ่มคำตอบข้างต้น: สำหรับผู้ที่ติดตามการสอน / คำตอบที่ยอดเยี่ยมและสงสัยว่าจะแก้ปัญหาต่อไปเกี่ยวกับการตัดรูปหลายเหลี่ยมได้อย่างไร (เหมือนที่ฉันเป็น!)

นี่คือคำตอบความสุภาพของผู้ใช้ 'streamlinedmethod' ที่ /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)

จากนั้นเมื่อคุณวางแผนออกคุณจะไม่มีปัญหาการตัดที่แปลก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.