2017-09-14 9 views
1

지도의 점 데이터 프레임이 있고 점의 다각형으로 설명 된 관심 영역이 있습니다. 이상한 점은 sf 패키지를 사용하여 각 점과 다각형 사이의 거리를 계산하고 싶습니다.점 집합과 Rf에 sf가있는 다각형 사이의 거리

library("tidyverse") 
library("sf") 

# area of interest 
area <- 
    "POLYGON ((121863.900623145 486546.136633659, 121830.369032584 486624.24942906, 121742.202408334 486680.476675484, 121626.493982203 486692.384434804, 121415.359596921 486693.816446951, 121116.219703244 486773.748535465, 120965.69439283 486674.642759986, 121168.798757601 486495.217550029, 121542.879304342 486414.780364836, 121870.487595417 486512.71203006, 121863.900623145 486546.136633659))" 

# convert to sf and project on a projected coord system 
area <- st_as_sfc(area, crs = 7415L) 

# points with long/lat coords 
pnts <- 
    data.frame(
    id = 1:3, 
    long = c(4.85558, 4.89904, 4.91073), 
    lat = c(52.39707, 52.36612, 52.36255) 
    ) 

# convert to sf with the same crs 
pnts_sf <- st_as_sf(pnts, crs = 7415L, coords = c("long", "lat")) 

# check if crs are equal 
all.equal(st_crs(pnts_sf),st_crs(area)) 

다음 접근 방식이 나에게 정답을주지 않는 이유가 궁금합니다.

1.Simply st_distance 재미 나던 일, 오답에게

st_distance(pnts_sf, area) 

2.In 돌연변이 체 호출을 사용하여 -

pnts_sf %>% 
    mutate(
    distance = st_distance(area, by_element = TRUE), 
    distance2 = st_distance(area, by_element = FALSE), 
    distance3 = st_distance(geometry, area, by_element = TRUE) 
) 

그러나이 방법이 작동하는 것 같다 모든 잘못 답변 정확한 거리를 제공합니다. 긴/위도를 통해

3. map는 - 나는 공간 데이터에 대한 새로운 그리고 난 내가 잘못 여기에 무슨 일이 일어나고 있는지 궁금하네요 있도록 sf 패키지를 배우려고 노력하고있어

pnts_geoms <- 
    map2(
    pnts$long, 
    pnts$lat, 
    ~ st_sfc(st_point(c(.x, .y)) , crs = 4326L) 
) %>% 
    map(st_transform, crs = 7415L) 

map_dbl(pnts_geoms, st_distance, y = area) 

제대로 작동합니다. 내가 말할 수있는 한, 처음 2 가지 접근법은 어떻게 든 점을 "전체"로 간주하게된다. (점 중 하나는 면적 다각형 안에 있으므로 잘못된 대답 중 하나가 0 인 것 같다.) 세 번째 접근법은 제 의도를 한 번에 한 점씩 고려하는 것입니다.
아이디어를 얻으려면 mutate 전화를 어떻게받을 수 있습니까?

나는 그래서 모든 혼란이 나의 부분에 작은 바보 감독에 의해 발생 된 것으로 나타났다

> packageVersion("dplyr") 
[1] ‘0.7.3’ 
> packageVersion("sf") 
[1] ‘0.5.5’ 
+1

당신은'이 ST_Distance()에서'by_element = TRUE '를 설정해야합니까'전화? 또한, 재현 가능한 예제의 +1 +1 – Phil

+0

@ Phil aghh 알아 냈습니다. 아주 신참 한 실수입니다! 나는'epsg 4326' crs를 사용하는 또 다른 소스를 통해'long' /'lat' 포인트를 얻었습니다. 이 부분은 내 궁금증에서 벗어났습니다. 그래서 데이터 프레임을 생성 한 후,'sf' 객체로의 변환은'pnts_sf <- st_as_sf (pnts, crs = 4326L, coords = c ("long", "lat"))' !) 그리고'area '와 같은 crs로 변환하라는 또 다른 호출은 -'pnts_sf <- st_transform (crs = 7415L)'이다. 그런 다음'st_distance()'호출은 정확한 결과를 산출합니다. 이야기의 도덕 = * 항상 * 당신의 범죄를 추적하십시오! – davidski

+1

매우 유용한 도덕. 사람들이 해결 된 것을 볼 수 있도록 솔루션을 답으로 작성하는 데주의하십시오. – Phil

답변

1

R 3.4.1에 있어요. (!)

  • points dataframe는 다른 소스에서 오는 area 폴리곤 이상 : 여기에 고장입니다.
  • 이것을 감독하는 것은 합법적이지만 잘못된 이동이며 결국 잘못된 대답으로 이어진 crs 7415으로 설정하려고 계속 시도했습니다.
  • 올바른 접근법은 crs의 객체를 sf 객체로 변환하고 객체가있는 객체로 변환 한 다음 거리를 계산하는 것입니다.

모두 함께 퍼팅 :

# this part was wrong, crs was supposed to be the one they were 
# originally coded in 
pnts_sf <- st_as_sf(pnts, crs = 4326L, coords = c("long", "lat")) 

# then apply the transfromation to another crs 
pnts_sf <- st_transform(crs = 7415L) 

st_distance(pnts_sf, area) 

-------------------------- 
Units: m 
      [,1] 
[1,] 3998.5701 
[2,] 0.0000 
[3,] 751.8097