O erro de auto-interseção 'TopologyException: Input geom 1 is invalid' que surge de geometrias de polígonos inválidas foi amplamente discutido. No entanto, não encontrei uma solução conveniente na Web que dependa apenas da funcionalidade R.
Por exemplo, eu consegui criar um objeto 'SpatialPolygons' a partir da saída da map("state", ...)
boa resposta de Josh O'Brien aqui .
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)
O problema com esse conjunto de dados amplamente aplicado é agora que a auto-interseção ocorre no ponto fornecido abaixo.
rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
Self-intersection at or near point -122.22023214285259 38.060546477866055
Infelizmente, esse problema impede qualquer uso adicional de 'spydf_states', por exemplo, ao chamar rgeos::gIntersection
. Como posso resolver esse problema no R?
r
polygon
rgeos
self-intersection
fdetsch
fonte
fonte
plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))
verá que não há "aparentemente" a respeito - há uma auto-interseção.Respostas:
Usar um buffer de largura zero limpa muitos problemas de topologia em R.
No entanto, trabalhar com coordenadas de longo prazo não projetadas pode causar
rgeos
avisos.Aqui está um exemplo estendido que reprojeta primeiro uma projeção de Albers:
fonte
gBuffer
"hack" funciona?sf
você também pode usarsf::st_buffer(x, dist = 0)
PostGIS