没有外部网络服务的情况下两点之间的步行持续时间

wli*_*ner 3 gis google-maps google-maps-api-3

我需要能够计算两点之间的步行距离,而无需调用 Google 地图等外部网络服务。Google 地图提供了一个称为距离矩阵 API的 APIAPI ,它非常适合我需要做的事情,但它有限制并且要求我调用 Web 服务。幸运的是,我的经度和纬度点将仅限于一个城市,因此我不需要像 Google 地图距离矩阵 API 那样能够查询世界上的任意 2 个点并计算步行距离。

我意识到这可能需要后端大量存储来维护街道路线,我不知道这是否是一个完全疯狂的请求,但如果有人知道一种方法来做到这一点或提供类似功能的库帮助将不胜感激!

jos*_*422 5

您可以从http://www.openstreetmap.org获取.osm 文件形式的数据。

这些是包含您需要的道路的 xml 文件。您可以在他们的 wiki 页面上阅读有关 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>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,一条路中可以有两个以上的节点。您需要将每种方式分解为节点对集合,因此该文件将变成类似这样的 Frm, To, Weight 111, 112, dist(111,112)
112, 111, "
112, 543, dist(112,543)
543、112、“
……

您还必须处理单向街道和其他复杂因素。并非所有道路都是道路,因此您必须检查这一点。

这些文件也可能非常大,具体取决于区域的边界以及该特定区域中有多少内容。

关于必须编写大量自定义代码来抓取数据,您是完全正确的。我自己做过。