आर में एक आकृतिफाइल का उपयोग किए बिना स्थानिक बहुभुज को तत्काल करना


22

तो, जिस तरह से हम आर में एक आकृति का पाठ पढ़ते हैं वह maptools पैकेज के माध्यम से होता है, जैसे:

sfdata <- readShapeSpatial("/path/to/my/shapefile.shp", proj4string=CRS("+proj=longlat"))

हालाँकि, मेरे पास एक उपयोग का मामला है जिसके तहत मेरे पास एक शेपफाइल नहीं है। shp लेकिन इसके बजाय मेरे पास बहुभुज निर्देशांक की एक श्रृंखला है

16.484375 59.736328125,17.4951171875 55.1220703125,24.74609375 55.0341796875,22.5927734375 61.142578125,16.484375 59.736328125

और इसके अनुरूप प्रक्षेपण

coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 

इस डेटा से मैं सीधे "sfdata" (जो एक "बहुभुज वस्तु") होगा, कैसे करूँ? (इन आंकड़ों के साथ एक आकृति बनाने के चक्कर में और फिर नए बनाए गए आकृति से पढ़ने के बिना)

जवाबों:


35

पहले निर्देशांक को 2-कॉलम मैट्रिक्स में प्राप्त करें:

> xym
         [,1]     [,2]
[1,] 16.48438 59.73633
[2,] 17.49512 55.12207
[3,] 24.74609 55.03418
[4,] 22.59277 61.14258
[5,] 16.48438 59.73633

फिर एक बहुभुज बनाएं, जो कि एक बहुभुज वस्तु में लपेटें, फिर उस एक स्थानिक पिओलिगन्स वस्तु में लपेटें:

> library(sp)
> p = Polygon(xym)
> ps = Polygons(list(p),1)
> sps = SpatialPolygons(list(ps))

जटिलता के इस स्तर का कारण यह है कि एक बहुभुज एक साधारण अंगूठी है, एक बहुभुज वस्तु एक आईडी के साथ कई छल्ले हो सकती है (यहाँ 1 पर सेट) (इसलिए यह एक जीआईएस में एक एकल सुविधा की तरह है) और एक स्पैटियल पॉलीगॉन में एक सीआरएस हो सकता है । ऊह, मुझे शायद इसे सेट करना चाहिए:

> proj4string(sps) = CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")

यदि आप इसे SpatialPolygonsDataFrame में बदलना चाहते हैं (जो कि हमारे रीडस्पेशियल की बात आती है, जब आकृति पॉलीगॉन है) तो करें:

> data = data.frame(f=99.9)
> spdf = SpatialPolygonsDataFrame(sps,data)
> spdf

यह दे:

> summary(spdf)
Object of class SpatialPolygonsDataFrame
Coordinates:
       min      max
x 16.48438 24.74609
y 55.03418 61.14258
Is projected: FALSE 
proj4string :
[+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0]
Data attributes:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   99.9    99.9    99.9    99.9    99.9    99.9 

+1 बहुत अच्छा, स्पष्ट प्रदर्शनी। एक अखंड ब्लॉक के रूप में पेश किए जाने के बजाय स्पष्टीकरण द्वारा कोड को देखना बहुत अच्छा है!
whuber

बहुत बढ़िया ... यह देखना शानदार है कि इन वस्तुओं को एक साथ कैसे रखा जाता है! इस तरह स्पष्ट रूप से लिखे गए आर हेल्प पेजों को अधिक देखने की जरूरत है।
सिमबामुंगु

इसका कुछ तरीका मुझे अपने आप को हर बार सिखाना होगा जो मैं करना चाहता हूं, इसलिए मैं अन्य लोगों को सिखाने का कोई भी अवसर लेता हूं!
13

1
उत्कृष्ट ... मैं डेटा फ्रेम में कई अद्वितीय आईडी (एफ) बहुभुज जोड़ने के बारे में कैसे जाऊंगा?
मग

2
अधिक सामान्य वैधता के इस उत्तर के लिए, क्या आप दिखा सकते हैं कि बहुभुज के मामले में यह कैसे करना है? यह थोड़ा मुश्किल है।
टॉमस

2

उस स्थान के लिए जहां आपके डेटा में कई बहुभुज होंगे, स्पेंडमैन के उत्कृष्ट उत्तर को पूरा करने के लिए यहां कुछ कोड का उपयोग किया गया है dplyr:

library(dplyr)
library(ggplot2)
library(sp)
## use data from ggplot2:::geom_polygon example:
positions <- data.frame(id = rep(factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3")), each = 4),
                    x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
                          0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
                    y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
                          2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2)) %>% as.tbl


df_to_spp <- positions %>%
  group_by(id) %>%
  do(poly=select(., x, y) %>%Polygon()) %>%
  rowwise() %>%
  do(polys=Polygons(list(.$poly),.$id)) %>%
  {SpatialPolygons(.$polys)}

## plot it
plot(df_to_spp)

बस मज़े के लिए, आप ggplot2प्रारंभिक डेटा-फ़्रेम का उपयोग करके प्राप्त किए गए प्लॉट के साथ तुलना कर सकते हैं :

ggplot(positions) + 
  geom_polygon(aes(x=x, y=y, group=id), colour="black", fill=NA)

ध्यान दें कि ऊपर दिया गया कोड मानता है कि आपके पास प्रति आईडी केवल एक पॉलीगॉन है। यदि कुछ आईडी में बहुभुज तिरस्कृत होते हैं, तो मुझे लगता है कि डेटासेट में एक और कॉलम जोड़ना चाहिए, पहले group_byउप-आईडी, फिर group_by(upper-id)इसके बजायrowwise

purrr::mapफ़ंक्शन का उपयोग करते हुए समान कोड :

df_to_spp <- positions %>%
  nest(-id) %>%
  mutate(Poly=purrr::map(data, ~select(., x, y)  %>% Polygon()),
         polys=map2(Poly, id, ~Polygons(list(.x),.y))) %>%
  {SpatialPolygons(.$polys)}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.