आर में बहुभुज परत का उपयोग करके बहुभुज परत का एक वास्तविक जीआईएस क्लिप कैसे प्रदर्शन करें?


16

मैं एकल पॉलीगनों की एक श्रृंखला का उपयोग करके मिट्टी के बहुभुजों के आर में एक सच्चा जीआईएस क्लिप करना चाहता हूं, लेकिन मैं इसे ठीक से करने के लिए एक आर फ़ंक्शन नहीं पा सकता हूं। यह clipईएसआरआई के आर्कप्स में फ़ंक्शन की तरह काम करना चाहिए । मैंने पैकेज overमें विधि की कोशिश की है, spलेकिन यह पोल पर पोल के लिए काम नहीं करता है।

एक सुझाव पैकेज gIntersectionमें rgeosपैकेज का उपयोग निम्नलिखित कोड का उपयोग करने के लिए किया गया था:

#------------------------------------
library(rgeos)
library(maptools)

#Read layers as SpatialPolygonsDataFrame (both the same Albers projection)
Soils_poly = readShapePoly("Soils_polygons")  #Note - Has 400 polygons
clipper_poly = readShapePoly("clipper_polygon")  #Note - Has 1 polygon

#Try gintersection as clip 
Clipped_polys = gIntersection(Clipper_Tile_poly, Soils_poly)

#-----------------------------------

इसे चलाने में 5 मिनट लगते हैं (रास्ता बहुत धीमा) और इसके साथ त्रुटियां:

RGEOSBinTopoFunc (spgeom1, spgeom2, byid, id, drop_not_poly, "rgeos_intersection") में त्रुटि: टोपोलॉजीException: कोई आउटगोइंग dEEdge at -721459.7761285271 2009506.598087708989

मैंने इस कोड को ओवरलैप के लिए जाँचने का भी प्रयास किया:

gIntersects(Clipper_Tile_poly, Soils_poly)

और परिणाम TRUE था। clipESRI ArcMap में फ़ंक्शन इस डेटा के लिए ठीक काम करता है।

किसी को भी एक आर फ़ंक्शन के बारे में पता है कि स्थानिक बहुभुज का उपयोग करके स्थानिक बहुभुजों पर एक क्लिप ठीक से करना है?


बायड = TRUE के साथ इंट्रैक्शन की कोशिश करें (मुझे लगता है कि यह कुछ क्लिप के लिए लटकन टोपोलॉजी के साथ एक समस्या है, और कभी-कभी इसे इस तरह से करने में मदद करता है), स्पीड के लिए gUnarySTRtreeQuery () या gBinarySTRtreeQuery () पॉलीगोन के जोड़े के बाउंडिंग बक्सों की पहचान करने के लिए (केवल) उन जोड़ों को काटना। इस afaik के सभी के लिए कोई आसान उच्च-स्तरीय रैपर नहीं है
mdsumner

जवाबों:


20

byid=TRUEकाम का उपयोग करने के @mdsummer द्वारा प्रदान किए गए संकेत सही हैं।

नीचे दिए गए प्रतिलिपि योग्य उदाहरण देखें:

library(rgeos)
library(sp)

#Create SpatialPlygons objects
polygon1 <- readWKT("POLYGON((-190 -50, -200 -10, -110 20, -190 -50))") #polygon 1
polygon2 <- readWKT("POLYGON((-180 -20, -140 55, 10 0, -140 -60, -180 -20))") #polygon 2

par(mfrow = c(1,2)) #in separate windows
plot(polygon1, main = "Polygon1") #window 1
plot(polygon2, main = "Polygon2") #window 2

बहुभुज अगल-बगल

polygon_set <- readWKT(paste("POLYGON((-180 -20, -140 55, 10 0, -140 -60, -180 -20),",
                     "(-190 -50, -200 -10, -110 20, -190 -50))"))

par(mfrow = c(1,1)) #now, simultaneously
plot(polygon_set, main = "Polygon1 & Polygon2")

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

clip <- gIntersection(polygon1, polygon2, byid = TRUE, drop_lower_td = TRUE) #clip polygon 2 with polygon 1
plot(clip, col = "lightblue")

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

GT <- GridTopology(c(-175, -85), c(10, 10), c(36, 18))
gr <- as(as(SpatialGrid(GT), "SpatialPixels"), "SpatialPolygons")
plot(gr)

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

clip2 <- gIntersection(clip, gr, byid = TRUE, drop_lower_td = TRUE)
plot(clip2, col = "pink")

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


1
एक सपना काम करता है - अविश्वसनीय तेजी से। मैं इस का उपयोग पॉलीइलाइन क्लिप करने के लिए कर रहा हूं। मैं ब्रिटिश नदियों के लिए शेपफाइल का सबसेट बनाना चाहता था, क्योंकि यह डेटा के एक छोटे उपसमुच्चय के साथ काम करने के लिए बहुत तेज़ है।
CJB

1
@AndreSilva, सोचा था कि मेरे पास है, लेकिन लगता है कि मैं नहीं था! पुन: समुदाय, मुझे लगता है कि R GIS डेवलपर समुदाय थोड़ा बड़ा TBH था। मुझे शायद कुछ डिजिटलीकरण, और GUI में त्वरित होने वाली अन्य प्रक्रियाओं के लिए आर्कपेक पर वापस गिरना होगा।
अमीर पॉलू

3

आप रैस्टर पैकेज का उपयोग भी कर सकते हैं raster::intersect(spdf1, spdf2)। आपके पास SpatialPolygonsDataFrame के मामले में विशेषताओं को बनाए रखने का लाभ है।

library(sp); library(rgeos)

coords1 <- matrix(c(-1.841960, -1.823464, -1.838623, -1.841960, 55.663696,
                55.659178, 55.650841, 55.663696), ncol=2)
coords2 <- matrix(c(-1.822606, -1.816790, -1.832712, -1.822606, 55.657887,
                55.646806, 55.650679, 55.657887), ncol=2)
p1 <- Polygon(coords1)
p2 <- Polygon(coords2)
p1 <- Polygons(list(p1), ID = "p1")
p2 <- Polygons(list(p2), ID = "p2")
myPolys <- SpatialPolygons(list(p1, p2))
spdf1 = SpatialPolygonsDataFrame(myPolys, data.frame(variable1 = c(232,
                                                               242), variable2 = c(235, 464), row.names = c("p1", "p2")))
coords1a <- matrix(c(-1.830219, -1.833753, -1.821154, -1.830219, 55.647353,
                 55.656629, 55.652122, 55.647353), ncol=2)
p1a <- Polygon(coords1a)
p1a <- Polygons(list(p1a), ID = "p1a")
myPolys1 <- SpatialPolygons(list(p1a))
spdf2 = SpatialPolygonsDataFrame(myPolys1, data.frame(variable1 = c(2),
                                                  variable2 = c(3), row.names = c("p1a")))

# works but drop the attributes
#gIntersection(spdf1, spdf2, byid=T)

#better to keep attributes
inter1=raster::intersect(spdf1, spdf2)

plot(spdf1, col="red")
plot(spdf2, col="yellow", add=T)
plot(inter1,col="blue", add=T)

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

इस सवाल के लिए धन्यवाद कि बाहर और नमूना कोड के लिए।

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