我想知道最快的算法,用于获得SpatialPointsDataFrame(X
)中每个点与(a)第二个SpatialPointsDataFrame(Y
)中最近点或(b)最接近线之间的笛卡尔距离SpatialLinesDataFrame(Y
)中的细分。因此,这基本上是2个问题,答案可能相同。
对于这些行,我知道我可以使用dist2Line(X,Y, distfun=distGeo)
,但这太慢了。在将nncross
和X
都转换为ppp对象之后,我还尝试使用Y
,如下所示。这是行不通的;热映射的新距离度量显示它没有从Y
辐射。
X_ppp <- as(X, "ppp")
Y_psp <- as(Y, "psp")
distR <- nncross(X_ppp,Y_ppp,what="dist",k=1)
X$dist2road <- distR
对于行,我也尝试使用gDistance(X,Y)
,但遇到错误,对于i = 1,2:Spatial object i is not projected; GEOS expects planar coordinates
。我认为这是因为我使用的是lat-lon,它需要一个真实的投影。但是我正在使用的所有文件都是lat-lon,并且我不确定如何选择和指定投影(对于坦桑尼亚),而不会从另一个文件中解决它。
对于点,再次使用nncross
方法会导致绝对错误的距离。 (在每个点和线的情况下,这是因为输出向量的排序方式与X内的点不同吗?如果是这样,我现在看到的是为X内的点输出ID的方法。)
也要注意,下面的此knn
代码确实起作用。但这显然不在笛卡尔距离内,因此我想将其转换或找到其他提供笛卡尔距离的算法。
knn.results = knn(data=coordinates(market.shp),
query=coordinates(tzprice.shp), k=1)
knn.results <- data.frame(knn.results)
tzprice.shp$dist2market <- knn.results[,2]
[基本上,我的希望是为每种目的找到最快的算法(到最近点的距离,到最近的线的距离),其输出以笛卡尔距离或可转换为笛卡尔距离。谢谢!
[有人将我引向一个可能的答案,即找到SpatialPointsDataFrame(X
)中每个点与第二个SpatialPointsDataFrame(我们称为Y
)中最接近点之间的笛卡尔距离。所以这是我的问题的上半部分……也许那里有一个更快的方法,但是这种方式非常快,并且至少以proj = longlat的形式,它以Km返回答案。
tree <- createTree(coordinates(Y))
inds <- knnLookup(tree, newdat=coordinates(X), k=1)
distkm <- sapply(seq_len(nrow(inds)), function(i) spDists(X[i, ], Y[inds[i, ],]))
仍在寻找一种算法,该算法可以快速地找到X
中每个点到SpatialLinesDataFrame中最近的线的米/公里。