r - 如何在sf R包中按组测量空间点之间的距离
问题描述
我有一个数据集,其中包含 13 年期间不同国家的动物记录、xy 坐标(以米为单位)和发现动物的年份。我想知道如何测量每个点的三个最近邻居之间的距离(以米为单位),但仅在同一年的调查点内测量此距离。我想找出哪些位置对彼此之间的距离小于 1000m,并获得这些位置的 csv。
我正在使用包 sf 并且我能够估计点之间的距离,但不能按年份进行子设置。我发现包 'spatstat' 可以用 'nndist' 做到这一点,但是我发现设置请求的窗口和理解我需要使用的点模式对象很复杂。我是 R 的新手,使用不同类型的对象和不同的包对我来说非常复杂,所以我想知道在 sf.xml 中是否有一种简单的方法可以做到这一点。我愿意接受有关如何最有效地执行此操作的建议,如果您建议使用其他包或其他方式,请帮助我提供将我的数据转换为该包所需的对象类型的代码。
谢谢!
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 文件,其中包含同一年学习的所有位置对,它们之间的距离小于 1000m。
解决方案
-packagesf
很容易集成到dplyr
-framework 中。这会在每个点周围创建一个半径为 1000 m 的圆,trial.sp
并通过 -function 将其连接到原始数据集st_within
。
trial.sp %>%
st_join(trial.sp %>% st_buffer(dist = 1000), join = st_within) %>%
filter(year.x == year.y)
这包括在 1000 m 距离内没有其他站点的所有站点。它们只是连接到自身。如果你想删除那些你可以做的:filter(year.x == year.y & station_code.x != station_code.y)
推荐阅读
- webpack - Vuejs 模块未找到错误无法使用 webpack 解决 '@/components/ 错误
- javascript - readAsDataURL 不是 blob,但图像显示
- javascript - 无法从 AJAX 更新 mysqli 中的日期
- ios - 在视图大小更改时更改 UIView 阴影大小会产生奇怪的效果
- python - 如何在 Windows 上将目录路径作为用户输入?
- docker - debian 官方 docker 镜像多久在 docker hub 上重建和发布一次
- python-3.x - 使用链表打印给定的输入
- javascript - 从填充的号码中取消填充号码
- javascript - 用 datalist JS 显示变量内容/将一些输出标记为变量名
- c - 使用递归的 C 到 MIPS 十进制到二进制转换器