r - 如何在sf R包中按组测量空间点之间的距离

标签 r distance points sf

我有一个数据集,其中包含 13 年来不同国家/地区的动物记录、x y 坐标(以米为单位)和动物目击年份。我想知道如何测量每个点的三个最近邻居之间的距离(以米为单位),但仅在同一年的调查点内测量此距离。我想找出哪些位置对彼此之间的距离小于 1000 米,并获取这些位置的 csv。

我正在使用包 sf 并且我能够估计点之间的距离但不能按年份进行子设置。我发现包“spatstat”可以用“nndist”来做到这一点,但是我发现设置请求的窗口和理解我需要使用的点模式对象很复杂。我是 R 的新手,使用不同类型的对象和不同的包对我来说变得非常复杂,所以我想知道在 sf 中是否有一种简单的方法可以做到这一点。不过,如果您建议使用其他包或其他方式,我愿意接受有关如何最有效地执行此操作的建议,请帮助我提供将我的数据转换为该包所需的对象类型的代码。

谢谢!

trial <-read.table(text =
"Country    station_code    lat_laea    lon_laea    year
Belize  BF09-1  -2955950    1247610 2009
Belize  BF09-10 -2953600    1248590 2009
Belize  BF09-11 -2954620    1247900 2009
Belize  BF11-13 -2958360    1244020 2011
Belize  BF11-18 -2963740    1240290 2011
Belize  BF11-19 -2963380    1242020 2011
Costa   BraulioCarrilloNP-C16   -3640760    1821170 2011
Costa   BraulioCarrilloNP-C17   -3640730    1823240 2011
Costa   BraulioCarrilloNP-C18   -3642140    1817560 2011
Guatemala   40063   -3178260    1249780 2009
Guatemala   40596   -3183800    1246940 2009
Guatemala   43279   -3182640    1251560 2009", 
                   header = TRUE)

trial.sp <- st_as_sf(trial, coords = c("lat_laea", "lon_laea"), crs = 3035)
plot(st_geometry(trial.sp))

test <- st_distance(trial.sp, trial.sp, by_element = FALSE, which = "Euclidean")
class(test)

test1 <- as.data.frame(test)
write_csv(test1, "test.csv")

我想要的是一个 csv 文件,其中包含同一年研究的所有一对位置,它们彼此之间的距离小于 1000 米。

最佳答案

sf 包很容易集成到 dplyr 框架中。这将围绕 trial.sp 中的每个点创建一个半径为 1000 米的圆,并通过 st_within 函数将其连接到原始数据集。

trial.sp %>%
  st_join(trial.sp %>% st_buffer(dist = 1000), join = st_within) %>%
  filter(year.x == year.y) 

这包括在 1000 米距离内没有其他站点的所有站点。它们只是连接到自身。如果你想删除那些你可以做的:filter(year.x == year.y & station_code.x != station_code.y)

关于r - 如何在sf R包中按组测量空间点之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57555890/

相关文章:

r - 使用 dplyr 计算变量变化的更简单方法?

scala 文本中单词之间的绝对最小距离

python - 计算图像中两个像素之间的距离

r - 让 Stargazer Column 标签打印在两行或三行上?

r - 解析不同格式的日期

r - 使用名称获取R中父函数的参数

algorithm - 在图中找到距离至少为 D(常数) 的两条路径

line - 一条直线上两点之间的postgis距离

opencv - 检索圆点

draw - Openlayer在Openlayer绘制功能中添加点