Powszechnie dyskutowano na temat błędu własnego przecięcia „TopologyException: Input geom 1 is invalid”, który wynika z nieprawidłowych geometrii wielokątów. Jednak nie znalazłem w Internecie wygodnego rozwiązania, które opierałoby się wyłącznie na funkcjonalności R.
Na przykład, udało mi się utworzyć obiekt 'SpatialPolygons spacerem od wyjścia map("state", ...)
po miłą odpowiedź Josh O'Briena tutaj .
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)
Problem z tym szeroko stosowanym zestawem danych polega na tym, że samo-przecięcie występuje w punkcie podanym poniżej.
rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
Self-intersection at or near point -122.22023214285259 38.060546477866055
Niestety ten problem uniemożliwia dalsze użycie „spydf_states”, np. Podczas dzwonienia rgeos::gIntersection
. Jak mogę rozwiązać ten problem z poziomu R?
r
polygon
rgeos
self-intersection
fdetsch
źródło
źródło
plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))
zobaczysz, że nie ma w tym „pozornie” - istnieje skrzyżowanie.Odpowiedzi:
Użycie bufora o zerowej szerokości usuwa wiele problemów topologicznych w R.
Jednak praca z nieprojektowanymi współrzędnymi długości może powodować generowanie
rgeos
ostrzeżeń.Oto rozszerzony przykład, który najpierw przestawia się na projekcję Albersa:
źródło
gBuffer
„hack”?sf
, możesz także użyćsf::st_buffer(x, dist = 0)
PostGIS