Продолжительность прогулки между 2 точками без внешнего веб-сервиса - PullRequest
2 голосов
/ 15 февраля 2012

Мне нужна возможность рассчитать расстояние между двумя точками без вызова внешнего веб-сервиса, такого как Google Maps. Google Maps предоставляет API под названием Distance Matrix API , который идеально подходит для того, что мне нужно сделать, но имеет ограничения и требует, чтобы я звонил в веб-службу. К счастью, мои точки долготы и широты будут ограничены одним городом, поэтому мне не нужно запрашивать любые 2 точки в мире и вычислять расстояние для пешеходов, как в API Карт Google Карт расстояний.

Я понимаю, что для поддержки уличных маршрутов, вероятно, потребуется много места на сервере, и я не знаю, является ли это совершенно безумным запросом, но если кто-нибудь знает способ сделать это или библиотеку, которая предоставляет подобный функционал, любая помощь будет принята с благодарностью!

Ответы [ 2 ]

4 голосов
/ 19 февраля 2012

Вы можете получить необходимые данные из 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 "...

Вам также придется иметь дело с улицами с односторонним движением и другими усложняющими факторами.Не все дороги являются дорогами, поэтому вам нужно проверить это.

Эти файлы также могут быть очень большими, в зависимости от границ региона и количества материала в этом конкретном регионе.

Вы абсолютно правы в отношении необходимости написания тонны пользовательского кода для очистки данных.Я сделал это сам.

0 голосов
/ 15 февраля 2012

Вы можете позвонить на Матрицу расстояний без использования веб-службы.

...