gpt4 book ai didi

r - 一组点与 R 中 sf 的多边形之间的距离

转载 作者:行者123 更新时间:2023-12-04 11:39:53 24 4
gpt4 key购买 nike

我在 map 上有一个点数据框和一个被描述为点多边形的感兴趣区域。我想计算每个点到多边形之间的距离,理想情况下使用 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.只需使用 st_distance乐趣 - 不起作用,错误答案
st_distance(pnts_sf, area)

2.在一个 mutate 调用中 - 所有错误的答案
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长/纬度 - 正常工作
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)

我是空间数据的新手,我正在尝试学习 sf包所以我想知道这里出了什么问题。据我所知,前两种方法以某种方式最终将点“作为一个整体”考虑在内(其中一个点在区域多边形内,所以我想这就是为什么错误答案之一是 0 的原因)。第三种方法是一次考虑一个点,这是我的意图。
任何想法如何获得 mutate也打电话上类?

我在 R 3.4.1 与
> packageVersion("dplyr")
[1] ‘0.7.3’
> packageVersion("sf")
[1] ‘0.5.5’

最佳答案

所以事实证明,整个困惑是由我的一个小小的愚蠢疏忽造成的。这是分割:

  • points数据帧来自与 area 不同的来源(!)多边形。
  • 监督这一点,我一直试图将它们设置为 crs 7415这是一个合法但不正确的举动,最终导致错误的答案。
  • 正确的方法是将它们转换为 sf crs 中的对象它们起源于,将它们转化为 area对象在,然后继续计算距离。

  • 把它们放在一起:
    # 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 transformation to another crs
    pnts_sf <- st_transform(pnts_sf, crs = 7415L)

    st_distance(pnts_sf, area)

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

    关于r - 一组点与 R 中 sf 的多边形之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46214479/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com