不用百度API也能计算驾驶距离——OSMnx计算多点驾车距离

不用百度API也能计算驾驶距离——OSMnx计算多点驾车距离

近期有一个项目,第一步就需要计算多个(大约4000个)点对间的驾驶距离以及驾驶时间。一开始想到的自然是百度API了(lbsyun.baidu.com/index.)。结果一看手册,日配额给了2000次。。。仔细一看,可以认证开发者,然后我就屁颠屁颠的去认证了,额度就提升到了,,30000次。

我试了一下,百度果然是一毛不拔,30000不多不少,一到就溢出:

4000*4000/30000=533,也就是我要533天才能把我的矩阵算出来。这显然行不通啊,500天项目早就黄了。然后去网上搜了半天,怎么绕开调用限制,基本没有很好的解决方法,仅仅在官网上找到这个:

2万块钱我做完这个项目都赚不到。。没办法,于是就想到了OpenStreetMap。OpenStreetMap基本接触过地图处理的人都有听过,一个完全开源免费的地图库,做开发处理都非常强大。现将整个过程整理如下,希望大家能少走弯路。

安装包
OSMnx documentationosmnx.readthedocs.io

老套路,用python来开发。OpenStreetMap给PY的接口是OSMnx。安装方法参考上面的链接。我试了前面两种都失败了,最后一种才成功:

conda create --override-channels -c conda-forge -n OSMNX python=3 osmnx
source activate OSMNX

这种方法非常的绝,大概意思就是你家之前的各种乌七八糟的PY环境我一概不管,为了安装这个包,我完全重新构建了一个新的环境(建议PY3.6)。So,它的成功率自然也高。

安装成功后,在新的环境下建一个Project,输入:

import osmnx as ox
import networkx as nx
import os

如果没有报错,那就成功了。

下载地图

安装成功后,后面的工作就快了。第一步当然是下载上海的路网:

G = ox.graph_from_place('Shanghai, China', which_result=2, network_type='drive')
fig, ax = ox.plot_graph(ox.project_graph(G))
ox.save_graphml(G, filename='STREETGRAPH_FILENAME')

会有一点点的慢,耐心等候,大约有40M,好像不翻墙也不影响下载速度,反正就是慢。绘制则更慢,建议先保存。绘制出来后长这样(两个小点点是我后面加上去的,先忽视它们):

因为我设置的是驾驶路网,所以会相对比较稀疏,但是整个规模还是没问题的,很强大~

计算最短路径

思路是给出经纬度(GCJ的经纬度,也就是谷歌、腾讯地图的那个,不是84也不是百度),然后计算出经纬度对应的最近的OpenStreetMap地图中的节点(因为你给出的点不一定在路上),最后OpenStreetMap会根据它的路网,计算出最短的驾驶距离。

以我的学校和我做项目的地方为起终点,尝试一下:

origin_point = (31.2827320285,121.2106132507)
destination_point = (31.2819500000,121.1651300000)
origin_node = ox.get_nearest_node(G, origin_point)
destination_node = ox.get_nearest_node(G, destination_point)
route = nx.shortest_path(G, origin_node, destination_node, weight='length')
str(route)
distance = nx.shortest_path_length(G, origin_node, destination_node, weight='length')
fig, ax = ox.plot_graph_route(G, route, origin_point=origin_point, destination_point=destination_point)

这次速度很快,直接就弹出结果了:

给出的路径距离是5124m,给出的路径如上,看起来是很合理的。和百度地图对比一下:

大差不差,百度给出的也是5km。大功告成,完美的替代了百度API的路径功能。而且,OpenStreetMap是不会给次数限制的。

当然,百度地图的强大在于,会根据实时路况,给出不同的出行时间,这个目前OpenStreetMap似乎还做不到,但解决了出行距离问题,后期精度要求不那么高的情况下,出行时间还是好计算的。

编辑于 01-14

文章被以下专栏收录