L'erreur d'auto-intersection «TopologyException: Input geom 1 is invalid» qui provient de géométries de polygones invalides a été largement discutée. Cependant, je n'ai pas trouvé de solution pratique sur le Web qui repose uniquement sur la fonctionnalité R.
Par exemple, j'ai réussi à créer un objet «SpatialPolygons» à partir de la sortie de la map("state", ...)
suite de la belle réponse de Josh O'Brien ici .
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)
Le problème avec cet ensemble de données largement appliqué est maintenant que l'auto-intersection se produit au point indiqué ci-dessous.
rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
Self-intersection at or near point -122.22023214285259 38.060546477866055
Malheureusement, ce problème empêche toute autre utilisation de «spydf_states», par exemple lors de l'appel rgeos::gIntersection
. Comment puis-je résoudre ce problème depuis R?
r
polygon
rgeos
self-intersection
fdetsch
la source
la source
plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))
vous verrez qu'il n'y a pas "apparemment" à ce sujet - il y a une auto-intersection.Réponses:
L'utilisation d'un tampon de largeur nulle nettoie de nombreux problèmes de topologie dans R.
Cependant, travailler avec des coordonnées lat non projetées peut provoquer des
rgeos
avertissements.Voici un exemple étendu qui reprojete d'abord une projection d'Albers:
la source
gBuffer
"hack" fonctionne?sf
vous pouvez également utilisersf::st_buffer(x, dist = 0)
PostGIS