Eu tenho alguns dados pontuais que representam locais lat-lon diários de um animal, com um timestamp associado.
Gostaria de identificar todos os pontos em que STATIONARY = TRUE. Um ponto se qualifica como estacionário se um buffer de 100 km ao seu redor se sobrepuser a (digamos) 5 pontos temporariamente adjacentes adicionais . Portanto, se o dia 10 for o meu ponto de interesse, quero perguntar se 5 dias temporalmente adjacentes estão dentro de um buffer de 100 km desse ponto. Se dias 5,6,7,8 e 9; Dias OR 11,12,13,14 e 15; Os dias OR 8,9,11,12,13 (etc.) estão dentro do buffer e, em seguida, STATIONARY = TRUE. Se, no entanto, os dias 5,7,9,11 e 13 estiverem dentro do buffer, mas não os dias alternativos (pares) intermediários, então STATIONARY = FALSE
Acho que algum tipo de buffer de janela em movimento fornecerá a solução, mas não sei como implementar isso.
Eu tenho tentado resolver esse problema no ArcGIS e no R, mas até agora não tive ondas cerebrais. Este é o mais próximo que eu tenho de uma solução, mas não se encaixa, não acho: Identificação de pontos consecutivos dentro de um buffer especificado
Aqui estão alguns dados fictícios, que se aproximam da minha estrutura de dados (embora na realidade eu tenha locais duas vezes ao dia (meio-dia e meia-noite) com alguns locais ausentes - mas vou me preocupar com isso mais tarde)
x<-seq(0,15,length.out=20)
y<-seq(10,-10,length.out=20)
t<-seq(as.POSIXct('2013-07-01'), length.out = 20, by = "days")
data<-data.frame(cbind(x,y,t=as.data.frame.POSIXct(t)))
x y t
1 0.0000000 10.0000000 2013-07-01
2 0.7894737 8.9473684 2013-07-02
3 1.5789474 7.8947368 2013-07-03
4 2.3684211 6.8421053 2013-07-04
5 3.1578947 5.7894737 2013-07-05
6 3.9473684 4.7368421 2013-07-06
7 4.7368421 3.6842105 2013-07-07
... ... ... ...
Respostas:
Vamos dividir isso em pedaços simples. Ao fazer isso, todo o trabalho é realizado em apenas meia dúzia de linhas de código facilmente testado.
Primeiro, você precisará calcular as distâncias. Como os dados estão em coordenadas geográficas, aqui está uma função para calcular distâncias em um dado esférico (usando a fórmula Haversine):
Substitua por sua implementação favorita, se desejar (como uma que usa um dado elipsoidal).
Em seguida, precisaremos calcular as distâncias entre cada "ponto base" (que está sendo verificado quanto à estagnação) e sua vizinhança temporal. Isso é simplesmente uma questão de se aplicar
dist
ao bairro:Terceiro - essa é a idéia principal - pontos estacionários são encontrados detectando bairros de 11 pontos com pelo menos cinco em uma linha cujas distâncias são suficientemente pequenas. Vamos implementar isso um pouco mais geralmente, determinando o comprimento da subsequência mais longa de valores verdadeiros dentro de uma matriz lógica de valores booleanos:
(Nós encontramos os locais dos valores falsos , em ordem, e calculamos suas diferenças: estes são os comprimentos das subsequências de valores não falsos. O maior tamanho é retornado.)
Quarto, aplicamos
max.subsequence
para detectar pontos estacionários.Essas são todas as ferramentas que precisamos.
Como exemplo, vamos criar alguns dados interessantes com alguns grupos de pontos estacionários. Vou dar um passeio aleatório perto do Equador.
As matrizes
lon
elat
contêm as coordenadas, em graus, dosn
pontos em sequência. A aplicação de nossas ferramentas é simples após a primeira conversão em radianos:O argumento
p[max(1,i-5):min(n,i+5), ]
diz para olhar para trás em 5 etapas de tempo ou até 5 etapas de tempo a partir do ponto basep[i,]
. A inclusãok=5
diz para procurar uma sequência de 5 ou mais em uma fileira que esteja a 100 km do ponto base. (O valor de 100 km foi definido como padrão,is.stationary
mas você pode substituí-lo aqui.)A saída
p.stationary
é um vetor lógico indicando estacionariedade: nós temos o que buscamos. No entanto, para verificar o procedimento, é melhor plotar os dados e esses resultados em vez de inspecionar matrizes de valores. No gráfico a seguir, mostro a rota e os pontos. Cada décimo ponto é rotulado para que você possa estimar quantos podem se sobrepor dentro dos grupos estacionários. Os pontos estacionários são redesenhados em vermelho sólido para destacá-los e cercados por seus amortecedores de 100 km.Para outras abordagens (baseadas em estatística) para encontrar pontos estacionários em dados rastreados, incluindo código de trabalho, visite /mathematica/2711/clustering-of-space-time-data .
fonte