查找给定半径内最近的邻居点和邻居数

查找给定半径内最近的邻居点和邻居数

本文介绍了R-查找给定半径内最近的邻居点和邻居数,坐标为经纬度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图弄清楚某些点在我的数据集中是如何孤立的.我正在使用两种方法来确定隔离度,即最接近的邻居的距离和给定半径内的邻近站点的数量.我所有的座标都是经纬度

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.

谢谢.

推荐答案

最好的选择是使用库sprgeos,这使您可以构造空间类并执行地理处理.

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-查找给定半径内最近的邻居点和邻居数,坐标为经纬度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-06 06:21