공간과 시간의 근접성


10

관련 타임 스탬프와 함께 동물의 일일 위도 위치를 나타내는 포인트 데이터가 있습니다.

STATIONARY = TRUE 인 모든 포인트를 식별하고 싶습니다. 100km의 버퍼가 시간적으로 인접한 5 개의 추가 포인트 와 겹치는 경우 포인트는 정지 된 것으로 간주됩니다 . 따라서 10 일째 가 관심 장소라면 시간적으로 인접한 5 일이이 지점의 100km 버퍼 내에 있는지 묻고 싶습니다. 5,6,7,8 및 9 일이면; 또는 11,12,13,14 및 15 일; 또는 8,9,11,12,13 등이 버퍼 내에있는 경우 STATIONARY = TRUE입니다. 그러나 5,7,9,11 및 13 일이 버퍼 내에 있지만 그 사이의 대체 (짝수) 일이 아닌 경우 STATIONARY = FALSE

어떤 종류의 움직이는 창 버퍼가 해결책을 제공 할 것이라고 생각하지만 이것을 구현하는 방법을 모르겠습니다.

ArcGIS와 R 모두 에서이 문제를 해결하려고 노력했지만 지금까지 뇌파는 없었습니다. 이것은 솔루션에 가장 가깝지만 적합하지 않습니다. 생각하지 않습니다. 지정된 버퍼 내에서 연속 지점 식별

여기에 내 데이터 구조와 비슷한 더미 데이터가 있습니다 (실제로 일부 위치가 누락되어 매일 두 번 매일 위치 (자정과 자정)가 있지만 나중에 걱정할 것입니다)

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
... ...         ...       ...

1
질문? 10 개의 포인트가 모두 버퍼 내에 있고 날짜 분리 (1 일부터 시작)가 1-3-4-12-13-20-21-22-29-30이라고 가정하면 포인트 선택에만 관심이 있다고 말하는 것입니다 1,2,3,4 & 12 일에 있습니까?
Hornbydd

아니요, 1-4 일에만 관심이 있습니다. 만약 동물이 완충액을 '나가면'12 일 (또는 6 일)에 되돌아 가면, 그 정지 기간을 '취소'합니다. 즉, 동물은 1-2-3-4-5 일에 완충액에 있어야합니다. 계산할 버퍼의 중앙에있는 점 말이 되나요? 잘 모르겠어요 ..
Tom Finch

1
관심 장소가 7 일인 경우 7,8,9,10 및 11 일 동안 100Km 내에 해당하는 지점에 관심이 있습니까?
Hornbydd

8,9,10,11,12 일이 100km를 멈춘다면 포인트 7은 고정 포인트로 선택됩니다. 또는 5,6,8,9,10 일. 따라서 다른 5 개의 일시적으로 인접한 지점 (이전 5 일, 이후 5 일 또는 며칠 중 어느 쪽이든)이 모두 버퍼 내에 있으면 한 지점이 선택됩니다. 움직이는 창은 그것을 개념화하는 가장 좋은 방법이라고 생각합니다. 각 '초점'포인트에 대해 과거 / 미래에 5 일을 초과하는 포인트는 잊을 수 있습니다. 내가 조금 더 이해하면 원래의 질문을 업데이트 할 수 있습니다.
Tom Finch

데이터 형식은 무엇입니까? 예를 들어, 셰이프 파일 및 시간을 저장하는 속성 테이블에 벡터 포인트로 각 시간 / 위치가 있습니까? 또는 각 시간 / 위치가 다른 셰이프 파일에 별도로 저장됩니까? 데이터가 지리 공간 형식이 아니고 단순히 Excel 파일입니까? 이것을 아는 것은 우리가 대답하는 데 도움이 될 것입니다.

답변:


12

이것을 간단한 조각으로 나누겠습니다. 그렇게함으로써, 모든 작업은 수십 줄의 쉽게 테스트 된 코드로 달성됩니다.

먼저 거리를 계산해야합니다. 데이터가 지리적 좌표로되어 있으므로 다음은 Haversine 공식을 사용하여 구면 데이텀의 거리를 계산하는 함수입니다.

#
# Spherical distance.
# `x` and `y` are (long, lat) pairs *in radians*.
dist <- function(x, y, R=1) {
  d <- y - x
  a <- sin(d[2]/2)^2 + cos(x[2])*cos(y[2])*sin(d[1]/2)^2
  return (R * 2*atan2(sqrt(a), sqrt(1-a)))
}

원하는 경우 (예를 들어 타원체 데이텀을 사용하는) 선호하는 구현으로 바꾸십시오.

다음으로, 각 "기준점"(계단이 확인 됨)과 시간적 이웃 사이의 거리를 계산해야합니다. 그것은 단순히 dist이웃 에 적용하는 문제입니다 .

#
# Compute the distances between an array of locations and a base location `x`.
dist.array <- function(a, x, ...) apply(a, 1, function(y) dist(x, y, ...))

셋째, 이것이 핵심 아이디어입니다. 정지 점은 거리가 충분히 작은 행에서 5 개 이상을 가진 11 점의 주변을 감지하여 발견됩니다. 부울 값의 논리적 배열 내에서 참 값의 가장 긴 하위 시퀀스의 길이를 결정하여이를 좀 더 일반적으로 구현해 보겠습니다.

#
# Return the length of the longest sequence of true values in `x`.
max.subsequence <- function(x) max(diff(c(0, which(!x), length(x)+1)))

(우리는 잘못된 값 의 위치를 순서대로 찾아서 그 차이를 계산합니다. 이는 거짓이 아닌 값의 하위 시퀀스 길이입니다. 이러한 최대 길이가 반환됩니다.)

넷째, max.subsequence고정 점 감지에 적용 합니다.

#
# Determine whether a point `x` is "stationary" relative to a sequence of its
# neighbors `a`.  It is provided there is a sequence of at least `k`
# points in `a` within distance `radius` of `x`, where the earth's radius is
# set to `R`.
is.stationary <- function(x, a, k=floor(length(a)/2), radius=100, R=6378.137) 
  max.subsequence(dist.array(a, x, R) <= radius) >= k

그것들은 우리가 필요한 모든 도구입니다.


예를 들어, 정지 지점이 몇 군데있는 흥미로운 데이터를 만들어 봅시다. 나는 적도 근처에서 무작위로 걸을 것입니다.

set.seed(17)
n <- 67
theta <- 0:(n-1) / 50 - 1 + rnorm(n, sd=1/2)
rho <- rgamma(n, 2, scale=1/2) * (1 + cos(1:n / n * 6 * pi))
lon <- cumsum(cos(theta) * rho); lat <- cumsum(sin(theta) * rho)

배열 lonlat의, 각도, 좌표를 포함하는 n순서 포인트. 라디안으로 변환 한 후에는 도구를 간단하게 적용 할 수 있습니다.

p <- cbind(lon, lat) * pi / 180 # Convert from degrees to radians
p.stationary <- sapply(1:n, function(i) 
  is.stationary(p[i,], p[max(1,i-5):min(n,i+5), ], k=5))

이 주장 p[max(1,i-5):min(n,i+5), ]은 기준점에서 5 단계까지, 또는 5 단계만큼 앞뒤로 보인다고 말합니다 p[i,]. 를 포함하면 k=5기준점에서 100km 이내에있는 5 개 이상의 시퀀스를 찾습니다. (100km의 값이 기본값으로 설정 is.stationary되었지만 여기서 무시할 수 있습니다.)

출력 p.stationary은 정상 성을 나타내는 논리 형 벡터입니다. 그러나 절차를 확인하려면 값 배열을 검사하는 대신 데이터와 이러한 결과를 플로팅하는 것이 가장 좋습니다. 다음 그림에서 경로와 점을 보여줍니다. 10 번째 포인트마다 레이블이 지정되어있어 고정 덩어리 내에서 얼마나 많은 겹칠 지 추정 할 수 있습니다. 고정 점은 빨간색으로 다시 그려져 강조 표시되고 100km 버퍼로 둘러싸여 있습니다.

그림

plot(p, type="l", asp=1, col="Gray", 
     xlab="Longitude (radians)", ylab="Latitude (radians)")
points(p)
points(p[p.stationary, ], pch=19, col="Red", cex=0.75)
i <- seq(1, n, by=10)
#
# Because we're near the Equator in this example, buffers will be nearly 
# circular: approximate them.
disk <- function(x, r, n=32) {
  theta <- 1:n / n * 2 * pi
  return (t(rbind(cos(theta), sin(theta))*r + x))
}
r <- 100 / 6378.137  # Buffer radius in radians
apply(p[p.stationary, ], 1, function(x) 
  invisible(polygon(disk(x, r), col="#ff000008", border="#00000040")))
text(p[i,], labels=paste(i), pos=3, offset=1.25, col="Gray")

작업 코드를 포함하여 추적 된 데이터에서 고정 지점을 찾는 다른 (통계 기반) 접근 방식에 대해서는 /mathematica/2711/clustering-of-space-time-data 를 방문 하십시오 .


와우 고마워! 이 문제를 해결하기 위해 최선을 다하겠습니다. 시간과 노력에 다시 한번 감사드립니다
Tom Finch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.