在地图上围绕纬度/经度绘制时间半径
Posted
技术标签:
【中文标题】在地图上围绕纬度/经度绘制时间半径【英文标题】:Draw time radius around lat/long on map 【发布时间】:2019-02-28 03:00:22 【问题描述】:我正在使用 R 中的 gmapsdistance
包。我有我的 API 密钥,并且我熟悉包中的功能。
但是,我想解决一个相反的问题。我想输入一个纬度/经度,而不是仅仅找到纬度/经度之间的Time
、Distance
和Status
,而是绘制一个可以驱动到的所有点的区域在 3 小时或更短的时间内。然后我想在谷歌地图上画这个。
首先,最好使用 Marimar, FL:25.9840, -80.2821。
有人遇到过这类问题吗?
【问题讨论】:
恐怕 Google Maps API 不提供时间驱动的多边形,您可以看看其他解决方案。例如。 gis.stackexchange.com/questions/46/… 或 igeolise.com/2016/02/how-to-create-drive-time-polygons 【参考方案1】:按照 cmets 中的建议,您可以注册像 Travel Time Platform(我在本例中使用的)这样的服务,并使用他们的 API 来获取给定起点的可能目的地。
然后您可以使用 Google 地图(在我的 googleway 包中)在地图上绘制它
appId <- "TravelTime_APP_ID"
apiKey <- "TravelTime_API_KEY"
mapKey <- "GOOGLE_MAPS_API_KEY"
library(httr)
library(googleway)
library(jsonlite)
location <- c(25.9840, -80.2821)
driveTime <- 2 * 60 * 60
## London example
## location <- c(51.507609, -0.128315)
## sign up to http://www.traveltimeplatform.com/ and get an API key
## and use their 'Time Map' API
url <- "http://api.traveltimeapp.com/v4/time-map"
requestBody <- paste0('
"departure_searches" : [
"id" : "test",
"coords": "lat":', location[1], ', "lng":', location[2],' ,
"transportation" : "type" : "driving" ,
"travel_time" : ', driveTime, ',
"departure_time" : "2017-05-03T08:00:00z"
]
')
res <- httr::POST(url = url,
httr::add_headers('Content-Type' = 'application/json'),
httr::add_headers('Accept' = 'application/json'),
httr::add_headers('X-Application-Id' = appId),
httr::add_headers('X-Api-Key' = apiKey),
body = requestBody,
encode = "json")
res <- jsonlite::fromJSON(as.character(res))
pl <- lapply(res$results$shapes[[1]]$shell, function(x)
googleway::encode_pl(lat = x[['lat']], lon = x[['lng']])
)
df <- data.frame(polyline = unlist(pl))
df_marker <- data.frame(lat = location[1], lon = location[2])
google_map(key = mapKey) %>%
add_markers(data = df_marker) %>%
add_polylines(data = df, polyline = "polyline")
【讨论】:
您的回答非常接近于解决我的问题Contours/Heatmap based on Transportation Time,但我需要在一定时间内找到您可以到达某个点的地方(而不是定义原点,我想给出目的地)。如果您能看一下,我将不胜感激。干杯。 @Masoud - 你是否在res
的每个 lon/lat 对之后构成轮廓?
有点,我需要找到你可以在一个小时内到达目的地的点。因此,它与res
不同,因为您知道传输时间是不可逆的。撇开这个不说,我不需要知道每个点,只要我能以合理的分辨率制作轮廓即可。
@Masoud 我不确定我目前是否知道解决方案,特别是如果您需要准确的驾驶时间,因为这需要多次 API 调用(使用 Google 或 Travel Time)
是的,这就是我要避免的,因为它的计算成本很高,但似乎是唯一的解决方案。谢谢。【参考方案2】:
如果你想在传单中渲染并使用免费的等时服务,这是一个非常好的选择。不过有2小时车程的限制。
devtools::install_github("tarakc02/rmapzen")
library(rmapzen)
Sys.setenv(MAPZEN_KEY = "") # get for free at https://mapzen.com/
marimar <- mz_geocode("Marimar, FL")
isos <- mz_isochrone(
marimar,
costing_model = mz_costing$auto(),
contours = mz_contours(c(60 * 2)) # 2 hours
)
library(leaflet)
leaflet(as_sp(isos)) %>%
addProviderTiles("CartoDB.DarkMatter") %>%
addPolygons(color = ~paste0("#", color), weight = 1)
【讨论】:
mapzen api 目前似乎已停止服务(至少对新用户不可用); 20118 年 12 月 12 日以上是关于在地图上围绕纬度/经度绘制时间半径的主要内容,如果未能解决你的问题,请参考以下文章