从SpatialPointsDataFrame中的每个点到第二个shapefile中最近的点/线的最快笛卡尔距离(R)

问题描述 投票:0回答:1

我想知道最快的算法,用于获得SpatialPointsDataFrame(X)中每个点与(a)第二个SpatialPointsDataFrame(Y)中最近点或(b)最接近线之间的笛卡尔距离SpatialLinesDataFrame(Y)中的细分。因此,这基本上是2个问题,答案可能相同。

对于这些行,我知道我可以使用dist2Line(X,Y, distfun=distGeo),但这太慢了。在将nncrossX都转换为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]

[基本上,我的希望是为每种目的找到最快的算法(到最近点的距离,到最近的线的距离),其输出以笛卡尔距离或可转换为笛卡尔距离。谢谢!

r knn sp ppp
1个回答
0
投票

[有人将我引向一个可能的答案,即找到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中最近的线的米/公里。

© www.soinside.com 2019 - 2024. All rights reserved.