Przybliżanie traku gpx do najbliższej drogi

No to trochę mało, puść ‘scons’ na źródle po instalacji zależności.

uruchomiłem polecenie scons i teraz poszło

Uff, ciężko to widzę, programowałeś coś w ogóle? Teraz jak to postawisz to trzeba “gadać” po http, w czym to planujesz zrobić? W php masz gotowe wrapery jak znasz, do Twojego problemu to samo przewalanie ciągów znaków plus gadanie ze serweram http (bo tak odpowiada osrm) to chyba będzie Ci najłatwiej.

Troche programowałem, ale to był czysty c++, pascal, java okienkowe. Wiem że wysyła się zapytania przez http. Co to są wrapery w wielkim skrócie?

tak jak masz w C otwarcie pliku do odczytu np:
d=fopen(‘/sciezka/plik’,‘r’)
to w php masz np:
$d=fopen(‘http://serwer/sciezka/plik’,'r’)
więc czytasz z gniazda+serwera http równie łatwo jak ze zwykłego pliku.
Bo normalnie to musiałbyś użyć gniazd już jakiejś biblioteki która zrobi z linku host, zresolwuje go na ip nawiąże sesje tcp, nawiąże sesje http, wyśle query i odbierze strumień, odetnie nagłówek i da Ci dalej do odczytu.

Dzięki bardzo za pomoc $serekmedia

próbuje uruchomić serwer poleceniem ./osrm-routed ale wyskakują mi błędy:

kamil@kamil_pc:~/Project-OSRM$ ./osrm-routed
[server] starting up engines, saved at Tue Aug 14 09:31:29 2012
[error] Failed to open file /opt/osm/baden-wuerttemberg.osrm.nodes for reading.
[error] nodes file not found

sprawdziłem w google ze baden-wuerttemberg ze to “kraj związkowy w południowej części Niemiec.”. W moim pliku map.osm była tylko polska część mapy, czy to ma jakiś z tym związek?

katalog /opt jest pusty

edit, próbowałem zmieniać zawartość pliku sever.ini na coś takiego:

Threads = 8
IP = 0.0.0.0
Port = 5000

hsgrData=/home/kamil/Project-OSRM/map.osrm.hsgr
nodesData=/home/kamil/Project-OSRM/map.osrm.nodes
edgesData=/home/kamil/Project-OSRM/map.osrm.edges
ramIndex=/home/kamil/Project-OSRM/map.osrm.ramIndex
fileIndex=/home/kamil/Project-OSRM/map.osrm.fileIndex
namesData=/home/kamil/Project-OSRM/map.osrm.names
timestamp=/home/kamil/Project-OSRM/map.osrm.timestamp

Serwer się uruchomił ale nie odpowiada mi na żadne zapytanie, albo źle je formułuje:
http://server:5000/locate?loc=52.4224,20.0002

Co znaczy nie odpowiada na zapytanie? Nie łączy do niego? Łączy i nie odpowiada, łączy i odpowiada błędem, co na konsoli osrm-routed się wyświetla - trochę więcej info. Może firewall?
Zapytanie wygląda prawidłowo. Próbowałeś przeglądarką się podpiąć?

Na ./osrm-routed w konsoli wyskakuje mi coś takiego:

kamil@kamil-MS-1675:~/Project-OSRM$ ./osrm-routed
[server] starting up engines, saved at Tue Aug 14 09:31:29 2012
[error] Failed to open file /opt/osm/baden-wuerttemberg.osrm.nodes for reading.
[error] nodes file not found

Nie próbowałem w przeglądarce bo nie wiem jak

Musisz prawidłowo wpisać ścieżki do server.ini.

Prawidłowy start osrm-routed wygląda tak:

[server] starting up engines, saved at Fri Jul 27 08:37:15 2012
[server] http 1.1 compression handled by zlib version 1.2.3.4
[info Server/DataStructures/QueryObjectsStorage.cpp:26] loading graph data
[info Server/DataStructures/QueryObjectsStorage.cpp:33] Data checksum is 1283488055
[info Server/DataStructures/QueryObjectsStorage.cpp:39] Loading Timestamp
[info Server/DataStructures/QueryObjectsStorage.cpp:49] Loading auxiliary information
[info Server/DataStructures/QueryObjectsStorage.cpp:57] Loading names index
[info Server/DataStructures/QueryObjectsStorage.cpp:74] All query data structures loaded
[handler] registering plugin hello
[handler] registering plugin locate
[handler] registering plugin nearest
[handler] registering plugin timestamp
[handler] registering plugin viaroute
[server] running and waiting for requests

Zmieniłem zawartość pliku server.ini na nastepujący:

Threads = 8
IP = 0.0.0.0
Port = 5000

hsgrData=/home/kamil/Project-OSRM/map.osrm.hsgr
nodesData=/home/kamil/Project-OSRM/map.osrm.nodes
edgesData=/home/kamil/Project-OSRM/map.osrm.edges
ramIndex=/home/kamil/Project-OSRM/map.osrm.ramIndex
fileIndex=/home/kamil/Project-OSRM/map.osrm.fileIndex
namesData=/home/kamil/Project-OSRM/map.osrm.names
timestamp=/home/kamil/Project-OSRM/map.osrm.timestamp

Serwer uruchamia się poprawnie, dokładnie ten sam wynik co w poście wyżej. Po uruchomieniu wpisuje w konsoli: http://server:5000/locate?loc=52.4224,20.0020 - brak jakiegokolwiek rezultatu

Nie na konsoli! Wpisz to w przeglądarce! I zamiast ‘server’ oczywiście ip serwera.

wporządku, działa, dziękuje za pomoc

Gotowy skrypt do pobierania danych z osrm (zapytania na bazie tracku gpx), i przetwarzania odpowiedzi do gotowego tracku gpx

<?php $xml = simplexml_load_file('track.gpx'); file_put_contents('tmp.txt', ''); $tmp = fopen("tmp.txt","a"); foreach($xml -> trk -> trkseg -> trkpt as $trkpt) { $atr = $trkpt->attributes(); $adr = "[http://0.0.0.0:5000/nearest?loc=](http://0.0.0.0:5000/nearest?loc=)".$atr['lat'].",".$atr['lon']; $odp_serv = file_get_contents($adr); fputs($tmp,$odp_serv."\n"); } fclose($tmp); $xml_gpx = simplexml_load_file('track_approx.gpx'); foreach($xml -> trk -> trkseg -> trkpt as $trkpt) { unset($xml_gpx->trk->trkseg->trkpt); } $tablica = file("tmp.txt"); for ($i=0; $itrk->trkseg->addChild('trkpt'); $trkpt->addAttribute('lat',$lat); $trkpt->addAttribute('lon',$lon); } $str = $xml_gpx -> asXML(); $q = fopen('track_approx.gpx', 'w+'); fwrite($q, $str); fclose($q); ?>

Może się przyda komuś, dzięki jeszcze raz za wcześniejszą pomoc

Muszę jednak aprosymować ślad bez osrm, choć już zrobiłem to za pomocą tego serwera. Mógłbyś przybliżyć mi trochę dokładniej metodę którą zaproponowałeś wcześniej? Co to jest właściewie ten bbox i traffic?

Traffic to jest warstwa mapy ze średnimi prędkościami, po nałożeniu na inną mapę widać gdzie nie ma płynności jazdy itp.
BBOX jest to po prostu “kwadrat” ograniczony 4 współrzędnymi. Nie jest to kwadrat geometryczny bo południki się zwężają ku biegunom, ale na nich łatwo (i szybko) się ogranicza obszar poszukiwań. Np jeśli szukasz drogi w odległości 1km od punktu to musiałbyś sprawdzać każdą drogę czy nie leży 1km od zadanego punktu. Jeżeli do zadanych współrzędnych dodasz sobie ±0.1 stopnia, to uzyskasz “kwadrat” który szybko wybierze te drogi które przecinają bbox i tylko im sprawdzę dokładny 1km.

Napisz co było źle z OSRMem. Podpowiemy Ci coś znowu.
Podstawowe pytanie to czy możesz używać bazy danych.

Hmm co było źle z OSRMem? Wg mnie było dobrze i to działało, przybliżało track do najbliższej drogi i go wyświetlało ale mój opiekun stwierdził, że to ma działać bez tego serwera. O bazie danych nic nie mówił, twierdził ze mam to zrobić za pomocą opellayers i operować na pliku mapowym (moge stworzyć sobie nawet swój własny z jedną trasą) - open layers ma chyba wbudowane funkcje do obsługi plików xml. O ile zadeklarowanie tego bboxa rozumiem i wydaje się dosyć logiczne ograniczenie obszaru poszukiwań do minimum, to nie rozumiem założeń tego traffica, może mogę prosić o jakiś przykład tego rozwiązania. Jeszcze jedno małe pytanie, czy pasy ruchu w normalnej drodze są rozgraniczone w OSM?

Traffic masz tu: http://osmapa.pl/beta/
Włącz sobie warstwę Traffic (korki)
Ja mam do dyspozycji (podobnie jak Ty) ślad po samochodzie, przy czym on ma rozrzut przez niedokładność gps, rzadką rejestrację śladu itp. Aby wyrysować traffic po drogach muszę (tak jak Ty) znaleźć drogę (i później w niej odpowiedni odcinek) najbardziej pasujący do kursu pojazdu.
Więc biorę punkt ze śladu GPS, robię wokoło niego bbox i szukam dróg przecinających ten bbox (w postgis robi to odpowiednia funkcja np:
select way from planet_roads where ST_Intersects(way,ST_GeomFromText(‘POLYGON((14 49, 24 49, 24 55, 14 55, 14 49))’,4326))
wyjmie wszystkie drogi w zgrubnym BBOX Polski. Oczywiście szukając dróg do traffica używam malutkiego bboxa który obejmuje mniej więcej kwadrat 50x50m. Takie użycie spowoduje że zadziała index gis postgresa - ST_distance nie użyje indexu.
Następnym warunkiem w where jest ST_Distance które wymaga już policzenia dystansu i on jest też wspomagany przez ST_ClosestPoint szukający najbliższego punktu z tej drogi i szukam wtedy podejrzanych odcinków dróg po których mogę potencjalnie jechać, sortuję je po odległości. Jak mam wycięte podejrzane odcinki to już aplikacyjnie szukam tego który ma odpowiedni azymut do odczytu z GPS i ten odcinek notuję - sumując prędkość i inkremetując ilość pomiarów.
Ta baza pozwala mi wyrysować wyżej widoczne kafelki - tu tez się bbox przedaje - tym razem bbox kafelka wyliczony z XYZ kafelka.