Der "TopologyException: Input Geom 1 is invalid" -Selbstschnittfehler, der sich aus ungültigen Polygongeometrien ergibt, wurde ausführlich erörtert. Im Internet habe ich jedoch keine bequeme Lösung gefunden, die sich ausschließlich auf die R-Funktionalität stützt.
Zum Beispiel habe ich es geschafft, ein 'SpatialPolygons'-Objekt aus der Ausgabe von map("state", ...)
Josh O'Briens netter Antwort hier zu erstellen .
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)
Das Problem mit diesem weit verbreiteten Datensatz besteht nun darin, dass die Selbstüberschneidung an dem unten angegebenen Punkt auftritt.
rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
Self-intersection at or near point -122.22023214285259 38.060546477866055
Leider verhindert dieses Problem die weitere Verwendung von 'spydf_states', zB beim Aufruf rgeos::gIntersection
. Wie kann ich dieses Problem in R lösen?
r
polygon
rgeos
self-intersection
fdetsch
quelle
quelle
plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))
Sie feststellen, dass es keinen "scheinbaren" Umstand gibt - es gibt eine Selbstüberschneidung.Antworten:
Die Verwendung eines Puffers mit der Breite Null beseitigt viele Topologieprobleme in R.
Das Arbeiten mit nicht projizierten Längenkoordinaten kann jedoch
rgeos
zu Warnungen führen.Hier ist ein erweitertes Beispiel, das zuerst auf eine Albers-Projektion projiziert:
quelle
gBuffer
"Hack" funktioniert?sf
, können Sie auchsf::st_buffer(x, dist = 0)
PostGIS