您可以从 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, "
...
您还必须处理单向街道和其他复杂因素。并非所有的道路都是道路,所以你必须检查一下。
这些文件也可能非常大,具体取决于区域的范围以及该特定区域中有多少东西。
您必须编写大量自定义代码来抓取数据是绝对正确的。我自己做了。