TopologyException प्राप्त करना: इनपुट जियोम 1 अमान्य है जो R में स्व-प्रतिच्छेदन के कारण है?


24

'टोपोलॉजीएक्सैसेप्शन: इनपुट जियोम 1 अमान्य है' स्व-प्रतिच्छेदन त्रुटि जो अवैध बहुभुज ज्यामिति से उत्पन्न होती है, पर व्यापक रूप से चर्चा की गई है। हालाँकि, मुझे वेब पर एक सुविधाजनक समाधान नहीं मिला है जो केवल R कार्यक्षमता पर निर्भर करता है।

उदाहरण के लिए, मैं यहाँmap("state", ...) जोश ओ'ब्रायन के अच्छे उत्तर के अनुसरण के आउटपुट से एक 'स्पैटियलपॉलिगोन्स' ऑब्जेक्ट बनाने में कामयाब रहा ।

library(maps)
library(maptools)

map_states = map("state", fill = TRUE, plot = FALSE)

IDs = sapply(strsplit(map_states$names, ":"), "[[", 1)
spydf_states = map2SpatialPolygons(map_states, IDs = IDs, proj4string = CRS("+init=epsg:4326"))

plot(spydf_states)

राज्यों

व्यापक रूप से लागू डेटासेट के साथ समस्या अब यह है कि स्व-प्रतिच्छेदन नीचे दिए गए बिंदु पर होता है।

rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
  Self-intersection at or near point -122.22023214285259 38.060546477866055

दुर्भाग्य से, यह समस्या 'spydf_states' के किसी भी आगे के उपयोग को रोकती है, जैसे कॉल करते समय rgeos::gIntersection। मैं R के भीतर से इस मुद्दे को कैसे हल कर सकता हूं?


1
यदि आप उस बिंदु के आसपास ज़ूम इन करते हैं: plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))आप देखेंगे कि इसके बारे में कोई "उचित रूप से" नहीं है - एक आत्म-प्रतिच्छेदन है।
— स्पेसमैन

जवाबों:


39

शून्य-चौड़ाई के बफर का उपयोग आर में कई टोपोलॉजी समस्याओं को साफ करता है।

spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)

हालांकि असंसाधित अव्यक्त-लंबे निर्देशांक के साथ काम rgeosकरने से चेतावनी फेंकने का कारण हो सकता है।

यहां एक विस्तारित उदाहरण दिया गया है जो पहले एक अल्बर्स प्रोजेक्शन को रिप्रेजेंट करता है:

library(sp)
library(rgeos)

load("~/Dropbox/spydf_states.RData")

# many geos functions require projections and you're probably going to end
# up plotting this eventually so we convert it to albers before cleaning up
# the polygons since you should use that if you are plotting the US
spydf_states <- spTransform(spydf_states, 
                            CRS("+proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96"))

# simplify the polgons a tad (tweak 0.00001 to your liking)
spydf_states <- gSimplify(spydf_states, tol = 0.00001)

# this is a well known R / GEOS hack (usually combined with the above) to 
# deal with "bad" polygons
spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)

# any bad polys?
sum(gIsValid(spydf_states, byid=TRUE)==FALSE)

## [1] 0

plot(spydf_states)

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


4
कोई अतिरिक्त टिप्पणी / पढ़ना gBuffer"हैक" क्यों काम करता है?
— माइकलचिरिको

क्या आप gSimplify का उपयोग करना चाहते हैं क्योंकि यह data.frame को फाड़ देता है और SPDF को स्थानिक बोगन ऑब्जेक्ट में बदल देता है?
— 11

5
यदि आप उपयोग कर रहे हैं तो आप sfभी उपयोग कर सकते हैंsf::st_buffer(x, dist = 0)
— फिल

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