¿Contando polígonos superpuestos de un Shapefile usando ArcGIS Desktop?

10

Tengo un shapefile con 16,400 polígonos. Cada polígono muestra la expansión de una especie de ave para todo el mundo.

ingrese la descripción de la imagen aquí

Ahora tengo que contar los polígonos superpuestos. Lo intenté con unión y disolución (cuenta la unión), pero la unión no funciona para tantos polígonos.

Luego intenté recortar continentes, pero esto tampoco funciona debido a la gran cantidad de polígonos. Además probé este método , también sin éxito.

Por lo tanto, le pregunto si hay una manera de contar polígonos superpuestos si 16400 polígonos están en un archivo de forma.

Estoy trabajando con 10.0 y puedo trabajar con 10.2. Una solución ArcPy también es maravillosa.

En este momento estoy pensando en crear una red de pesca e iterar sobre las filas de la shp con los 16400 polígonos y escribir 1 en un campo de valor de una celda de red si el polígono está en esta celda y luego tomar la siguiente fila (polígono) y si esto también está en el recuento de células de red +1.

Pero no sé si esta es una buena solución y cómo realizarla. O tengo que aprender R para usar este enfoque.

El resultado: debe ser una forma en la que tenga nuevos polígonos de los superpuestos y un campo donde se cuenten las superposiciones.

Por lo tanto, al final debe haber un archivo de forma en el que pueda ver cuántas especies de aves se encuentran en el mismo lugar.

Nora
fuente
su problema es un problema debido al tamaño de su conjunto de datos. Las respuestas (y el enlace que propone) son correctas, pero tendrá problemas de memoria. Tal vez podría intentar primero integrar sus datos con unos pocos cientos de metros (según la precisión esperada) para evitar la creación de miles de millones de polígonos de astilla). Asegúrese de trabajar en una copia porque modificará sus datos.
radouxju
1
Divida nuestro archivo de forma en archivos de forma regionales, luego ejecute el análisis en los archivos de forma regionales, luego disuélvalos para obtener el archivo completo nuevamente.
til_b
Traté de recortar esta forma con solo un país, pero recibí el error 999999.
Nora
1
¿Has mirado la herramienta Dados para reducir la complejidad de tus polígonos? Además, si recibe un error 999999 solo tratando de recortar sus datos, ¿ha probado la herramienta de verificación de geometría para ver si arroja alguna información?
Hornbydd
2
Hice una verificación parcial de Geometría en los datos y hay muchas auto intersecciones. Sugeriría 1. Asegure el uso máximo de RAM y el archivo de paginación grande 2. repare la geometría 3. Si es necesario, simplifique los polígonos 3. subconjunte los datos a 1 / 3s o 1 / 4s (o lo que sea necesario) 4. Ejecute el flujo de trabajo Union-Dissolve-Rasterize como en esta respuesta 5. Suma los rásteres.
Cotton.Rockwood

Respuestas:

9

Recomendaría usar la herramienta Contar características superpuestas (Análisis) .

Genera características superpuestas planarizadas a partir de las características de entrada. El recuento de características superpuestas se escribe en las características de salida.

ingrese la descripción de la imagen aquí

Aaron
fuente
También probé esto, y no funciona para mi shp (demasiado grande). gracias por responder
Nora
1
@ Aaron, el enlace está muerto. Ahora hay esta implementación en Pro: pro.arcgis.com/en/pro-app/tool-reference/analysis/…
Albert
1
Gracias @Albert, la publicación se ha actualizado según tus recomendaciones.
Aaron
5

Usando tokens de geometría arcpy, puedes probar algo como esto:

ingrese la descripción de la imagen aquí

import os
import arcpy

arcpy.env.workspace = r"" #path to workspace
arcpy.env.overwriteOutput = 1

polygon_fc = r"" #path to polygon fc

base = [row for row in arcpy.da.SearchCursor(polygon_fc,["OID@","SHAPE@"])]
compare = base

overlaps_stats = {}

for b in base:
    for c in compare:
        if b[1].overlaps(c[1]):
            #print "{0} overlaps {1}".format(b[0],c[0])
            if overlap_stats.has_key(b[0]):
                overlap_stats[b[0]].append(c[0])
            else:
                overlap_stats[b[0]] = [c[0]]

for key,value in overlap_stats.iteritems():
    print "Polygon {0}:  Overlaps: {1}.".format(key,len(value))

Para los datos de muestra anteriores, el código devolverá los siguientes recuentos de superposición: ingrese la descripción de la imagen aquí

El código tal como es solo devolverá los recuentos de polígonos que tengan al menos una superposición.

Nxaunxau
fuente
@ Nxau: Ok, supongo que cometí un error al explicar cómo debería ser el resultado. Debe ser una forma en la que tenga nuevos polígonos fuera de los superpuestos. Por ejemplo, en su imagen, los círculos 4 y 5 se superponen. La nueva forma debe tener tres polígonos. (Union no está trabajando para esta gran forma). El área superpuesta debe tener el valor 2 en un campo y el resto de los círculos 4 y 5 deben tener el valor 1 en este campo. Por lo tanto, al final debe haber un archivo de forma en el que pueda ver cuántas especies de aves se encuentran en el mismo lugar. Gracias por tu guion!
Nora
5

Un método muy simple es:

  1. Unión del archivo de forma consigo mismo;
  2. Convierta la salida de varias partes a una sola parte ;
  3. Use la herramienta de unión espacial para contar superposiciones (use la opción de coincidencia ARE_IDENTICAL_TO);
  4. Simbolizar usando el join_countcampo.

ingrese la descripción de la imagen aquí

usuario2856
fuente
1

Supongo que ha probado este método: ¿ Contar y rasterizar superposiciones de polígonos en ArcGIS Desktop?

16,400 polígonos no son tantos. Sin embargo, una posible solución es simplemente hacer una unión espacial regular. En el ArcMap toolbox, > Analysis Tools -> Overlap -> Spatial Join.

Establezca las características targety joinen el mismo conjunto de datos y especifique una salida. Deje el resto de la configuración.

Después de unos momentos, debería recuperar un archivo de forma que contiene una columna de "conteo de unión". Reste 1 de esto (ya que obviamente cada entidad debe intersectarse a sí misma), y ese debería ser el número de "superposiciones" (en realidad se cruza) para cada polígono.

Acabo de realizarlo en

GIS-Jonathan
fuente
Sí, ya probé el enfoque desde el enlace. Pero usar union es imposible para este shp. Al intentar la unión espacial, recuperé esto: ERROR 000426: Sin memoria.
Nora
Lo estoy ejecutando en una máquina con solo 4 GB de RAM y tenía aproximadamente 5 veces más funciones, por lo que me sorprende que no funcione con un número mucho menor. Es posible que tenga demasiados vértices en sus datos (el mío era de unos 60 MB; ¿qué tamaño tiene su archivo .shp?). Intenta generalizarlo.
GIS-Jonathan
Si solo el shp está en un fgdb, el fgdb tiene 1,73 GB. En una carpeta la forma tiene 2,00GB.
Nora
También he usado este conjunto de datos y creo que surgen muchos de los problemas porque algunos de los polígonos tienen muchas partes. Eso, junto con la resolución, hace que esta sea una tarea muy intensiva en memoria.
Cotton.Rockwood
@ Cotton.Rockwood: Y encuentras la solución en R, ¿verdad? Pienso en usar la caja de herramientas 'Contar polígonos superpuestos' con la entrada de 500 polígonos (33 selecciones) que polígono a ráster con el valor "recuento de unión" y al final calcular el ráster (ModelBuilder). Lleva mucho tiempo ...
Nora
1

Descargué y probé la herramienta "Contar polígonos superpuestos". Puede funcionar, pero lleva mucho tiempo (probablemente debido al tamaño del archivo, pero mi FC de entrada solo tenía <5,000 registros).

Mientras esperaba que se ejecutara esa herramienta, abrí otra ventana de ArcMap y solo tomé un par de pasos rápidos para obtener lo que quería. 1) Unión espacial: utilizando la misma clase de entidad que las funciones de destino y unión y seleccionando la opción "Unir uno a muchos". 2) Disolver: utilizando la salida del último paso. Use "TARGET_FID" como campo de disolución y para las estadísticas puede SUMAR el campo "Join_Count" o COUNT el campo "JOIN_FID". 3) En el archivo de salida del paso 2, use la calculadora de campo reste 1 del campo de estadísticas ("SUM_Join_Count" o "COUNT_JOIN_FID"), ya que cada entidad se intersecta.

Sugiero usar este método sobre la herramienta "Contar polígono superpuesto". Comencé a ejecutar la herramienta COP ~ 5 minutos antes de comenzar este método Unir-> Disolver y me dio el resultado con suficiente tiempo para escribir esto antes de que la herramienta "Contar polígono superpuesto" hubiera terminado.

¡Espero que esto ayude!

Brian en Buffalo
fuente