我试图根据交通时间绘制等高线。为了更清楚,我想将具有相似旅行时间(假设10分钟间隔)的点聚集到特定点(目的地),并将其绘制为等高线或热图。
现在,我唯一的想法是使用R包***gmapsdistance
来找到不同起点的旅行时间,然后将它们聚类并绘制在Map上。但是,正如你所看到的,这绝不是一个健壮的解决方案。
GIS-community上的thread和python上的this one***说明了一个类似的问题,但是对于在特定时间内到达的目的地的起点。我想找到我可以在特定时间内到达目的地的起点。
现在,下面的代码展示了我的基本想法(使用R):
library(gmapsdistance)
set.api.key("YOUR.API.KEY")
mdestination <- "40.7+-73"
morigin1 <- "40.6+-74.2"
morigin2 <- "40+-74"
gmapsdistance(origin = morigin1,
destination = mdestination,
mode = "transit")
gmapsdistance(origin = morigin2,
destination = mdestination,
mode = "transit")
这张Map也可以帮助理解这个问题:
使用这个***答案***我可以得到我可以从起点到达的点,但我需要反转它并找到旅行时间等于-小于-某个时间到达目的地的点;
library(httr)
library(googleway)
library(jsonlite)
appId <- "TravelTime_APP_ID"
apiKey <- "TravelTime_API_KEY"
mapKey <- "GOOGLE_MAPS_API_KEY"
location <- c(40, -73)
CommuteTime <- (5 / 6) * 60 * 60
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" : ', CommuteTime, ',
"departure_time" : "2017-05-03T07:20: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")
此外,*旅行时间Map平台的文档*谈到多起点与到达时间这正是我想做的事情。但我需要为公共交通和驾驶(通勤时间不到一小时的地方)做这件事,我认为由于公共交通很棘手(基于您靠近的车站),也许热图是比轮廓更好的选择。
2条答案
按热度按时间vzgqcmou1#
这个答案是基于获得一个(大致)等距点的网格之间的起点-目的地矩阵。这是一个计算机密集型操作,不仅因为它需要大量的API调用Map服务,而且因为服务器必须为每个调用计算一个矩阵。所需的调用数量沿着网格中的点的数量呈指数增长。
为了解决这个问题,我建议您考虑在本地机器或本地服务器上运行Map服务器。Project OSRM提供了一个相对简单,免费和开源的解决方案,使您能够在Linux Docker中运行OpenStreetMap服务器(https://github.com/Project-OSRM/osrm-backend)。拥有自己的本地Map服务器将允许您根据需要进行尽可能多的API调用。的osrm包允许您与OpenStreetMaps的API进行交互,包括放置在本地服务器上的API。
我创建了一个围绕布鲁塞尔(比利时)城市群的96个大致等距点的网格。这个网格没有考虑地球的曲率,在城市距离的水平上可以忽略不计。
为了方便起见,我使用光栅包下载比利时的ShapeFile并提取布鲁塞尔市的节点。
结果
蓝色的等值线代表到市中心最多8分钟的距离,红色的等值线代表最多15分钟的距离。
hsvhsicv2#
我提出了一种方法,与进行大量的API调用相比,它是适用的。
我们的想法是找到你可以在一定的时间到达的地方(看看这个线程)。交通可以通过改变时间从早上到晚上来模拟。你最终会得到一个重叠的区域,你可以从两个地方到达。
然后你可以使用Nicolas answer,在重叠区域内绘制一些点,并为你的目的地绘制热图。这样,你将有更少的区域(点)覆盖,因此你将少得多的API调用(记住使用适当的时间)。
下面,我试着演示一下我的意思,并让你明白,你可以制作另一个答案中提到的网格,使你的估计更可靠。
这显示了如何Map相交区域。
可以像这样提取相交区域:
这只是相交区域的图示。
现在,你可以从
xdf
dataframe中获取坐标,并围绕这些点构建网格,最终得出一个热图.为了尊重提出这个想法/答案的其他用户,我没有将其包含在我的中,只是引用它.Nicolás Velásquez -在(大致)等距点的网格之间获得起点-终点矩阵