Для построения маршрута в транспортной сети, хранящейся в SpatiaLite, можно воспользоваться соответствующими встроенными средствами, которые будут прокладывать маршрут по алгоритму Дейкстры.
Предварительно нужно создать некоторые вспомогательные данные (уже сделано в предоставляемом файле). Будет создана виртуальная таблица netedge_net и несколько больших блобов в таблице netedge_net_data.
Найти точки начала и конца маршрута
Это задача обратного геокодинга, найти ребро транспортной сети, ближайшее к указанным точкам.
От точки (73.317810, 54.983779): http://maps.yandex.ru/?text=54.983779,73.317810
select e.id_start, e.id_finish, Distance(MakePoint(73.317810, 54.983779, 4326), e.geom) from netedge e order by 3 limit 1;
id_start | id_finish | Distance |
---|---|---|
19050 | 18056 | 0.000196 |
До точки (73.391646, 54.976827): http://maps.yandex.ru/?text=54.976827,73.391646
select e.id_start, e.id_finish, Distance(MakePoint(73.391646, 54.976827, 4326), e.geom) from netedge e order by 3 limit 1;
id_start | id_finish | Distance |
---|---|---|
14326 | 14327 | 0.000406 |
Построить маршрут
Возьмем идентификаторы начальных точек найденных ребер.
select * from netedge_net where NodeFrom = 19050 and NodeTo = 14326;
Результатом будет таблица, первая строка которой содержит итоговые данные о маршруте, а последующие — идентификаторы вершин и ребер построенного маршрута.
Algorithm | ArcRowid | NodeFrom | NodeTo | Cost | Geometry |
---|---|---|---|---|---|
Dijkstra | NULL | 19050 | 14326 | 3580.000000 | BLOB sz=1200 GEOMETRY |
Dijkstra | 27815 | 19050 | 18008 | 50.000000 | NULL |
... | |||||
Dijkstra | 6661 | 4015 | 14326 | 80.000000 | NULL |
Блоб в первой строке является географическим представлением маршрута и выглядит примерно так: