如何使用sf R包按组测量空间点之间的距离

3
我有一个数据集,记录了不同国家在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")

我需要的是一个包含同一学年内,相距不超过1000米的所有位置对的csv文件。
1个回答

4

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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接