El error de auto-intersección 'TopologyException: Input geom 1 is invalid' que surge de geometrías de polígonos inválidas ha sido ampliamente discutido. Sin embargo, no he encontrado una solución conveniente en la web que se base únicamente en la funcionalidad R.
Por ejemplo, he logrado crear un objeto 'SpatialPolygons' a partir del resultado de map("state", ...)
seguir la buena respuesta de Josh O'Brien aquí .
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)
El problema con este conjunto de datos ampliamente aplicado es ahora que la auto-intersección ocurre en el punto que se indica a continuación.
rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
Self-intersection at or near point -122.22023214285259 38.060546477866055
Desafortunadamente, este problema impide el uso posterior de 'spydf_states', por ejemplo, al llamar rgeos::gIntersection
. ¿Cómo puedo resolver este problema desde R?
r
polygon
rgeos
self-intersection
fdetsch
fuente
fuente
plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))
verá que no hay "aparentemente" al respecto, hay una auto-intersección.Respuestas:
El uso de un búfer de ancho cero limpia muchos problemas de topología en R.
Sin embargo, trabajar con coordenadas lat-long no proyectadas puede provocar
rgeos
advertencias.Aquí hay un ejemplo extendido que reproyecta primero a una proyección de Albers:
fuente
gBuffer
"hack"?sf
también puede usarsf::st_buffer(x, dist = 0)
PostGIS