首页 > 解决方案 > 如何从参考坐标中选择“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]

由于某种原因,这段代码给了我错误的分配。有没有人有更好的主意?

太感谢了!!

标签: rcoordinates

解决方案


我正在对您的目标做出一些假设,因为您的代码有一个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以表明代码应该可以工作


推荐阅读