我需要能够计算2点之间的步行距离,而无需调用Google地图等外部网络服务。谷歌地图提供了一个名为Distance Matrix API的API,它非常适合我需要做的事情,但它有限制并且要求我调用Web服务。幸运的是,我的经度和纬度点数将仅限于一个城市,因此我不需要能够查询世界上的任何2个点并计算步行距离,就像谷歌地图距离矩阵API所提供的那样。
我意识到这可能需要后端的大量存储来维护街道路线,我不知道这是否是一个完全疯狂的请求,但如果有人知道这样做的方法或提供的库类似的功能任何帮助将不胜感激!
答案 0 :(得分:4)
您可以通过.osm文件的形式从http://www.openstreetmap.org获取所需的数据。
这些是包含您需要的道路的xml文件。您可以在他们的维基页面上阅读有关osm的更多信息。
如果您只想要距离并且不关心实际路线,那么这将使您的任务变得更加轻松。
编写脚本来解析.osm文件。提取相关的节点和边,没有高速公路,河流或其他任何无法行走的地方。然后将这些数据放入某种图形数据结构中。
从那里,如果你想要两点之间的距离,只需运行Dijkstra的算法。如果你想存储所有可能的距离,只需从图中的每个节点运行一次Dijkstra,每次都存储距离。
<node id="111" lat="41" lon="-74" // more stuff here>
<tag k="x" v="y"/> ... // These are the various attributes of a node, optional
</node>
<node id='112' ..../>
<way id='555'>
<nd ref='111'/> // These are the nodes that make up the way
<nd ref='112'/>
<nd ref='543'/>
...
<tag k='highway' v='primary'/>
<tag k='name' v='E. 42nd Street/>
</way>
如您所见,一种方法可以包含2个以上的节点。你需要将每一种方式分解成多组节点,所以这个文件会变成这样的
Frm,To,Weight
111,112,dist(111,112)
112,111,“
112,543,dist(112,543)
543,112,“
...
你还必须处理单行道和其他复杂因素。并非所有方式都是道路,所以你必须检查它。
这些文件也可能非常大,具体取决于区域的范围以及该特定区域的内容。
你必须编写大量的自定义代码来刮取数据,这是完全正确的。我自己做了。
答案 1 :(得分:0)
您可以在不使用网络服务的情况下拨打Distance Matrix。