2016-07-07 2 views
2

UTM (Universal Transverse Mercator) 좌표로 장소 목록과 지리적 위치가있는 데이터 프레임이 있습니다.각 점의 지정된 거리 내에있는 점 찾기

Place X_UTM Y_UTM 
    1 574262.0 6140492 
    2 571251.2 6141669 
    3 570841.9 6142535 
    4 570233.8 6141213 
    5 578269.2 6140304 
    6 575067.1 6137444 

내가 확인하고 싶은 다른 장소의 주어진 유클리드 거리 내에있는 각 장소합니다 (dataframe의 각 행)에 대한 :

그것은 다음과 같이 보입니다. 이 경우, 나는 어느 장소가 1 킬로미터보다 더 가까운지를 찾고 싶다. 나는 이런 식으로 뭔가를 시도했습니다

: 1,000m보다 더 가까운 지점을 반환하는 함수이어야한다

foo <- function(x, y) dist(c(x, y), method = "euclidian") < 1000 

. 그런 다음 :

x <- lapply(df(,c(i, x, y)), FUN = foo) 
i"Place"입니다

, x"X_UTM"하고 y"Y_UTM"입니다. 이것은 전혀 작동하지 않습니다.

내가 (위의 숫자에서 얻을 수없는) 같은 것을 보일 것입니다 후 오전 출력 :

# Place Closest 
#  1 2, 5 
#  2  1 
#  3  NA 
#  4  5 
#  5 1, 4 
#  6  NA 
+0

이 정정 해줘,하지만 거리 함수는 두 개의 _points_을 허용해서는 안, 즉 두 x와 y 값이? –

+0

예. 각 행 사이의 거리를 계산하고 싶습니다. 모든 행에 대해 sqr ((X_UTM [1] - X_UTM [i])^2 - (Y_UTM [1] - Y_UTM [i])^2) 여야하고, [i]가 1000 미만인 것을 기록해야합니다. –

+1

은 당신은'dst <- as.matrix (dist (d [-1]))를하지 않는다; diag (dst) <- NA; apply (dst, 1, function (x) paste (which (x <1000), collapse = ","))' – user20650

답변

2

sp::spDists을 사용하여 거리 매트릭스를 반환하고 조건에 맞는 각 열/행의 요소를 찾을 수도 있습니다. 예를 들어

: 내가 잘못 될 경우

d <- read.table(text='Place X_UTM  Y_UTM 
1  574261.98 6140492.13 
2  571251.23 6141669.26 
3  570841.92 6142534.86 
4  570233.75 6141212.5 
5  578269.25 6140303.78 
6  575067.07 6137444.36', header=TRUE) 
library(sp) 
i <- apply(spDists(as.matrix(d[, c('X_UTM', 'Y_UTM')])), 2, 
      function(x) paste(which(x < 1000 & x != 0), collapse=', ')) 

data.frame(Place=d$Place, Closest=i) 

## Place Closest 
## 1  1   
## 2  2  3 
## 3  3  2 
## 4  4   
## 5  5   
## 6  6   
+1

완벽하게 작동합니다. 그 spDist를 패키지 sp에 추가하기 만하면됩니다. 고마워. –

+0

'dist'도 [pointed out]처럼 잘 작동합니다 (http://stackoverflow.com/questions/38246575/how-to-find-the-elements-of-a-vector-wich-distance-is-less -an-value-in-r/38257822? noredirect = 1 # comment63915843_38246575) @ user20650에 의해 작성되었습니다. 또한 제 대답은 우발적 인 포인트를 반환하지 못합니다. 즉, 거리가 0 인 포인트는 무시됩니다. "자아"를 무시하는 더 좋은 방법은 user20650의 설명에서 언급 한대로 대각선을 'NA'로 설정하는 것입니다. – jbaums

0

난 당신이 십자가에 필요할 것 생각은 장소 좌표 가입 할 수 있습니다. 그 이유는 모든 쌍의 장소가 가장 가까운 이웃이 될 수 있고 특정 쌍을 배제 할 수있는 선험적 정보가 없다고 가정 할 때 모든 쌍을 검사해야합니다.

십자가가 데이터 프레임 df의 조인 얻는 한 가지 방법은 merge에 매개 변수로 by = NULL 설정 자체와 병합하는 것입니다

: 이제 당신이해야 할 모든이의 최소 거리를 찾을 수있다

df.cross <- merge(x = df, y = df, by = NULL) 
df.cross$distance <- apply(df.cross[, c('X_UTM.x', 'X_UTM.y', 'Y_UTM.x', 'Y_UTM.y')], 
     1, 
     function(x) dist(x[1], x[2], x[3], x[4])) 

을 각 쌍의 장소.

+0

친애하는 @Tim Biegeleisen, 답장을 보내 주셔서 감사합니다. dist (x [1], x [2], x [3], x [4])의 오류 : 잘못된 거리 메서드 –

+0

'dist' 함수를 재정의해야합니다. 두 개의 직교 좌표 점에 대해 두 개의 x 값과 두 개의 값을 취합니다. –

관련 문제