Temos uma camada chamada Hidrografia, que é a área da água para uma determinada tarefa. Eu tenho um ponto de estação e um ponto de destino. Preciso calcular a distância entre esses dois pontos, mas dentro da hidrografia. (os barcos não podem passar por terra)
O cálculo da distância do DefenseService parece aceitável, mas parece estar em linha reta, pois não aceita nenhum Raster como entrada. O euclidiano parece estar quase lá, mas não consigo encontrar nada que seja direto.
Estou usando o ArcGIS Explorer 2500, ArcGIS for Server 10.1 SP1 Enterprise, e estamos escrevendo nossos serviços e ferramentas em C #.
Eu tenho o carregamento da hidrografia, a criação dos IPoints, mas sem saber o que fazer a seguir!
Qualquer ajuda apreciada, por favor.
arcgis-server
arcgis-10.1
c#
distance
arcgis-explorer
SASS_Shooter
fonte
fonte
Respostas:
Use as ferramentas Distância de custo e Caminho de custo da extensão Spatial Analyst.
Você pode criar uma varredura a partir de seus polígonos de hidrografia. Em seguida, assegure-se de que as células raster que representam a água obtenham um valor baixo (por exemplo, 1) e as outras células raster recebam um valor alto (por exemplo, 1000). Você pode usar essa varredura como varredura de distância de custo na Cost Path Tool .
fonte
Fiz algo semelhante em relação aos canais e aos cursos de água naturais. A abordagem que usei foi a NIF dos pontos, a bissecção do NIT e, em seguida, a criação de um segundo NIF a partir dos vértices originais e os bissetores, em seguida, atravessam usando as opções de descarte de um algoritmo de Dijkstra modificado, assim que for evidente que eles não formarão a solução mais simples . A modificação foi que a linha poderia terminar no ponto 'solução' ou em um caminho anterior, caso já existisse. Não existe uma solução pronta para isso e se você não é um programador ou pelo menos está em posição de ficar do lado bom de um deles, sua única opção é rastrear com um deslocamento em um banco de dados geográfico e analisar o campo shape_length.
TIN = Rede Irregular Triangular, uma treliça de pontos e linhas de conexão, de modo que cada ponto seja conectado aos seus vizinhos mais próximos e nenhuma linha se cruze. Para isso, consulte http://en.wikipedia.org/wiki/Delaunay_triangulation . Não usei os objetos ESRI TIN. Em vez disso, encontrei algum código para triangulação e os mantive na memória, algo como http://www.codeproject.com/Articles/492435/Delaunay-Triangulation-For-Fast-Mesh-Generation .
Para o algoritmo de caminho mais curto, consulte http://en.wikipedia.org/wiki/Dijkstra 's_algorithm, ele tem uma bela imagem; apesar do nome complicado, é realmente bastante simples.
A partir dos pontos que formam as linhas, fiz uma triangulação de Delaunay, em seguida, encontrei o ponto médio de cada aresta do triângulo (geometria básica ... média X, média Y) e inseri os pontos que estavam dentro dos polígonos na malha, o que dá uma caminho central e links para todos os vértices no limite. Em seguida, excluir as facetas que seguem as margens do curso de água rastreia a rede usando o algoritmo de Dijkstra e, eventualmente, você encontrará um caminho do ponto A ao ponto B correndo aproximadamente no centro dos cursos de água. Haverá muitos caminhos possíveis, então eu mantive um peso em cada ápice e parei um caminho quando o comprimento cumulativo exceder o comprimento já registrado e, se for menor, atualize o ápice com o menor comprimento cumulativo - isso reduz a quantidade de caminhos que são rastreados, e pode haver bastante;
Como alternativa, uma vez triangulado, você pode transformar as arestas dos triângulos em duas linhas de pontos como uma classe de recurso, criar uma rede e fazer um rastreamento. Tenho certeza de que as rotinas de rastreamento ESRI são muito mais rápidas que as minhas, mas eu tinha uma necessidade específica e não conseguia resolvê-lo usando redes geométricas.
fonte
Estou adicionando isso para qualquer pessoa no futuro que leia este tópico.
Aqui está tudo o que aprendi ao aprofundar esse problema e obter uma distância completa entre os pontos de chamada.
Nosso primeiro problema surgiu da natureza estática do RasterCatalog. Alterar as rasters nas quais isso se baseia NÃO altera a varredura dentro do RasterCatalog. Aconteceu que a nossa tinha uma versão antiga que não estava nem perto de um mapa da costa. Lição aprendida: reconstrua o RasterCatalog Toda vez que você altera os Rasters nos quais se baseia.
O Distance Raster com pesos adicionados se torna algo complicado de se trabalhar. Veja o seguinte cenário: O valor original da varredura é de 1 distância total que quero examinar é de 117 km. O tamanho da célula é de 1 metro. Se a varredura agora é um valor ponderado de 48, a distância total que eu quero olhar se torna 117 km * 48 !!! Portanto, a distância no método CostDistance não é a distância da célula, mas a distância ponderada, aparentemente adicionando o valor em cada célula até a soma de cada célula = o valor passado para a distância total. Mesmo que o tamanho da célula seja 1 metro !!!
A distância raster é toda focada em um ponto de origem. Portanto, quando você chama a rotina CostDistance, não deseja incluir o ponto de origem nessa lista. se o fizer, você receberá um ponto com uma distância de 0. (isso até atrapalhou o suporte da ESRI)
Enquanto muitos dos métodos usam o Envelope para restringir seu processo, os dois mais caros, definindo um valor para a varredura e extraindo uma varredura sem uma área dentro de um polígono, ignoram todas as configurações de envelopes e sempre aplicam isso automaticamente à varredura inteira. Infelizmente para nós, só podemos encurtar isso criando segmentos sobrepostos e atribuindo um segmento a uma área específica de caixa. Mas, ao fazer isso, precisamos ter cuidado (o que é difícil), de que uma área de operação primária não exista na área sobreposta incorreta. (em outras palavras, todas as nossas sobreposições devem ser cuidadosamente escolhidas para não conter nenhum ponto de interesse primário!) A razão para isso é que navegamos no RasterCatalog escolhendo a varredura correta com base no local onde a estação da Guarda Costeira escolhida existe. Para complicar ainda mais nosso processo, a sobreposição deve permitir-nos navegar até 120 km de distância do nosso ponto de origem sem sair da borda do mapa e não se sobrepor a outros pontos de interesse principais. Sheesh.
As únicas outras coisas que aprendi é que é fácil fazer a matemática para o raster, mas quando você deseja "fazer um buraco" no raster (bloqueios) ou definir um donut com um valor e o interior do donut tendo um valor 1 (atrasos como um bloqueio), você acaba com uma combinação complexa de ferramentas e chamadas ao ArcObject. O que leva à lição final aprendida: o ArcObjects não pode fazer tudo. Por isso, às vezes sou forçado a fazer coisas nas ferramentas lentas e complicadas que foram todas escritas em python. Também aprendi que os desenvolvedores de ferramentas ESRI não sabiam nada sobre como manter a consistência. Às vezes, eles pegavam um banco de dados raster, outras vezes, precisavam de uma varredura e, ocasionalmente, um conjunto de recursos. E eles não retornam os dados no mesmo formato que exigem como entrada!
Confuso? Não se preocupe, é ESRI.
fonte