Mais

Método arcpy eficiente de pontos no polígono


Vindo de uma experiência de Mapinfo e Manifold, frequentemente me sinto frustrado com o conjunto de ferramentas ArcGIS SQL. Em ambos os programas anteriores, é trivial escrever uma consulta perguntando, por exemplo, quantos pontos estão em cada polígono. Isso pode ser filtrado usando cláusulas where, por exemplo, todos os pontos do tipo a dentro de cada polígono e, em seguida, todos os pontos do tipo b dentro de cada polígono. Como o resultado da consulta é uma tabela na memória, é rápido e usa muito pouco espaço em disco.

Por outro lado, o Spatial Join no ArcGIS parece bastante lento, possivelmente por causa do IO de disco, usa mais espaço em disco do que o necessário e, pessoalmente, acho isso complicado.

Eu sei que existem alternativas, Hawths Tools por exemplo, mas eu estava tentando fazer algo em arcpy. Meu primeiro pensamento foi percorrer cada geometria no conjunto de polígonos e no conjunto de pontos e testar se o ponto estava contido no polígono. Isso permitiria, então, calcular todos os tipos de coisas. Eu escrevi um teste que apenas percorreu todos os pontos de um polígono:

import arcpy arcpy.env.workspace = r "path  to  workspace" print "Start" geom = arcpy.Point (530000,180000) cursor = arcpy.SearchCursor ("FCName") para rowid no cursor: poly = rowid.Shape se poly.contains (geom): imprimir rowid.OBJECTID

No entanto, isso leva alguns segundos para cada polígono, portanto, com um tamanho de conjunto de dados de 4.000 polígonos, não acho que isso vá funcionar tão rápido.

Alguém tem alguma ideia para tornar isso mais eficiente ou uma função que estou perdendo?


Usar a ferramenta Intersect funcionaria para você? Cada ponto na classe de recurso resultante também teria os atributos do polígono em que está contido, e você poderia escrever um script que percorre esses pontos e calcula todas as estatísticas necessárias para cada ID de polígono (min, max, mean, sum contagem, etc.).


Você pode chamar a ferramenta de junção espacial de seu script arcpy? Talvez escreva um método de invólucro para controlar para onde vai a saída e lidar com a exclusão depois. Isso provavelmente será mais rápido do que percorrer os recursos diretamente no Arcpy.

Caso contrário, temo que o arcpy seja lento. Você poderia usar ctypes para chamar uma dll que faz a função de ponto no polígono para você, mas isso é muito mais trabalho de implementação, e você ainda tem a sobrecarga de ler recursos em primeiro lugar.


Eu sou como você. Eu sou obrigado a usar o ArcPy e no ambiente atual em que estou trabalhando, usar o SpatialJoin ou outras ferramentas ArcGIS é complicado.

Devido a outras restrições, não posso usar esta biblioteca. Dê uma olhada no Shapely, que você pode baixar usando easy_install, eu acredito.

Possui uma gama de métodos rápidos para executar as funções mais comuns e básicas. Junte isso ao shplib e você terá uma alternativa rápida e leve.


Este é um post antigo, então não estava disponível na época, mas o módulo de acesso a dados (v10.1) é super rápido e usar isso e objetos geométricos permite que você faça esse tipo de consulta mais rápido do que a caixa de ferramentas padrão. Ele é baseado em matrizes NUMPY, por isso é tão poderoso e rápido.

http://resources.arcgis.com/en/help/main/10.1/index.html#/SearchCursor/018w00000011000000/ http://resources.arcgis.com/en/help/main/10.1/index.html#/ / 018z00000070000000


Assista o vídeo: ArcGIS - Dissolve polygon layer to identify slivers or gaps between polygons (Outubro 2021).