在地图上围绕纬度/经度绘制时间半径

Posted

技术标签:

【中文标题】在地图上围绕纬度/经度绘制时间半径【英文标题】:Draw time radius around lat/long on map 【发布时间】:2019-02-28 03:00:22 【问题描述】:

我正在使用 R 中的 gmapsdistance 包。我有我的 API 密钥,并且我熟悉包中的功能。

但是,我想解决一个相反的问题。我想输入一个纬度/经度,而不是仅仅找到纬度/经度之间的TimeDistanceStatus,而是绘制一个可以驱动到的所有点的区域在 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 日

以上是关于在地图上围绕纬度/经度绘制时间半径的主要内容,如果未能解决你的问题,请参考以下文章

在地图上绘制点,经度和纬度保持部门之间的边界

如何在等值线图上绘制出现点(经度/纬度)?

什么是用于在世界地图上绘制纬度/经度对的易于使用的 API?

如何找到给定纬度/长度以北x km的纬度/经度?

批量绘图 EXCEL绘制基站扇区地图

地球经纬度到 3D 球体上的纬度和经度