Tengo un gran archivo de formas que contiene todos los edificios y casas de la ciudad en la que trabajo (aproximadamente 90,000 características). Los ingenieros de topografía de la ciudad guardan los datos de los edificios / casas y, debido a las malas prácticas y al acceso de diferentes topógrafos a esos datos, muchos edificios / casas se han guardado dos veces y aparecen en el mapa como duplicados.
Algunos de ellos están exactamente duplicados (aparecen uno sobre el otro) mientras que otros están duplicados con un espacio entre los dos objetos (como un objeto está dentro del otro, vea la captura de pantalla adjunta).
Quiero limpiar esos datos para tener solo los edificios / casas correctos en la ciudad, así que mi pregunta es:
¿Hay algún análisis SIG o expresión SQL que pueda ejecutar para encontrar todas las características duplicadas (tanto las exactas como las que se encuentran dentro de otras)? Tengo ArcGIS y QGIS, así que estoy abierto a todas sus sugerencias.
Respuestas:
en QGIS, el complemento de Comprobador de topología puede resolver su problema de manera propagable
fuente
Usaría las herramientas iterativas de Python y un SearchCursor para una forma muy eficiente de encontrar las relaciones espaciales que busca. Puede incorporar los métodos de geometría
overlaps
,contains
yequal
para llegar a las propiedades de la geometría.Comience creando una función para organizar mejor el flujo de trabajo y para la repetibilidad
def findOverlaps(x):
Abra un cursor de búsqueda para recorrer la geometría de entidad individual
with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
se usa
itertools.combinations()
para devolver subsecuencias de elementos de la entrada iterablecur
for feature1,feature2 in itertools.combinations(cur, 2):
Accede a las propiedades de la geometría con los métodos siguientes:
equals()
,overlaps()
, ycontains()
. Estos se configuran en una secuencia lógica: puede ajustar esto para cumplir sus objetivos específicos si es necesario.Ejecutarlo...
enter code here
findOverlaps (fc)La captura de pantalla muestra una variedad de características que se superponen, se superponen y son idénticas y únicas.
fuente
Tengo una idea de lo que puede funcionar para ti. Se basará en algunos supuestos, pero ayudaría a reducir su lista de posibles características idénticas. Este no sería un proceso automatizado, pero requeriría mirar manualmente los duplicados. Según los comentarios, parece que las herramientas automatizadas no comparan atributos, por lo que esto lo ayudaría a no eliminar características de forma accidental.
Usando ArcMap
(1) Haga una copia de su shapefile en caso de que las cosas salgan mal.
(2) Agregue una columna a su shapefile como doble.
(3) Calcule el área para cada entidad utilizando el formato más descriptivo (más preciso) que pueda. Algo donde el redondeo puede no ser un problema.
(4) Ejecute un resumen (resumen) en esa columna. Asegúrese de seleccionar un identificador único en el resumen y marque el primero y el último.
(5) En su mesa de salida, busque los registros en los que el recuento de campo es mayor que 1.
(6a) Verifique manualmente las características y repita el proceso hasta que no haya más duplicados.
(6b) Podría crear una lista de esos identificadores únicos y eliminar las características a través de arcpy, pero tiene la posibilidad de tener dos características no idénticas con la misma área.
Otra técnica usando ArcPy
Mientras estaba construyendo la respuesta anterior, pensé en la posibilidad de que de alguna manera los múltiples autores de estos datos pudieran haber utilizado los mismos identificadores únicos para características duplicadas. Si ese es el caso, puede encontrar duplicados a través de bucles en arcpy.
La forma en que pensaría hacer esto usando ArcPy podría ser gravoso para su sistema y tomar un poco.
(1) Haga una copia de su archivo de forma (en caso de que vuelva)
(2) Agregue una nueva columna para denotar duplicados. Algo que toma como una 'y' o 'n' o 0 o 1 o lo que sea que funcione.
(3) Cree una lista en python para almacenar el identificador único.
(4) Ejecute un cursor de actualización (
arcpy.UpdateCursor('LAYERNAME')
). Para cada registro, verifique su lista para ver si contiene ese identificador y marque su columna en busca de duplicados si está allí.(5) Luego puede comparar o hacer lo que quiera con esas columnas marcadas.
Probablemente hay mejores maneras de hacer estas comparaciones, pero creo que deberían funcionar o, al menos, comenzar.
Editar
Según el comentario de elrobis , puede utilizar el rectángulo de límite mínimo para disminuir aún más la posibilidad de eliminar características incorrectas.
Con ArcMap, puede ejecutar la herramienta Geometría de límite mínimo en Gestión de datos. Después de verificar las opciones, creo que usar la opción CONVEX_HULL probablemente sería lo mejor.
Si compara los campos MBG_APodX / Y1 , MBG_APod_X / Y2 junto con MBG_Orientation para duplicados, debería poder tener una buena idea de las características duplicadas. Sugeriría usar el método de resumen que describí anteriormente para comparar. Elija uno de los vértices (coordenadas) del rectángulo delimitador para encontrar duplicados. Puede obtener algunas "coincidencias" incidentales, pero una vez que agregue los otros vértices más orientación, sería una apuesta bastante segura que las características de resultados son duplicados.
Aunque no lo he usado y no estoy muy seguro de los resultados de esta herramienta, es posible que le resulte más fácil examinar el archivo de forma resultante si usa la herramienta Resumen de estadísticas en ArcMap. Parece que puede resumir varias columnas de esa manera en lugar de mi opción de columna única.
No creo que haya una forma completamente automática de hacer esto sin tener la preocupación de la posibilidad de eliminar una función no duplicada. Sin embargo, estos métodos deberían ayudar a limitar la cantidad de características que necesitaría revisar manualmente.
fuente
Puede hacer esto en SQL utilizando una autounión espacial. No indica qué dialecto SQL está utilizando, por lo que este ejemplo usa Postgres / Postgis, pero podría adaptarse fácilmente a Oracle o SQL Server. Suponiendo una tabla llamada edificios, con geometría almacenada en una columna llamada geom:
Esto encontrará las intersecciones. Si desea igualdad total, reemplace ST_Intersects con ST_Equals. O simplemente combine los dos:
Tenga en cuenta que a.id <b.id significa que solo considera la mitad de los casos en la autounión, lo que hace que a) sea más rápido yb) le proporcione una lista que puede usar para eliminar la mitad de los polígonos superpuestos sin eliminarlos todos . Claramente, esto sigue siendo un algoritmo O (n²), pero en la práctica, será mucho más rápido si tiene un índice espacial, lo cual es realmente un requisito total para cualquier conjunto de datos no trivial.
Es posible que necesite masajear esto un poco para que se ajuste a alguna definición de superposición: no desea eliminar las casas vecinas que han sido mal inspeccionadas.
fuente
a.rowid
lugar dea.id
.rowid
es una palabra clave en SQLite que le dará la ID interna del conjunto de datos.El complemento Comprobador de topología es una buena herramienta si se usa correctamente. Todavía tiene que tener una comprensión fundamental de sus datos Y tiene que hacer las 'correcciones' manualmente. El complemento resaltará lo que cree que son errores. Depende de usted examinar cada uno y tomar la decisión adecuada para usted y sus datos. Con 90 000 artículos en tu capa, ¡puedes estar en casa en Navidad!
fuente