R:计算两个点层之间的最短距离

R: Calculating the shortest distance between two point layers

我需要计算两个点矩阵之间的最短距离。我是 R 的新手,不知道该怎么做。这是我用来调用数据并将它们转换为点的代码

library(dismo)  
laurus <- gbif("Laurus", "nobilis")
locs <- subset(laurus, select = c("country", "lat", "lon"))
#uk observations
locs.uk <-subset(locs, locs$country=="United Kingdom")
#ireland observations
locs.ire <- subset(locs, locs$country=="Ireland")

uk_coord <-SpatialPoints(locs.uk[,c("lon","lat")])
ire_coord <-SpatialPoints(locs.ire[,c("lon","lat")])
crs.geo<-CRS("+proj=longlat +ellps=WGS84 +datum=WGS84")  # geographical, datum WGS84
proj4string(uk_coord) <-crs.geo #define projection
proj4string(ire_coord) <-crs.geo #define projection

我需要计算从爱尔兰的点到英国的点的最短距离(欧几里得)。换句话说,我需要计算从爱尔兰的每个点到英国点层中它的壁橱点的距离。 有人能告诉我为了做到这一点我需要使用什么功能或包吗?我查看了 gdistance,但找不到计算最短距离的函数。

gDistance() 来自 rgeos 包会给你距离矩阵

library(rgeos)
gDistance(uk_coord, ire_coord, byid = TRUE)

另一个选项是 spatstat 包中的 nncross()。 Pro:它给出了到最近邻居的距离。相反:您需要将 SpatialPoints 转换为 SpatialPointPattern(请参阅 statstat 中的 ?as.ppp

library(spatstat)
nncros(uk.ppp, ire.ppp)

geosphere 提供了很多 dist* 函数来计算两个 lat/lon 点的距离。在您的示例中,您可以尝试:

 require(geosphere)
 #get the coordinates of UK and Ireland
 pointuk<-uk_coord@coords
 pointire<-ire_coord@coords
 #prepare a vector which will contain the minimum distance for each Ireland point
 res<-numeric(nrow(pointire))
 #get the min distance
 for (i in 1:length(res)) res[i]<-min(distHaversine(pointire[i,,drop=FALSE],pointuk))

您将获得的距离以米为单位(您可以通过在对 distHaversine 的调用中设置地球半径来更改)。

gDistance 和其他 rgeos 函数的问题在于它们计算距离时坐标是平面的。基本上,你得到的号码用处不大。

您可以使用 FNN 包,它使用空间树来提高搜索效率。它适用于欧氏几何,因此您应该将您的点转换为平面坐标系。我将使用 rgdal 包转换为英国网格参考(将其拉伸一点以在爱尔兰使用它,但您的原始数据是纽约,您应该为此使用纽约平面坐标系统):

> require(rgdal)
> uk_coord = spTransform(uk_coord, CRS("+init=epsg:27700"))
> ire_coord = spTransform(ire_coord, CRS("+init=epsg:27700"))

现在我们可以使用 FNN 了:

> require(FNN)
> g = get.knnx(coordinates(uk_coord), coordinates(ire_coord),k=1)
> str(g)
List of 2
 $ nn.index: int [1:69, 1] 202 488 202 488 253 253 488 253 253 253 ...
 $ nn.dist : num [1:69, 1] 232352 325375 87325 251770 203863 ...

g 是距离 69 爱尔兰点最近的英国点的索引和距离列表。距离以米为单位,因为坐标系以米为单位。

您可以通过绘制点然后连接爱尔兰点 1 到英国点 202、爱尔兰 2 到英国 488、爱尔兰 3 到英国 202 等来说明这一点。在代码中:

> plot(uk_coord, col=2, xlim=c(-1e5,6e5))
> plot(ire_coord, add=TRUE)
> segments(coordinates(ire_coord)[,1], coordinates(ire_coord)[,2], coordinates(uk_coord[g$nn.index[,1]])[,1], coordinates(uk_coord[g$nn.index[,1]])[,2])