지도의 점 데이터 프레임이 있고 점의 다각형으로 설명 된 관심 영역이 있습니다. 이상한 점은 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’
당신은'이 ST_Distance()에서'by_element = TRUE '를 설정해야합니까'전화? 또한, 재현 가능한 예제의 +1 +1 – Phil
@ 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
매우 유용한 도덕. 사람들이 해결 된 것을 볼 수 있도록 솔루션을 답으로 작성하는 데주의하십시오. – Phil