Contando polígonos sobrepostos de um Shapefile usando o ArcGIS Desktop?

10

Eu tenho um shapefile com 16.400 polígonos. Cada polígono mostra a expansão de uma espécie de ave para o mundo inteiro.

insira a descrição da imagem aqui

Agora eu tenho que contar os polígonos sobrepostos. Eu tentei com união e dissolvi (conte a união), mas a união não está funcionando para tantos polígonos.

Então tentei cortar continentes, mas isso também não está funcionando devido ao grande número de polígonos. Além disso, tentei esse método , também sem sucesso.

Portanto, estou perguntando a você que há uma maneira de contar polígonos sobrepostos se 16400 polígonos estiverem em um shapefile?

Estou trabalhando com 10.0 e posso trabalhar com 10.2. Uma solução ArcPy também é maravilhosa.

No momento, estou pensando em criar uma rede de pesca e iterar sobre as linhas do shp com os polígonos 16400 e escrever 1 em um campo de valor de uma célula da rede de pesca se o polígono estiver nessa célula e depois na próxima linha (polígono) e se isso também estiver na contagem de células da rede de pesca +1.

Mas não sei se essa é uma boa solução e como realizá-la. Ou eu tenho que aprender R para usar essa abordagem.

O resultado: deve ser uma forma em que você tenha novos polígonos fora dos sobrepostos e um campo em que as sobreposições sejam contadas.

Portanto, no final, deve haver um arquivo de forma, onde você pode ver quantas espécies de aves são encontradas no mesmo local.

Nora
fonte
seu problema é um problema devido ao tamanho do seu conjunto de dados. As respostas (e o link que você propõe) estão corretas, mas você terá problemas de memória. Talvez você possa primeiro tentar integrar seus dados com algumas centenas de metros (com base na precisão esperada) para evitar a criação de bilhões de polígonos de fita. Certifique-se de trabalhar em uma cópia para porque ela modificará seus dados.
radouxju
1
Divida nosso arquivo de forma em arquivos de forma regionais, execute a análise nos arquivos de forma regionais e depois dissolva-os para obter o arquivo completo novamente.
til_b
Tentei recortar essa forma com apenas um país, mas recebi o erro 999999 de volta.
Nora
1
Você já olhou a ferramenta Dados para reduzir a complexidade de seus polígonos? Além disso, se você estiver recebendo um erro 999999 apenas tentando recortar seus dados, tentou a ferramenta de verificação de geometria para verificar se há algum insight?
Hornbydd
2
Fiz uma verificação parcial da geometria dos dados e há muitas auto-interseções. Eu sugiro 1. Garanta o uso máximo da RAM e o arquivo de paginação grande 2. geometria de reparo 3. Se necessário, simplifique polígonos 3. subconjunto de dados em 1 / 3s ou 1 / 4s (ou o que for necessário) 4. Execute o fluxo de trabalho Union-Dissolve-Rasterize como nesta resposta 5. Soma os rasters.
Cotton.Rockwood

Respostas:

9

Eu recomendaria o uso da ferramenta Count Overlapping Features (Analysis) .

Gera recursos sobrepostos planarizados a partir dos recursos de entrada. A contagem de recursos sobrepostos é gravada nos recursos de saída.

insira a descrição da imagem aqui

Aaron
fonte
Eu também tentei isso, e não está funcionando para o meu shp (muito grande). obrigado por responder
Nora
1
@ Aaron o link está morto. Agora existe esta implementação no Pro: pro.arcgis.com/en/pro-app/tool-reference/analysis/…
Albert
1
Obrigado @Albert, a postagem foi atualizada com base em suas recomendações.
Aaron
5

Usando tokens de geometria arcpy, você pode tentar algo como isto:

insira a descrição da imagem aqui

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 os dados de amostra acima, o código retornará as seguintes contagens de sobreposição: insira a descrição da imagem aqui

O código como está retornará apenas contagens para polígonos que tenham pelo menos uma sobreposição.

Nxaunxau
fonte
@ Nxau: Ok, acho que cometi um erro ao explicar como o resultado deveria ser. Deve ser uma forma em que você tenha novos polígonos fora dos sobrepostos. Por exemplo, na sua foto, os círculos 4 e 5 estão sobrepostos. A nova forma deve ter três polígonos. (A Union não está trabalhando para essa grande forma). A área sobreposta deve ter o valor 2 em um campo e o restante dos círculos 4 e 5 deve ter o valor 1 nesse campo. Portanto, no final, deve haver um arquivo de forma, onde você pode ver quantas espécies de aves são encontradas no mesmo local. Obrigado pelo seu script!
Nora
5

Um método muito simples é:

  1. União do shapefile consigo mesmo;
  2. Converta saída multipartes em peça única ;
  3. Use a ferramenta de junção espacial para contar sobreposições (use a opção de correspondência ARE_IDENTICAL_TO);
  4. Simbolize usando o join_countcampo

insira a descrição da imagem aqui

user2856
fonte
1

Acho que você tentou este método: Contar e rasterizar sobreposições de polígono no ArcGIS Desktop?

16.400 polígonos não são muitos. No entanto, uma solução potencial é simplesmente fazer uma junção espacial regular. Na ArcMap toolbox, > Analysis Tools -> Overlap -> Spatial Join.

Defina os recursos targete joinpara o mesmo conjunto de dados e especifique uma saída. Deixe o restante das configurações.

Após alguns instantes, você deve recuperar um arquivo shapefile que contém uma coluna "contagem de junção". Subtraia 1 disso (como obviamente cada recurso deve se cruzar), e esse deve ser o número de "sobreposições" (na verdade se cruzam) para cada polígono.

Acabei de realizar

GIS-Jonathan
fonte
Sim, eu já tentei a abordagem no link. Mas usar a união é impossível para esse shp. Tentando a junção espacial, recebi de volta: ERRO 000426: Memória insuficiente.
Nora
Estou rodando em uma máquina com apenas 4 GB de RAM e tinha cerca de 5 vezes mais recursos, por isso estou surpreso que ele não esteja funcionando com um número muito menor. Você pode ter muitos vértices em seus dados (o meu tinha cerca de 60 MB; qual é o tamanho do seu arquivo .shp?). Tente generalizá-lo.
GIS-Jonathan
Se apenas o shp estiver em um fgdb, o fgdb terá 1,73 GB. Em uma pasta, a forma possui 2,00 GB.
Nora
Eu também usei esse conjunto de dados e acho que muitos dos problemas surgem porque muitos dos polígonos têm muitas partes. Isso, em conjunto com a resolução, torna essa tarefa muito intensiva em memória.
Cotton.Rockwood
@ Cotton.Rockwood: E você encontra a solução em R, certo? Penso em usar a caixa de ferramentas 'Count Overlapping Polygons' com a entrada de 500 polígonos (33 seleções) do que polígono para rasterizar com o valor "join count" e no final calcular raster (ModelBuilder). Demora muito tempo ...
Nora
1

Eu baixei e experimentei a ferramenta "Count Overlapping Polygons". Pode funcionar, mas leva muito tempo (provavelmente devido ao tamanho do arquivo, mas o meu FC de entrada tinha apenas <5.000 registros).

Enquanto esperava a execução da ferramenta, abri outra janela do ArcMap e foram necessários apenas alguns passos rápidos para conseguir o que eu queria. 1) Junção espacial - usando a mesma classe de recurso que os recursos de destino e junção e selecionando a opção "Unir um a muitos". 2) Dissolver - usando a saída da última etapa. Use o "TARGET_FID" como o campo de dissolução e, para as estatísticas, você pode somar o campo "Join_Count" ou COUNT o campo "JOIN_FID". 3) No arquivo de saída da etapa 2, use a calculadora de campo subtrair 1 do campo de estatísticas ("SUM_Join_Count" ou "COUNT_JOIN_FID") - pois cada recurso se cruza.

Sugiro usar esse método na ferramenta "Count Overlapping Polygon". Comecei a executar a ferramenta COP ~ 5 min antes de iniciar este método Join-> Dissolve e isso me deu o resultado com tempo suficiente para escrevê-lo antes que a ferramenta "Count Overlapping Polygon" tivesse terminado.

Espero que isto ajude!

Brian em Buffalo
fonte