Selecionando o polígono do ArcSDE por ponto no ArcGIS Desktop usando o ArcPy?


15

Eu continuo pensando que devo estar faltando alguma coisa, mas não parece haver uma ferramenta no ArcGIS 10 para selecionar recursos (em particular polígonos) de uma camada em um ponto (X, Y) no ArcPy. Os parâmetros para essa ferramenta seriam apenas um nome de camada e um local XY.

No momento, eu resolvo isso criando uma classe de recurso de ponto que contém o ponto e executando um SelectLayerByLocation nele. No entanto, quando a classe de recurso de polígono está no Oracle (acessada via ArcSDE 9.x) e contém 3,5 milhões de polígonos, o tempo necessário para fazer a seleção pode ser superior a 5 minutos quando penso que um segundo ou dois (com menos código) seria mais apropriado. A classe feature tem um índice espacial e tentei usar o arcpy.env.extent (que SelectLayerByLocation parece ignorar) para restringir a área geográfica acessada, mas o desempenho permanece muito baixo.

Existe uma maneira mais rápida de fazer isso usando o ArcGIS Desktop 10 e o ArcPy?


Existe agora uma solução para este cargo no forums.arcgis.com/threads/... e eu vou editar essas informações em aqui mais tarde hoje - muitos agradecimentos vão para Jason Scheirer e Chris Snyder
PolyGeo

2
Apenas como observação, é possível encontrar os ambientes respeitados por uma ferramenta na parte inferior da página de referência da ferramenta. O SelectByLocation honra apenas o espaço de trabalho atual e o sistema de coordenadas de saída. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…
blord-castillo

Respostas:


9

Outra abordagem para isso seria usar a ferramenta Spatial Join. Use o ponto como sua camada de recurso de entrada como acima e a camada de polígono como seus recursos de identidade.
Ao contrário SelectLayerByLocation, SpatialJoin faz honrar o ambiente medida.

targetlayer = layername
joinlayer=arcpy.PointGeometry(arcpy.Point(x, y))
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(targetlayer)
arcpy.SpatialJoin_analysis(targetlayer, joinlayer, outputlayer, "JOIN_ONE_TO_MANY", "KEEP_COMMON", fieldmappings)

JOIN_ONE_TO_MANY pode parecer contra-intuitivo, mas como você tem apenas um recurso de junção, a principal função dessa opção é desativar as regras de agregação e mesclagem. KEEP_COMMON garantirá que sua saída seja restrita apenas ao polígono que cruza seu ponto. O Fieldmappings restringirá os atributos de saída apenas à forma e aos atributos da camada de polígono; o padrão incluiria também os atributos da camada de ponto.

O restante dos padrões funcionará bem, portanto, você pode deixar de fora os argumentos restantes.


Muito obrigado por este código, que continha algumas técnicas que eu não havia tentado. Eu já havia experimentado o SpatialJoin (para que eu pudesse ter o ambiente de geoprocessamento respeitado), mas esse teste, assim como um teste de sua técnica, ainda me deixaram com 4-5 minutos de resposta em comparação com 10 a 12 segundos. Chris Snyder me levou para.
PolyGeo

Você já experimentou a técnica de Chris Snyder com SpatialJoin também? Eu acho que a principal razão pela qual a técnica do buffer é tão rápida é que ela usa uma cópia na memória da classe polygon. A seleção por local deve ser mais rápida que a junção espacial, mas não tenho certeza.
Blord-castillo

Acabou não usando o bit in_memory. Já estava tão acelerado que eu mantive isso em reserva. Acho que o principal foi definir a extensão para obter os um / poucos polígonos (de 3,5 milhões), nos quais eu precisava verificar o X, Y, rapidamente copiado em um geodatabase de arquivo local. Então, fazer essa parte antes do SpatialJoin acho que levaria à mesma / similar melhoria de desempenho.
PolyGeo

1

Acabei de perceber uma coisa ...

Se você estiver usando isso para implementar um Serviço de Geoprocessamento, também poderá implementar um Serviço de Recurso com sua camada de polígono e usar a operação Consulta no serviço de recurso.

Você pode usar um local XY simples com a operação Consulta ao Serviço de Recursos, bem como controlar os atributos de saída, incluindo a forma.

Você pode ter restrições sobre o quanto pode expor a classe de recurso do polígono, mas se você já o está tornando acessível ao serviço de geoprocessamento, também poderá criar um serviço de recurso.


Esse é um pensamento útil para atender a outros requisitos, mas, nesse caso, o aplicativo cliente é muito simples e está fora de meu controle, portanto, só posso fornecer um Serviço de Geoprocessamento.
PolyGeo

Achei que poderia haver uma restrição ao uso de qualquer coisa que não fosse um Serviço de Geoprocessamento :) Ironicamente, acho que um Serviço de Recursos é uma rota muito mais simples de implementar e manter. Isso também pode explicar por que a funcionalidade desejada não está disponível; você já pode fazer isso em todos os níveis de aplicação. Certifique-se de enviar uma solicitação à ESRI para implementá-la como uma ferramenta na próxima versão.
Blord-castillo 8/08

1

Esta resposta veio dos antigos fóruns de discussão do ArcGIS .

Obrigado Jason Scheirer por um código mais conciso:

SelectLayerByLocation(in_layer=arcpy.PointGeometry(arcpy.Point(x, y)), select_features="mylayer") 

E especialmente a Chris Snyder, por uma dica de desempenho:

Uma solução mais rápida pode ser proteger um pouco o seu ponto e, em seguida, usar a extensão do buffer como extensão da análise para fazer uma cópia in_memory (ferramenta CopyFeatures) dos seus dados SDE e, em seguida, executar um SelectByLocation no conjunto de dados in_memory menor e local. Dessa forma, você está fazendo a ferramenta SelectByLocation honrar o ambiente de extensão da análise, o que normalmente não seria. Entre: Quaisquer recursos que se sobreponham à extensão da análise serão copiados com a ferramenta CopyFeatures. Eu desejo que a ferramenta SelectByLocation e os métodos dos cursores honrem a extensão da análise ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.