आर में चौराहे क्षेत्रों को निकालना


19

मेरे पास दो बहुभुज हैं। एक में फ़ील्ड (X, Y, Z) और दूसरे में मिट्टी के प्रकार (A, B, C, D) होते हैं। मैं जानना चाहता हूं कि हर क्षेत्र के किस क्षेत्र में किस प्रकार की मिट्टी है। मैंने निम्नलिखित कोशिश की:

यहाँ छवि विवरण दर्ज करें

library(rgdal)
library(rgeos)
Field<-readOGR("./","Field")
Soil<-readOGR("./","Soil")
Results<-gIntersects(Soil,Field,byid=TRUE)
rownames(Results)<-Field@data$FieldName
colnames(Results)<-Soil@data$SoilType

> Results
      A     B     C     D
Z  TRUE FALSE FALSE FALSE
Y FALSE  TRUE  TRUE FALSE
X  TRUE  TRUE  TRUE  TRUE

और मुझे यह बताते हुए अच्छे परिणाम प्राप्त हुए कि किस क्षेत्र में कौन सी मिट्टी किस प्रकार की है। हालांकि, मुझे इसके बजाय क्षेत्र कैसे मिलता है?


1
यदि आपके अंक अक्षांश और देशांतर हैं, तो नोट के रूप में, st_intersection काम नहीं करेगा। आपने निर्दिष्ट नहीं किया कि आपके पास भौगोलिक निर्देशांक थे, हालांकि यह संकेत दिया गया है क्योंकि आप मिट्टी के प्रकारों के बारे में बात कर रहे हैं।
फूरियर

जवाबों:


24

यह विधि पैकेज intersect()से फ़ंक्शन का उपयोग करती है raster। मैंने जो उदाहरण डेटा का उपयोग किया है वह आदर्श नहीं है (एक बात वे असुरक्षित निर्देशांक में हैं), लेकिन मुझे लगता है कि यह विचार भर में हो जाता है।

library(sp)
library(raster)
library(rgdal)
library(rgeos)
library(maptools)

# Example data from raster package
p1 <- shapefile(system.file("external/lux.shp", package="raster"))
# Remove attribute data
p1 <- as(p1, 'SpatialPolygons')
# Add in some fake soil type data
soil <- SpatialPolygonsDataFrame(p1, data.frame(soil=LETTERS[1:12]), match.ID=F)

# Field polygons
p2 <- union(as(extent(6, 6.4, 49.75, 50), 'SpatialPolygons'),
             as(extent(5.8, 6.2, 49.5, 49.7), 'SpatialPolygons'))
field <- SpatialPolygonsDataFrame(p2, data.frame(field=c('x','y')), match.ID=F)
projection(field) <- projection(soil)

# intersect from raster package
pi <- intersect(soil, field)
plot(soil, axes=T); plot(field, add=T); plot(pi, add=T, col='red')

# Extract areas from polygon objects then attach as attribute
pi$area <- area(pi) / 1000000

# For each field, get area per soil type
aggregate(area~field + soil, data=pi, FUN=sum)

Imgur

परिणाम:

    field soil         area
1      x    A 2.457226e+01
2      x    B 2.095659e+02
3      x    C 5.714943e+00
4      y    C 5.311882e-03
5      x    D 7.620041e+01
6      x    E 3.101547e+01
7      x    F 1.019455e+02
8      x    H 7.106824e-03
9      y    H 2.973232e+00
10     y    I 1.752702e+02
11     y    J 1.886562e+02
12     y    K 1.538229e+02
13     x    L 1.321748e+02
14     y    L 1.182670e+01

2
स्पष्ट करने के लिए: मैं raster::intersectअधिक पसंद करता हूं rgeos::gIntersectionक्योंकि पूर्व दो SpatialPolgonsDataFrameवस्तुओं के विशेषता डेटा से जुड़ता है , जबकि बाद वाला विशेषता डेटा को छोड़ देता है।
मैट एसएम

कई विवरण और सही उत्तर के लिए धन्यवाद। आपने मेरी बहुत मदद की!!!
user2386786

4
यदि आप "gIntersection" में byid = TRUE का उपयोग करते हैं, तो यह विशेषता IDS को लौटा देगा जिसका उपयोग विशेषताओं को जोड़ने के लिए मर्ज के साथ किया जा सकता है। कार्य अलग-अलग हैं और यह ध्यान दिया जाना चाहिए कि कैसे। "इंटरसेक्ट" फ़ंक्शन ओवरलैपिंग extents का उपयोग करता है, जबकि "gIntersection" वेक्टर ज्यामिति का स्पष्ट चौराहा है। प्रतिच्छेद दृष्टिकोण एक वर्ग / आयताकार चौराहा है न कि वास्तविक बहुभुजों का प्रतिच्छेदन। हद और बीबॉक्स का उपयोग करके सीमा को फिर से परिभाषित किया जा सकता है। दोनों दृष्टिकोण के फायदे हैं।
जेफरी इवांस

1
@ जेफ्री इवांस अच्छी बात फिर से gIntersection; हालाँकि, इनपुट सुविधा आईडी सीधे प्रदान नहीं की जाती हैं, उन्हें आउटपुट के फीचर आईडी में समाहित और संग्रहीत किया जाता है। इसका मतलब आईडी को पार्स करने के अतिरिक्त चरण हैं, फिर विशेषताओं में शामिल होना। मैं raster::intersectइन इनपुट आईडी को आउटपुट में अतिरिक्त विशेषताओं के रूप में शामिल करना चाहता हूं ।
मैट एसएम

1
यह इंगित करने के लिए धन्यवाद, मैं पूरी तरह से intersect_sp से चूक गया। दिलचस्प है, यह gIntersects का उपयोग करता है। यदि आप विशेषताओं में शामिल होना चाहते हैं तो अच्छा शॉर्ट कट।
जेफरी इवांस

24

यहां नए sfपैकेज का उपयोग करते हुए एक वैकल्पिक तरीका है , जो प्रतिस्थापित करने के लिए है sp। सब कुछ बहुत क्लीनर है, और पाइप के अनुकूल:

library(sf)
library(tidyverse)

# example data from raster package
soil <- st_read(system.file("external/lux.shp", package="raster")) %>% 
  # add in some fake soil type data
  mutate(soil = LETTERS[c(1:6,1:6)]) %>% 
  select(soil)

# field polygons
field <- c("POLYGON((6 49.75,6 50,6.4 50,6.4 49.75,6 49.75))",
        "POLYGON((5.8 49.5,5.8 49.7,6.2 49.7,6.2 49.5,5.8 49.5))") %>% 
  st_as_sfc(crs = st_crs(soil)) %>% 
  st_sf(field = c('x','y'), geoms = ., stringsAsFactors = FALSE)

# intersect - note that sf is intelligent with attribute data!
pi <- st_intersection(soil, field)
plot(soil$geometry, axes = TRUE)
plot(field$geoms, add = TRUE)
plot(pi$geometry, add = TRUE, col = 'red')

# add in areas in m2
attArea <- pi %>% 
  mutate(area = st_area(.) %>% as.numeric())

# for each field, get area per soil type
attArea %>% 
  as_tibble() %>% 
  group_by(field, soil) %>% 
  summarize(area = sum(area))

यहाँ छवि विवरण दर्ज करें

   field  soil      area
   <chr> <chr>     <dbl>
1      x     A  24572264
2      x     B 209573036
3      x     C   5714943
4      x     D  76200409
5      x     E  31015469
6      x     F 234120314
7      y     B   2973232
8      y     C 175275520
9      y     D 188656204
10     y     E 153822938
11     y     F  11826698
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.