Вы можете получить необходимые данные из http://www.openstreetmap.org в виде файлов .osm.
Это xml-файлы, содержащие путь, который вам нужен.Вы можете прочитать больше о OSM и на их вики-странице.
Если вам нужны только расстояния и вам нет дела до реальных маршрутов, это значительно облегчит вашу задачу.
Напишите скрипт для анализа файла .osm.Извлеките соответствующие узлы и ребра, никаких дорог, рек или чего-либо еще, по которому нельзя ходить.Затем возьмите эти данные и поместите в какую-либо структуру данных графа.
Оттуда, если вы хотите расстояние между двумя точками, просто запустите алгоритм Дейкстры.Если вы хотите сохранить все возможные расстояния, просто запустите 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, расст (112 543)543, 112 "...
Вам также придется иметь дело с улицами с односторонним движением и другими усложняющими факторами.Не все дороги являются дорогами, поэтому вам нужно проверить это.
Эти файлы также могут быть очень большими, в зависимости от границ региона и количества материала в этом конкретном регионе.
Вы абсолютно правы в отношении необходимости написания тонны пользовательского кода для очистки данных.Я сделал это сам.