ggmap: शेपफाइल से बहुभुज को प्लॉट करें


9

Ggmap का उपयोग करते हुए, मैं कुछ स्थान बिंदुओं वाले मानचित्र पर एक आकृति से नगर पालिका सीमाओं (बहुभुज) को शामिल करना चाहता हूं। बहुभुज की साजिश को छोड़कर यह स्क्रिप्ट सब कुछ करती है:

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)

मैं आकृति से बहुभुज की साजिश कैसे कर सकता हूं? मैंने निम्नलिखित के साथ दूसरी अंतिम पंक्ति को प्रतिस्थापित करने की कोशिश की है:

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

उपरोक्त उत्तर को जोड़ने के लिए: उनके उत्कृष्ट ट्यूटोरियल / उत्तर का अनुसरण करने वालों के लिए और यह सोचकर कि बहुभुज क्लिपिंग के बारे में अगली समस्या को कैसे हल किया जाए (जैसा कि मैं था!)

यहाँ जवाब है, /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)

फिर जब आप प्लॉट करते हैं, तो आपके पास अजीब कतरन मुद्दा नहीं होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.