Procurando uma função rápida de custo-distância de varredura de código aberto para usar no código

9

Venho vasculhando a Internet em busca de uma função rápida de custo-distância de código aberto que possa incorporar ao meu código. A funcionalidade deve funcionar basicamente como a implementação do ArcGIS, onde eu posso especificar uma fonte de varredura e uma varredura de custo e gerar uma varredura de distância de custo. Dito isso, a implementação não precisa ser tão sofisticada quanto o ArcGIS, pois não preciso necessariamente inserir "rasters" com metadados geográficos incorporados - uma assinatura que usa matrizes numéricas simples será suficiente, pois posso verificar se os dados se sobrepõem corretamente no momento em que chamo a função

Minha intenção específica é calcular a distância de custo para um único ponto no centro de uma varredura de custo de 1000 x 1000 com base em um clique do usuário; portanto, a execução rápida é muito importante.

A implementação de AC # seria ideal, mas examinarei qualquer coisa que esteja lá fora.

Alguém sabe de uma biblioteca de código aberto que suporta isso? Obrigado pela ajuda!

atogle
fonte

Respostas:

5

O GRASS GIS possui uma implementação C em r.cost( fonte , documentação ) que usa um min-heap . Como alternativa, você pode usar um pacote gráfico como o QuickGraph e o Floyd-Warshall para calcular o custo.

Mudanças recentes no GRASS 6.4 tornaram o r.cost significativamente mais rápido , então talvez o desempenho seja bom o suficiente: no meu laptop, são necessários cerca de 3s para uma região celular de 1M ou 5s com o movimento do cavaleiro ativado. O GRASS é um aplicativo C, não uma solução drop-in para uma base de código C #. Se você está bem adicionando à sua pilha, você pode usar o PyWPS para fazer chamadas para o GRASS e, em seguida, usar o resultado em outro lugar do seu aplicativo.

scw
fonte
Vou usar isso em um aplicativo Web, portanto, meu objetivo é concluir a operação em apenas alguns segundos. Eu terei apenas uma única célula-alvo e uma distância-custo máxima relativamente pequena (a distância da célula-alvo central à borda da varredura de custo, assumindo uma linha reta com um custo mínimo). Meus testes usando o ArcMap nessas condições me fazem pensar que é possível. Alguma dica ou experiência usando GRASS em C #?
atogle
Atualizei minha pergunta para responder às suas perguntas. Começou como um comentário, mas demorou demais. Espero que ajude!
ACS
Obrigado scw! Esta é uma ótima informação, mas realmente não me leva aonde eu preciso estar, a menos que comece a portar o código GRASS (o que não estou ansioso para fazer). Talvez existam outros geeks raster por aí com algumas dicas. Vou continuar pesquisando e postarei a solução que resolver.
atogle
Talvez você possa recorrer ao seu colega: azavea.com/research/staff-research-projects/map-algebra ;-) Sugeri o código GRASS porque é uma implementação rápida e robusta, o C # é relativamente novo no espaço de geoprocessamento, portanto, preexistente implementações podem ser difíceis de encontrar.
ACS
scw - foi onde minha jornada começou, na verdade. Meu problema é que sua implementação sacrifica o tempo de processamento para cálculos de alta qualidade. Estamos trabalhando agora em um algoritmo para fazer o oposto. O GRASS é uma ótima sugestão, simplesmente não tenho como utilizá-lo. =)
atogle
3

Eu uso muito a r.costfunção no GRASS. 1000 * 1000 grades não eram problema em um laptop normal. Há também um pacote R (gdistance, http://r-forge.r-project.org/projects/gdistance/ ) em desenvolvimento. Encontrei o GRASS muito mais rápido.

johannes
fonte