目前,我正在R中对出租车数据集进行空间分析。数据集给出了lat-long坐标对来表示某人被拾起和放下的地方,我也在使用具有明确定义的街道交叉点节点的道路网络。我正在寻找一种方法,在参考系统中给出一对坐标时找到最近的街道交叉点:
nearestNeighborID <- someFunction(myNetwork, xCoordinate, yCoordinate)
我相信R的sp或igraph包中可能有这样的功能,但我还没有找到任何东西:只有一个gdistance函数可以计算两个给定点之间的距离。有没有人知道R中的这样一个函数,当你在空间中给出一个xy点时,你可以在网络中找到最近的顶点/特征?
此外,这是我的网络和一些拾取/降落位置的示例。我很抱歉它有点乱,但是相当有组织的广场是街道网络,散布的点是我希望近似到最近的街道交叉点的位置(一个例子是带有模糊ID的右下角点号码):https://imgur.com/Max9bBi。
答案 0 :(得分:0)
这似乎不是图形问题,而是一个简单的距离问题。
步骤1:将图形转换为每个交叉点的x,y数据帧。由于我们不知道交叉口和出租车的位置数据如何在图表中表示,因此我无法提供任何代码。
第2步:
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
答案 1 :(得分:0)
R有一个名为RANN
的包,它有一个函数nn2
:这个函数允许你传入一个你希望找到邻居的点矩阵,即你观察到的Taxi lat-long拾取点,以及你用来找到邻居的第二个点矩阵,即你的网络的街道交叉点。你甚至可以设置一个标志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
- 以下答案可能对希望在SINGLE矩阵中找到所有点的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