【问题标题】:Find nearest vertex in a network when given coordinates给定坐标时在网络中查找最近的顶点
【发布时间】:2018-07-30 12:10:32
【问题描述】:

目前,我正在 R 中对出租车数据集进行空间分析。该数据集提供了经纬度坐标对来表示有人在哪里被接送,我也在使用具有明确定义的街道交叉点节点的道路网络。当给定参考系统中的一对坐标时,我正在寻找一种方法来找到最近的街道交叉口:

nearestNeighborID <- someFunction(myNetwork, xCoordinate, yCoordinate)

我相信 R 的 sp 或 igraph 包中可能有这样的函数,但我还没有找到任何东西:只有一个 gdistance 函数,它计算两个给定点之间的距离。有人知道 R 中有这样一个函数,当给定空间中的 xy 点时,您可以在其中找到网络中最近的顶点/特征?

另外,这是我的网络和一些接送地点的示例。我很抱歉它有点乱,但是相当有条理的广场是街道网络,散布的点是我希望近似于最近的街道交叉口的位置(一个例子是右下角的模糊 ID号码):https://imgur.com/Max9bBi

【问题讨论】:

  • 请创建一个包含数据和预期输出的可重现示例:stackoverflow.com/questions/5963269/…
  • 这听起来更像是 GIS 问题而不是图形问题。
  • @emilliman5 没有可重复的例子,因为它是我正在寻找的例子本身。如果我能够重现给定两个坐标找到最近顶点的示例,我的问题不会得到解决吗?我的问题被推广到任何 xy 坐标数据,并且我已经说明了我正在寻找的函数的形式(以及它的预期行为)。
  • 一个可重现的例子并不一定意味着你的问题已经解决了。可重现的示例意味着您提供了您正在使用的数据的示例以及您为尝试自己解决问题而编写的任何代码。边缘代表什么,交叉点的位置如何表示?为什么出租车和十字路口在同一个网络中?它们的边缘代表什么?您是否使用经度和纬度或其他坐标系?请阅读我在第一条评论中发布的链接,因为它提供了有价值的信息。

标签: r igraph spatial nearest-neighbor sp


【解决方案1】:

R 有一个名为 RANN 的包,它有一个函数 nn2:此函数允许您传入一个您希望为其找到邻居的点矩阵,即您观察到的出租车经纬度上车点,以及用于查找邻居的第二个点矩阵,即网络的街道交叉口。您甚至可以设置一个标志searchtype="radius" 来搜索一定距离内的邻居;否则,报告找不到邻居(或小于 k 个邻居)。

因此,您可能运行的一行代码可能是:nearestNeighborIDs <- nn2(data=networkStreetIntersections, query=taxiPickupLocations, searchtype="radius", radius= ...)。这将返回每个出租车上车地点的综合列表,以及它在提供的街道网络中最接近的街道交叉口。

RNN 文档和nn2 手册页:

https://cran.r-project.org/web/packages/RANN/index.html https://cran.r-project.org/web/packages/RANN/RANN.pdf

-- 以下答案可能对希望为单个矩阵中的所有点找到 k 个最近邻的未来读者有用:

在R的spdep包(包手册:https://cran.r-project.org/web/packages/spdep/spdep.pdf)中,有一个名为knearneigh的函数。该函数生成一个点的 k 个最近邻;如果您设置 k=1,您将找到 个最近点,这可能被解释为街道交叉口。

一般用法:knearneigh(x, k=1, longlat = NULL, RANN=TRUE),其中 x 表示您的点坐标矩阵(或 SpatialPoints 对象,可以使用 sp 包创建) https://www.rdocumentation.org/packages/spdep/versions/0.7-4/topics/knearneigh

【讨论】:

    【解决方案2】:

    这似乎不是一个图形问题,而是一个简单的距离问题。

    第 1 步:将您的图表转换为每个交叉点的 x,y 数据框。由于我们不知道十字路口和出租车的位置数据如何在图表中表示,因此我无法提供任何代码。

    第二步:

    require(proxy)
    ##creating some example data 100 intersections and 10 taxis
    road <- data.frame(Intersection=sapply(1:100, function(x) paste(sample(x= LETTERS, size=10, replace=T), collapse = "")),
                       lat=runif(100, 0, 360), lon=runif(100, 0, 360))
    taxis <- data.frame(ID=1:10,
                        lat=runif(10, 0, 360), 
                        lon=runif(10, 0, 360))
    
    #Calculate the distance between each taxi and every intersection using euclidean distance
    taxiDist <- proxy::dist(road[, -1], taxis[, -1])
    #Find the index for closest intersection for each taxi
    idx <- apply(taxiDist, 2, which.min)
    #Retrieve the intersection data
    road[idx, ]
    
    # Intersection       lat       lon
    # 24     DUCHJURDLJ 164.09897 260.50476
    # 21     EXRQAWKCKQ 202.20218 178.14160
    # 38     NQSTQUXZUF 341.12904   7.55647
    # 3      MDTSSWSFVR  62.83737 118.75232
    # 38.1   NQSTQUXZUF 341.12904   7.55647
    # 24.1   DUCHJURDLJ 164.09897 260.50476
    # 40     PEQOUTLIBR 357.45814 155.44159
    # 60     TVJOCWZULB 342.14584 234.12673
    # 28     MBQQVURJXR 111.19420 215.96506
    # 98     FVRXXXJZTO 129.10932 321.22990
    

    【讨论】:

    • >由于我们不知道十字路口和出租车的位置数据如何在图中表示,我无法提供任何代码。尽管我确实明确指出这些以经纬度坐标对表示,但我仍在寻找一个通用示例。另外,通过计算所有其他节点之间的距离并选择最短的,这不是计算这个问题的一种非常低效的方法吗?
    • 这个例子非常笼统,因为它将采用任何坐标(2,3,4,5,...,k)并找到最近的邻居。至于效率,这取决于你的意思。这不会非常节省内存,但与某种循环(内存效率更高)相比,它是时间高效的(矩阵数学非常快)。你没有给出任何关于数据大小或效率要求的细节,所以我提供了最直接的解决方案。我会重申这是一个地理(GIS)问题而不是图形问题,我相信任何数量的 GIS 包都会有更高级的方法
    • 感谢有关 GIS 软件包的提示,但这确实是我寻求的唯一答案;我不是要实际代码甚至是 peusocode,只是要执行某些“查找最近邻”算法的 GIS 包或 GIS 包函数的名称;这就是为什么我没有包含代码或我的原始数据的原因,因为我实际上并不是在寻找那种答案。另外,我的错误,我的意思是计算效率和 big-Oh 一样,感谢您为将来可能阅读本文的人解决了这两个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多