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

rro*_*rn0 3 gis r

我需要计算两点矩阵之间的最短距离。我是 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
Run Code Online (Sandbox Code Playgroud)

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

Spa*_*man 5

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

> require(rgdal)
> uk_coord = spTransform(uk_coord, CRS("+init=epsg:27700"))
> ire_coord = spTransform(ire_coord, CRS("+init=epsg:27700"))
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用 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 ...
Run Code Online (Sandbox Code Playgroud)

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])
Run Code Online (Sandbox Code Playgroud)

最近的邻居