Estoy tratando de realizar una unión en un campo común después de fusionar dos archivos de forma adyacentes. Los archivos de forma terminan con al menos una delgada franja de espacio entre ellos. Cuando intento una unión me sale el siguiente error de orfandad:
Error en createPolygonsComment (p): rgeos_PolyCreateComment: agujero huérfano, no se puede encontrar el polígono que contiene el agujero en el índice 17
He subido un ejemplo reproducible a Dropbox en este enlace .
Aquí está el código para recrear el problema:
#loading required packages
require(sp)
require(rgdal)
require(maptools)
require(rgeos)
#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")
#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)
Devoluciones:
Error en createPolygonsComment (p): rgeos_PolyCreateComment: agujero huérfano, no se puede encontrar el polígono que contiene el agujero en el índice 17
Probar la solución propuesta aquí y aquí :
slot(example, "polygons") <- lapply(slot(example, "polygons"), checkPolygonsHoles)
Esto devuelve el mismo error que proviene del intento de unión pero con un número de índice diferente:
rgeos_PolyCreateComment: agujero huérfano, no se puede encontrar el polígono que contiene el agujero en el índice 30
Probar la solución propuesta en el útil tutorial de Roger Bivand
fix <- slot(example, "polygons")
fixa <- lapply(fix, checkPolygonsHoles)
Devuelve el mismo error en el índice 30 que el anterior.
Otros han planteado este problema aquí y aquí , y si bien las soluciones presentadas anteriormente parecen funcionar para algunos casos, otros casos no se resuelven. Un usuario usó QGIS para abordar el problema, y el otro tenía 2 de 3 elementos corregidos, pero no había una resolución para el último.
Parece que las personas continúan teniendo problemas a pesar de que este código funciona de vez en cuando. ¿Alguien ha encontrado una solución dentro de R?
He realizado la herramienta "reparar geometría" en ArcGIS, y corrigió el problema, pero parece que debería haber una solución en R.
Respuestas:
He analizado los problemas de geometría en los datos adjuntos, y parece que SÓLO no tiene
orphaned holes
sino tambiéngeometry validity issues
. Es cierto que deorphaned hole
alguna manera es un problema de validez de geometría, pero rgeos no lo maneja de la misma manera, ya que para agujeros huérfanos, se genera un error, en lugar de una simple advertencia. Como indica, son sugerencias para verificar los agujeros de polígono, pero no siempre es exitoso cuando se aplica para reparar agujeros huérfanos.Entonces vamos:
limpie sus datos (que es necesario si desea realizar un geoprocesamiento como union)
use los datos limpios con su proceso de unión
1. Geometría de limpieza La fijación de geometrías en R a veces puede ser un desafío, por lo que he intentado construir un paquete R experimental (consulte https://github.com/eblondel/cleangeo ) que tiene la intención de facilitar la limpieza de
sp
objetos (ahora limitado en formas poligonales). Puede instalar el paquete con:Para comenzar, es bueno que vea cuáles son los problemas de geometría con sus datos de origen. Para esto, puede ejecutar lo siguiente (sus datos son grandes, por lo que puede llevar algo de tiempo):
Con esto, verá que sus datos tienen 2 tipos de problemas:
orphaned holes
ygeometry validity issues
. Es probable que ambos (y no solo los agujeros huérfanos) hagan que elunion
proceso falle, por lo que los datos deben limpiarse antes, de forma automática cuando sea posible. Para una reproducción rápida, el primer código de muestra a continuación solo toma el subconjunto de características etiquetadas como sospechosas (excepto la última, con índice = 9002 en los datos originales; consulte mi nota a continuación sobre esto)Si
clgeo_Clean
hace bien el trabajo, debería obtener todas las geometrías válidas ahora. Puede aplicar esto al conjunto de datos completo (excepto el índice de características = 9002)2. Proceso de unión Ahora, veamos si
union
funciona en este conjunto de datos:Nota: como se dijo antes, eliminé una característica (índice = 9002). Al trazarla
plot(sp[9002,])
, verá que esta característica es muy (muy) compleja. Lo he excluido de la muestra solo porque verificar los agujeros tomaba demasiado tiempo. Veamos ahora si ocurre el mismo problema usandoreadShapePoly
(frommaptools
) para leer los datos ...3. Cambie a readShapePoly vs. readOGR para leer datos (ACTUALIZACIÓN)
readOGR
no es la única función disponible para leer archivos de forma. También puede usarreadShapePoly
desde elmaptools
paquete, generalmente más eficiente que el primero:Además de correr más rápido:
Si utiliza el código anterior basado en
clgeo_CollectionReport
, no hay problema de agujeros huérfanos, pero sí problemas de geometría.La limpieza de la geometría
clgeo_Clean
también funciona bien, y ahora no se atasca con el índice de características 9002Y ... el proceso sindical funciona.
Vea a continuación el resultado de la trama:
Conclusión : prefiera maptools para leer sus datos de shapefile, y considere usar cleangeo para limpiar sus datos antes de cualquier geoprocesamiento.
fuente
Una solución conveniente que sigue funcionando para mí en R es aplicar un búfer de ancho cero :
unionSpatialPolygons lleva un tiempo con este conjunto de datos, pero parece funcionar bien.
fuente