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])
我需要计算两个点矩阵之间的最短距离。我是 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])