Eu tenho um arquivo de pontos, realocações horárias de um animal e quero poder colocar um buffer em torno de cada ponto e calcular o número de pontos subseqüentes que estão dentro da zona de buffer. Estou procurando um método que funcione ao longo do arquivo de ponto, como uma janela em movimento, que contará apenas os pontos subsequentes que estão dentro da zona de buffer.
Por exemplo, no ponto 10, coloco um buffer de 1500m e quero saber se o ponto 11 está dentro do buffer e, se sim, então se o ponto 12 está dentro do buffer e assim por diante. Não quero saber se o ponto 52 está dentro da zona do buffer, a menos que todos os pontos anteriores estejam dentro do buffer. Também não quero saber se os pontos 9 ou 8 etc. estão dentro do buffer.
Eu encontrei e tentei uma caixa de ferramentas adicional chamada "análise de pontos em movimento da janela", que funciona como uma janela em movimento no arquivo do ponto. Isso funciona bem, mas muito lentamente, e inclui todos os pontos que estão dentro da zona de buffer, mesmo que não sejam pontos consecutivos. Não consigo encontrar uma maneira de fazer com que pareça pontos consecutivos.
Gostaria de um método que forneça uma tabela de saída, pois tenho muitos pontos de dados para analisar dessa maneira.
Estou usando o ArcGIS 10. Qualquer ajuda que alguém possa fornecer seria muito apreciada.
fonte
R
, vamos explorar soluções baseadas em R então.Respostas:
Dada uma lista de locais dos pontos (de preferência nas coordenadas projetadas, para facilitar a computação das distâncias), esse problema pode ser resolvido com cinco operações mais simples :
Calcular distâncias ponto a ponto.
Para cada ponto i, i = 1, 2, ..., identifique os índices desses pontos a distâncias menores que o raio do buffer (como 1500).
Restrinja esses índices a serem i ou superiores.
Reter apenas o primeiro grupo consecutivo de índices sem interrupção.
Saída a contagem desse grupo.
Em
R
, cada um deles corresponde a uma operação. Para aplicar essa sequência a cada ponto, é conveniente encapsular a maior parte do trabalho dentro de uma função que definimos , assim:(Veja abaixo uma versão mais eficiente dessa função.)
Tornei essa função flexível o suficiente para aceitar várias listas de pontos (
xy
) e distâncias de buffer (r
) como parâmetros.Normalmente, você lia um arquivo de locais dos pontos (e, se necessário, os classifica por tempo). Aqui, para mostrar isso em ação, apenas geraremos alguns dados de amostra aleatoriamente :
Seu espaçamento típico é de 300 * Sqrt (2) = cerca de 500. Fazemos o cálculo aplicando essa função aos pontos da matriz
xy
(e depois voltando a seus resultadosxy
, pois esse seria um formato conveniente para exportar para um GIS ):Você analisaria ainda mais a
result
matriz,R
gravando-a em um arquivo e importando-a para outro software. Aqui está o resultado para os dados da amostra :(Lembre-se de que as contagens incluem os pontos em que se baseiam, de modo que cada contagem deve ser 1 ou maior.)
Se você tem muitos milhares de pontos, esse método é muito ineficiente : calcula distâncias ponto a ponto demais desnecessárias. Mas, como encapsulamos o trabalho dentro da
forward
função, a ineficiência é fácil de corrigir. Aqui está uma versão que funcionará melhor quando mais de algumas centenas de pontos estiverem envolvidos:Para testar isso, criei pontos aleatórios como anteriormente, mas variei dois parâmetros:
n
(o número de pontos) e seu desvio padrão (codificado como 300 acima). O desvio padrão determina o número médio de pontos dentro de cada buffer ("média" na tabela abaixo): quanto mais houver, mais tempo esse algoritmo demora para ser executado. (Com algoritmos mais sofisticados, o tempo de execução não depende tanto de quantos pontos existem em cada buffer.) Aqui estão alguns horários:fonte
Acho que sua melhor aposta é criar um pouco de rotina usando o ArcPy. Eu criaria algo como este pseudo-código:
Não tenho certeza do que você deseja fazer com as informações, mas suponho que você possa criar um campo em sua tabela e atualizá-lo com a contagem de pontos consecutivos (se houver, adicione o campo primeiro).
Eu recomendaria criar camadas de recursos (como uma exibição de tabela de banco de dados, mas para recursos no Arc). Faça dois a partir dos dados originais e abra um cursor de atualização no primeiro conjunto, especificando sua classificação geral (porque o ESRI não atende a consultas SQL completas). Use o segundo para selecionar por local e abrir um Cursor de Pesquisa no conjunto de seleção resultante.
[EDITAR POR PEDIDO DO Jame] Faça o detalhamento usando o Model Builder. Se você não usou o Model Builder antes, basta clicar com o botão direito do mouse no arcToolbox. Selecione 'Adicionar caixa de ferramentas'. Clique com o botão direito do mouse na nova caixa de ferramentas e clique em 'Novo-> modelo'. Depois de ter uma nova janela de modelo, arraste e solte as ferramentas e os dados necessários na janela e vincule-os visualmente (usando a pequena ferramenta de seta). Quando você chegar o mais longe possível (não poderá adicionar seus cursores aqui), use a opção no menu Arquivo do Model Builder para exportar para o Python. Isso o levará a maior parte do caminho até lá. Como o código é gerado automaticamente, será um pouco desagradável, mas funcional. Em seguida, use os links na minha resposta acima para entender e adicionar os cursores.
Se você é novo no Python, não tenha medo de escrever código! Python é uma linguagem de script muito fácil de obter resultados rapidamente. Esri também tem algumas orientações .
Se você ficar preso ao seu código, publique-o neste fórum e peça ajuda. Há muitas pessoas aqui que podem ajudar. Um aviso - certifique-se de usar a ajuda certa da ESRI. Eles mudaram massivamente a API do Python entre as versões 9.xe 10 (respectivamente arcgisscripting e arcpy). Portanto, se você estiver usando o ArcGIS 9.x, encontre os links equivalentes aos meus!
fonte
Você pode usar o construtor de modelos no ArcGIS para encontrar valores de ID consecutivos. Eu exportei meu modelo como um script python. O código irá gerar um novo shp com valores de ID consecutivos. !EU IRIA! é o campo de identificação base. Você precisará atualizar o caminho point2.shp, o nome e o nome do campo de ID para corresponder ao seu caso.
fonte