【问题标题】:Walking duration between 2 points without outside webservice没有外部网络服务的 2 点之间的步行时间
【发布时间】:2012-02-14 21:21:29
【问题描述】:

我需要能够计算 2 点之间的步行距离,而无需调用 Google 地图等外部网络服务。 Google 地图提供了一个名为 Distance Matrix API 的 API,它非常适合我需要做的事情,但它有限制,并且需要我调用网络服务。幸运的是,我的经度和纬度点将被限制在一个城市,所以我不需要像谷歌地图距离矩阵 API 那样能够查询世界上的任何 2 个点并计算步行距离。

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

【问题讨论】:

    标签: google-maps google-maps-api-3 gis


    【解决方案1】:

    您可以从 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>
    

    如您所见,一种方式中可以有超过 2 个节点。您需要将每种方式分解为成对的节点集,因此该文件将变成这样 发件人、收件人、重量 111, 112, 距离(111,112)
    112, 111, "
    112, 543, 距离(112,543)
    543, 112, "
    ...

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

    这些文件也可能非常大,具体取决于区域的范围以及该特定区域中有多少东西。

    您必须编写大量自定义代码来抓取数据是绝对正确的。我自己做了。

    【讨论】:

    • 有趣的想法。这正是我所期待的,但我不知道 .osm 文件。我认为操作原始数据需要大量自定义代码。这给了我一个好的开始。谢谢!
    【解决方案2】:

    您无需使用网络服务即可拨打Distance Matrix

    【讨论】:

    • 我知道如何使用 Google Maps Distance Matrix API。我正在尝试找出一种在本地进行此计算的方法,这样我就不会遇到 Google 使用他们的 API 设置的请求限制。
    • 距离矩阵的工作原理是通过道路计算距离,而不是根据乌鸦的飞行方式。因此,为了在本地复制它,您需要所有道路数据并在其上运行您自己的方向服务。
    • 同意。我不确定从哪里开始,我希望有人对从哪里开始有一些想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    相关资源
    最近更新 更多