r - 如何从参考坐标中选择“N”公里内的坐标
问题描述
我有两个数据框,一个带有来自 26 个站点的“参考坐标”,另一个带有许多坐标,这些坐标是不同物种的分布点。我想知道在距离每个站点坐标 20 公里的半径范围内发现了哪些物种,所以最后,我可以制作一个存在/不存在矩阵,其中站点为行,物种为列,0 表示不存在和 1 表示存在。
参考坐标(26 个站点)
Locality Latitude Longitude
1 Daraina -13.20806 49.55667
2 Manongarivo -14.01483 48.37702
3 Tsaratanana -13.95306 48.86389
4 Marojejy -14.43734 49.68415
5 Tampolo (Masoala) -15.73177 49.97742
6 Sahamalaza (Masoala) -15.73333 50.21667
分布坐标(2911点)
Species latS longE
1 Beccariophoenix alfredii -20.20833 46.50111
2 Beccariophoenix fenestralis -19.01667 48.81361
3 Beccariophoenix fenestralis -18.97917 48.85444
4 Beccariophoenix fenestralis -18.96056 48.85583
5 Beccariophoenix fenestralis -18.95417 48.85583
6 Beccariophoenix madagascariensis -24.77667 47.14917
我试过这个:
library(gmt)
RefCoord <- read.csv("RefCoord.csv", header=TRUE)
SpeciesCoord <- read.csv("SpeciesCoord.csv", header=TRUE)
list = list2 = c()
for(j in 1:length(SearchCoord$latS)){
for(jj in 1:length(RefCoord$Latitude)){
if(RefCoord$Latitude[jj]==SearchCoord$latS[j]&RefCoord$Longitude[jj]==SearchCoord$longE[j]){
distance = 0
}else{distance = geodist(RefCoord$Latitude[jj],RefCoord$Longitude[jj],SearchCoord$latS[j],SearchCoord$longE[j],units="km")}
if(distance<=20){
list = c(list, j)
list2 = c(list2, as.character(RefCoord$Locality[jj]))
}
}
}
searchList <- list
refList <- as.character(list2)
searchList <- unique(searchList)
finalData <- SearchCoord[searchList,]
finalData$locality <- refList[searchList]
由于某种原因,这段代码给了我错误的分配。有没有人有更好的主意?
太感谢了!!
解决方案
我正在对您的目标做出一些假设,因为您的代码有一个SearchCoord
您没有提供的对象,所以我假设那是SpeciesCoord
.
使用该geodist
函数,您可以拥有一个参考点的坐标矢量,从而无需双循环。例如,下面的代码给出了从第一个地点到所有物种的距离(反之亦然,所以给出所有地点和一个物种,但不幸的是,我认为你不能同时给出两者的向量):
geodist(RefCoord$Latitude[1],RefCoord$Longitude[1],SpeciesCoord$latS,SpeciesCoord$longE,units="km")
因此,您可以将所有距离计算到一个列表中,然后根据该列表的逻辑条件构造一个矩阵:
dist_list <- lapply(1:nrow(RefCoord), function(i) geodist(RefCoord$Latitude[i],RefCoord$Longitude[i],SpeciesCoord$latS,SpeciesCoord$longE,units="km"))
mat <- matrix(unlist(lapply(dist_list, function(val) as.numeric(val <= 600))), nrow = 6, ncol = 6, byrow = T)
colnames(mat) = SpeciesCoord$Species
rownames(mat) = RefCoord$Locality
对于您提供的数据,没有一个物种在20公里以内,所以我将其更改为600以表明代码应该可以工作
推荐阅读
- java - 收到错误为“SQL 状态:08001 找不到适合 jdbc:oracle:thin:@128:23:44:01:12345:pppp_rr 的驱动程序
- python - 当我运行相同的 python 代码但在 for 循环中时,为什么我的 matplotlib 条形图会发生变化
- swift - 如何在 Swift 中隐藏“共享连接”栏?
- android - 如何在 Android OpenGL ES3.0 中向表面添加位图/图像纹理?
- javascript - 使用 KonvaJS 删除应用的过滤器
- react-native - 需要能够在 componentdidmount 上下载给定 BASE64 字符串的 PDF
- python - OpenCV Python - cv2.groupRectangles() 返回空元组
- python - 如何将所有 cloudtrail 日志移动到一个集中位置
- java - Nullpointerexception 通过更改活动
- r - R:通过一列开始和结束日期切割时间序列的测量值