问题描述
我试图弄清楚某些点在我的数据集中是如何孤立的.我正在使用两种方法来确定隔离度,即最接近的邻居的距离和给定半径内的邻近站点的数量.我所有的座标都是经纬度
I am trying to figure out how isolated certain points are within my data set. I am using two methods to determine isolation, the distance of the closest neighbor and the number of neighboring sites within a given radius. All my coordinates are in latitude and longitude
这是我的数据:
pond lat long area canopy avg.depth neighbor n.lat n.long n.distance n.area n.canopy n.depth n.avg.depth radius1500
A10 41.95928 -72.14605 1500 66 60.61538462
AA006 41.96431 -72.121 250 0 57.77777778
Blacksmith 41.95508 -72.123803 361 77 71.3125
Borrow.Pit.1 41.95601 -72.15419 0 0 41.44444444
Borrow.Pit.2 41.95571 -72.15413 0 0 37.7
Borrow.Pit.3 41.95546 -72.15375 0 0 29.22222222
Boulder 41.918223 -72.14978 1392 98 43.53333333
我想在列邻居中输入最近的相邻池塘的名称,其纬度和经度分别在n.lat和n.long中,两个池塘之间的距离以n.distance,以及面积,树冠和avg .depth在每个适当的列中.
I want to put the name of the nearest neighboring pond in the column neighbor, its lat and long in n.lat and n.long, the distance between the two ponds in n.distance, and the area, canopy and avg.depth in each of the appropriate columns.
第二,我想将目标池塘的1500m范围内的池塘数设为半径1500.
Second, I want to put the number of ponds within 1500m of the target pond into radius1500.
有人知道一个可以帮助我计算所需距离/数字的函数或程序包吗?如果有问题,输入我需要的其他数据并不难,但是我真正需要帮助的是最近邻居的名字和距离以及1500m以内的池塘数量.
Does anyone know of a function or package that will help me calculate the distances/numbers that I want? If it's an issue, it won't be hard to enter the other data I need, but the nearest neighbor's name and distance, plus the number of ponds within 1500m is what I really need help with.
谢谢.
推荐答案
最好的选择是使用库sp
和rgeos
,这使您可以构造空间类并执行地理处理.
Best option is to use libraries sp
and rgeos
, which enable you to construct spatial classes and perform geoprocessing.
library(sp)
library(rgeos)
读取数据并将其转换为空间对象
Read the data and transform them to spatial objects:
mydata <- read.delim('d:/temp/testfile.txt', header=T)
sp.mydata <- mydata
coordinates(sp.mydata) <- ~long+lat
class(sp.mydata)
[1] "SpatialPointsDataFrame"
attr(,"package")
[1] "sp"
现在计算点之间的成对距离
Now calculate pairwise distances between points
d <- gDistance(sp.mydata, byid=T)
查找第二最短距离(最近的距离是指向自身的距离,因此请使用第二最短距离)
Find second shortest distance (closest distance is of point to itself, therefore use second shortest)
min.d <- apply(d, 1, function(x) order(x, decreasing=F)[2])
使用所需变量构建新数据框
Construct new data frame with desired variables
newdata <- cbind(mydata, mydata[min.d,], apply(d, 1, function(x) sort(x, decreasing=F)[2]))
colnames(newdata) <- c(colnames(mydata), 'neighbor', 'n.lat', 'n.long', 'n.area', 'n.canopy', 'n.avg.depth', 'distance')
newdata
pond lat long area canopy avg.depth neighbor n.lat n.long n.area n.canopy n.avg.depth
6 A10 41.95928 -72.14605 1500 66 60.61538 Borrow.Pit.3 41.95546 -72.15375 0 0 29.22222
3 AA006 41.96431 -72.12100 250 0 57.77778 Blacksmith 41.95508 -72.12380 361 77 71.31250
2 Blacksmith 41.95508 -72.12380 361 77 71.31250 AA006 41.96431 -72.12100 250 0 57.77778
5 Borrow.Pit.1 41.95601 -72.15419 0 0 41.44444 Borrow.Pit.2 41.95571 -72.15413 0 0 37.70000
4 Borrow.Pit.2 41.95571 -72.15413 0 0 37.70000 Borrow.Pit.1 41.95601 -72.15419 0 0 41.44444
5.1 Borrow.Pit.3 41.95546 -72.15375 0 0 29.22222 Borrow.Pit.2 41.95571 -72.15413 0 0 37.70000
6.1 Boulder 41.91822 -72.14978 1392 98 43.53333 Borrow.Pit.3 41.95546 -72.15375 0 0 29.22222
distance
6 0.0085954872
3 0.0096462277
2 0.0096462277
5 0.0003059412
4 0.0003059412
5.1 0.0004548626
6.1 0.0374480316
编辑:如果坐标以度为单位,并且您想以公里为单位计算距离,请使用软件包geosphere
if coordinates are in degrees and you would like to calculate distance in kilometers, use package geosphere
library(geosphere)
d <- distm(sp.mydata)
# rest is the same
如果这些点分散在地球上并且坐标以度为单位,则应该提供更好的结果
This should provide better results, if the points are scattered across the globe and coordinates are in degrees
这篇关于R-查找给定半径内最近的邻居点和邻居数,坐标为经纬度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!