【问题标题】:How to find nearest road to single pair of latitude/longitude coordinates using R?如何使用R找到到单对纬度/经度坐标的最近道路?
【发布时间】:2018-06-18 22:38:54
【问题描述】:

我有一个不同位置的几百个经纬度坐标对的列表。我的目标是使用 R 估算从“家”位置到每个坐标对的行驶时间。

我在 R 中使用 googleway 包取得了一些成功,但是(可以预见)在远离道路的位置遇到了问题,例如如果坐标是山顶。在这些情况下,我想估计到每个有问题的坐标对的最近道路的行驶时间。

为了说明,假设我的家庭位置是;

home <- "Edinburgh, UK"

...以及我想要查找的驾驶时间的示例数据框;

location <- c("place_a", "place_b", "place_c") 
latitude <- c("56.87034", "57.69380", "57.36243")
longitude <- c("-4.199001", "-5.128715", "-5.104728")

df <- data.frame(location, latitude, longitude) 

我可以使用类似的东西获得homeplace_a之间以及homeplace_b之间的距离/持续时间等;

(注意。您需要自己的 Google Maps api 密钥来复制此部分...)

library(googleway)
api_key <- [insert your Google Maps api key here!]

results <- google_distance(origins = home,
                  destinations = list(c("56.87034,-4.199001"),
                                      ("57.69380,-5.128715")),
                  mode = "driving",
                  key = api_key,
                  units = "imperial")

我得到了我想要使用的所有数据:

results$rows[[1]]

但是,当我们对 place_c 的坐标尝试相同的坐标时,我们遇到了麻烦,它返回 ZERO_RESULTS

results2 <- google_distance(origins = home,
              destinations = ("57.36243,-5.104728"),
              mode = "driving",
              key = api_key,
              units = "imperial")

我认为这里的问题是坐标是半山腰,所以在这种情况下,我想找到离坐标最近的道路。我希望对googlewaynearest_road 函数有一些运气,但似乎无法让它工作,例如这样的东西不起作用;

df_points <- read.table(text = "lat lon
                     57.36243 -5.104728", header = T)

nearest_road <- google_nearestRoads(df_points, key = api_key)

谁能告诉我这里的问题是什么?还是完全提出更好的解决方案?!

非常感谢。

【问题讨论】:

  • 我只能猜测它离公路太远了,找不到。我必须将坐标移动到57.14743 -5.054728 才能正常工作。我在Google's documentation 中也看不到任何关于它必须离道路多近的信息。另一种方法可能是在苏格兰查找道路形状文件并使用地理空间操作,而不是 Google 的 API。
  • 感谢@SymbolixAU。多亏了下面有用的帖子和googleways google_distance 函数的组合,我最终到达了那里,以使用gmapsdistance 克服错误。

标签: r google-maps latitude-longitude googleway


【解决方案1】:

我正在处理这个问题,这个问题很快就会在 github 上发布(称为 spaceheater)。同时:

我会从 geofabrik 下载您正在使用的国家/地区的 Open Street Maps shapefile。例如尼日利亚:http://download.geofabrik.de/africa/nigeria.html

根据猴子网球的建议编辑(谢谢!):

library(sp)
library(rgdal)
library(raster)
library(googleway)
library(geosphere)
library(foreach)
###I did Nigeria because I have it in my file downloaded, you would use UK###
roadshp <- readOGR(dsn="nigeria-latest-free.shp", 
layer="gis.osm_roads_free_1")
#Isolate primary roads (or secondary and tertiary) if you wish#
roads <- roadshp[roadshp$fclass %in% c("primary", "secondary", "tertiary"),]
#Use SpatialPoints for your gps coords
location <- c("place_a", "place_b", "place_c")
latitude <- c(8.641, 10.892, 11.797)
longitude <- c(6.0046, 11.146, 5.477)
df <- data.frame(location, latitude, longitude)
coordinates(df)=~longitude+latitude
sp1 <- SpatialPoints(df)
proj4string(sp1)=CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84
                 +towgs84=0,0,0")
clodist <- dist2Line(sp1, roads)
df <- as.data.frame(df)
df$clodist <- clodist[,c("distance")]
df$lat <- clodist[,c("lat")]
df$lon <- clodist[,c("lon")]
iters <- nrow(df)
origin <- as.character("9.056, 7.497")
gc1 <- data.frame(round(df[,c("lat")],3), round(df[,c("lon")],3))
colnames(gc1) <- c("lat","lon")
df$lat <- as.character(gc1$lat)
df$lon <- as.character(gc1$lon)
gt2 <- paste(df[,c("lat")], df[,c("lon")], sep=",")
results <- google_distance(origins =origin, destinations= gt2,
            mode="driving",
            key="Your API Key Here")
results <-unlist(results)
results <- as.data.frame(results)
ttt <- head(results,-1)
ttt <- ttt[-c(iters+1), ]
m1 <- matrix(ttt, ncol=iters, byrow=TRUE)
distance <- as.data.frame(m1)
rownames(distance) <- c("Address", "DistanceKM", 
"DistanceM","TimeTextLow","TimeSecondsLow","TimeTextHigh","TimeSecondsHigh", 
"Status")

【讨论】:

  • 谢谢@Neal!这是一个很大的努力和超级有用的,非常感谢。我疲惫的旧笔记本电脑花了一整天的时间完成clodist &lt;- dist2Line(sp1, roads) 行,但我最终到达了那里。我必须对上述内容进行的一项更改是将googlewaygoogle_distance 替换为gmapsdistance 代码块。原文抛出错误:Error in rowXML[[dur]] : subscript out of bounds。似乎是一个常见问题,但我不知道如何解决它。我会留意你的空间加热器包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
相关资源
最近更新 更多