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.