Análisis SIG para encontrar geometrías duplicadas

9

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).

ingrese la descripción de la imagen aquí

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.

GIS_DBA
fuente
Puede intentar explorar la herramienta idéntica Eliminar . Sin embargo, requiere un nivel de licencia empresarial. Puede revisar algunas otras opciones disponibles en el Artículo técnico 36031. ¿ArcGIS proporciona una manera de identificar o eliminar entidades con geometrías duplicadas? Su mejor opción es la Extensión del revisor de datos . sin embargo
MDHald
Además, deberá tener en cuenta que los componentes tabulares no se compararán en la herramienta Eliminar idéntica. Sé que no es una respuesta, pero espero que ayude a resolver el problema.
MDHald
¿Están los datos en una base de datos? ¿Que tipo?
Russell en ISC
Una opción podría ser usar la herramienta Intersecar (como se describe en esta respuesta ) en ArcMap, que generaría cualquier ubicación de superposición. Eso requeriría verificar manualmente y decidir qué polígono eliminar, pero en el caso de duplicados no exactos, creo que debería hacerlo de todos modos.
Erica
44
El uso del término "duplicado" es un poco engañoso en esta pregunta. Para el caso de copias exactas, idénticas, apiladas, entonces sí, son (o podrían ser, los atributos pueden variar) duplicados y, como otros han sugerido, la herramienta Eliminar o Buscar idéntico podría ser útil si tiene ese nivel de licencia. Pero si están compensados ​​o tienen una forma diferente, en realidad no son duplicados per se. Si tiene una licencia avanzada, miraría una topología de geodatabase, ejecutando la verificación No debe superponerse. Sin Avanzado, tal vez se pueda hacer lo mismo con QGIS y un complemento como sugiere la respuesta de Luigi.
Chris W

Respuestas:

4

en QGIS, el complemento de Comprobador de topología puede resolver su problema de manera propagable

Luigi Pirelli
fuente
3
Estoy de acuerdo en que una topología es probablemente la mejor solución para el problema de limpiar los datos. Sin embargo, es posible que desee expandir un poco su respuesta proporcionando un enlace al complemento y una breve descripción de qué es o qué hace la topología y qué verificación ejecutará. Me temo que su respuesta tal como está escrita probablemente se marque como de baja calidad.
Chris W
ok: una descripción del complemento está aquí: docs.qgis.org/2.2/en/docs/user_manual/plugins/… y "no debe superponerse" puede abordar el problema. Una guía de video del complemento está aquí: youtube.com/watch?v=huhkTZkoKC8 .
Luigi Pirelli
6

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 , containsy equalpara llegar a las propiedades de la geometría.

  1. Comience creando una función para organizar mejor el flujo de trabajo y para la repetibilidad

    def findOverlaps(x):

  2. Abra un cursor de búsqueda para recorrer la geometría de entidad individual

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. se usa itertools.combinations()para devolver subsecuencias de elementos de la entrada iterablecur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. Accede a las propiedades de la geometría con los métodos siguientes: equals(), overlaps(), y contains(). Estos se configuran en una secuencia lógica: puede ajustar esto para cumplir sus objetivos específicos si es necesario.

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
    
  5. Ejecutarlo...

enter code herefindOverlaps (fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

ingrese la descripción de la imagen aquí

La captura de pantalla muestra una variedad de características que se superponen, se superponen y son idénticas y únicas.

ingrese la descripción de la imagen aquí

Aaron
fuente
2

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í.

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(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.

Branco
fuente
Supongo que esos eran polígonos. Si son líneas, puede usar longitud. Los puntos son más fáciles con las coordenadas X / Y.
Branco
2
También pensé en "características de área igual", pero me parece probable que las huellas de los edificios tengan suficientes tipos de formas para crear coincidencias no deseadas. Creo que mejoraría las probabilidades de refinar aún más las cosas con una intersección MBR de las características. Es decir, si tienen la misma área (y podrían ser la misma característica) Y sus MBR se cruzan, entonces es probable que sean dos generaciones de la misma característica. ¿Tiene sentido?
elrobis
2

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:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

Esto encontrará las intersecciones. Si desea igualdad total, reemplace ST_Intersects con ST_Equals. O simplemente combine los dos:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

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.

John Powell
fuente
Si le falta un atributo único en el archivo de forma, puede usarlo en a.rowidlugar de a.id. rowides una palabra clave en SQLite que le dará la ID interna del conjunto de datos.
LuWi
1

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!

Johanna
fuente