Przybliżanie traku gpx do najbliższej drogi

witam,
Jestem początkujący w temacie. Proszę o jakąś podpowiedź, z której strony mam ugryźć mój problem.
Muszę aproksymować ślad GPS do najbliższej drogi - mapa OSM. Mam za zadanie wczytać plik w formacie .gpx na mapę, np. z roweru, który jedzie poboczem, a następnie narysować ten ślad na właściwej drodze, uwzględniając pas ruchu.

Udało mi się już, napisać część kodu odpowiedzialną za naniesienie i wyświetlenie “nie edytowanego tracku”.

Dziękuję za wszelką pomoc

Nie jestem pewien czy zadałeś pytanie w odpowiedni sposób. Szukasz algorytmu? Ogólnie, ślad GPX jest na tyle niedokładny, że ciężko będzie określić, którym pasem ktoś jedzie. Z ciekawości spytam :slight_smile: do czego Ci jest to potrzebne?

Ja to robię w Trafficu:
biorę punkt drogi z gps i szukam najbliższych dróg w sensownym bbox
porównuję azymut śladu z azymutem drogi - jak jest w odpowiednim zakresie stopni to trafiłem w drogę i mam też od razu w znaku kierunek względem drogi - czyli na dobrą sprawę w całej kontynentalnej EU stronę jezdni (należy w to jeszcze wmieszać oneway, bo tam pod prąd minus nie może wyjść).

Dostałem taki projekt do zrobienia (praktyki). Całość muszę zrobić raczej z poziomu przeglądarki. Szukam algorytmu, metody, w ogóle z której strony to ugryźć. Myślę że, ślad jest dostatecznie dokładny, po powiększeniu ścieżki wyraźnie widać którym pasem mógł się poruszać pojazd. Proszę o jakieś wskazówki.

Wskazówką może być “przyciąganie punktu do drogi”. Polega to na tym, że szukasz najbliższej sensownej drogi.

Z tego co rozumiem, do rozwiązania tego problemu muszę dobrze rozeznać się z budową pliku .xml z mapą. Wiem, że ten plik jest strasznie duży. Nie mam pojęcia jak skojarzyć w kodzie pojedynczy punkt pomiaru, z najbliższą drogą. Proszę wybaczyć moje proste pytania ale to moje pierwsze kroki w tym temacie.

Myślę, że powinieneś zacząć od zaimportowania danych do jakiejś bazy (PostGIS). Pytanie czy to może się komunikować z serwerem?

ok, w porządku, myślę że mi to się przyda. Teraz pytanie odnośnie samego pliku z mapą. Chciałbym przeanalizować budowę pliku z mapą OSM, czy jest taka możliwość aby pobrać jakiś wycinek tej mapy?

Tak, bez bazy to robota jest w ogóle bez sensu. Jeśli to plik osm.xml to on zawiera węzły, a z nich dopiero powstają drogi, drogi są ciągami węzłów - Ciebie interesuje odcinek z tego. Postgis ma do tego odpowiednie narzędzia - bez tego będziesz wyważał otwarte drzwi - chyba że tego dotyczy Twoja praca - więc zapytaj czy masz do tego użyć postgisa czy masz właśnie opracować to na gołym pliku - co też jest możliwe, ale wymagałoby 2 przebiegów przez plik - traktując go jako strumień - wybrać bboxowe nody (węzły) w zakresie traku GPX i wybrać linie lub lepiej odcinki składające się z tych nodów - dostaniesz 2 tablice już użytecznych informacji.
Jednak sądzę że ktoś były niepoważny dając Ci robotę tego typu czyli zrobić nie używając bazy.

Dziękuje bardzo za pomoc. Jeżeli ktoś ma jeszcze jakiś pomysł bardzo proszę o podpowiedzi.

Bardzo prosto zrobisz to z pomocą OSRM.
https://github.com/DennisOSRM/Project-OSRM/wiki

OSRM ma dwa api które pokazują
a) najbliższy węzeł drogi
b) najbliższy pkt drogi

https://github.com/DennisOSRM/Project-OSRM/wiki/Server-api

Api jest bardzo szybkie.
Mógłbyś spokojnie pojechać w pętli po wszystkich pkt śladu
pod warunkiem że postawisz sobie własny serwer OSRM.

Z moich doświadczeń postawienie działającego serwerka OSRM.
To robota na mniej niż 1h łącznie z instalacją serwera wirtualnego.
(wez ubuntu 12 bo tam się kompiluje najsprawniej)

No i pozniej jakiś skrypt/program który przetworzy ci slad
przyciagajac go do drog za pomoca OSRM

Powodzenia.

Hmm, no faktycznie na osrm będzie najłatwiej, nawet kazać mu wyroutować trasę przez wszystkie punkty pośrednie traka :slight_smile: Dostanie przyciągniętą drogę. Nie dostanie tylko po której stronie drogi rower jechał, ale to mając oryginalny ślad i przyciągnięty już nie jest problemem określić.

Pytanie czy ktoś ta prace uzna za wystarczającą na zaliczenie :slight_smile:
bo użycie OSRM to trochę jaki by uzycie dopingu w sporcie.

Witam ponownie, dziękuje jeszcze raz za pomoc.
Postanowiłem postawić serwer osrm wg instrukcji: https://github.com/DennisOSRM/Project-OSRM/wiki/Running-OSRM

Ściągnełem źródła, zaistalowałem zależności oraz pobrałem z Githaba polską część OSMu. Problem zaczyna pojawiać się gdy muszę przeładować mapę poleceniem: ./osrm-extract map.osm
No i w tym miejscu wyskakuje mi błąd przy uruchamianiu skryptu: Nie znaleziono pliku ani katalogu
W instrukcji ten błąd jest przeanalizowany. Jest napisane że trzeba stworzyć jakiś plik '.stxxl ’ i w nim wkleić coś takiego: disk=/tmp/stxxl,25000,syscall

Plik o nazwie plik.stxxl z wklejoną linijką kodu umieściłem w katalogu: /home/kamil/Project-OSRM/ , po ponownym wpisaniu komendy ./osrm-extract map.osm nic się nie zmienia. Proszę o nakierowanie mnie na mój błąd

Tak proforma, masz możliwość zapisu w /tmp?
Ten plik to tymczasowy plik roboczy dla bazy osrm - konkretnie, podajesz plik, jego wielkość i sposób dostępu - to w praktyce jest swap w userspace. Jeśli go nie podasz, to extract założy w domyślnej konfiguracji /var/tmp/plik. Z doświadczenia lepiej go zbudować na innym FSie niż plik osm.
Jak masz zablokowany wjazd do /tmp to w env zobacz gdzie admin przewidział Twoje pliki tymczasowe, lub skieruj go do /home/kamil/coś
Extract wyjmuje z pliku osm to co potrzebne do routingu i szukania najbliższych węzłów, reszte sobie ignoruje. prepare tworzy z tego bazę informacji routingowych, a routed odpala zasadniczy serwer na gnieździe tcp - musisz mieć prawa do bind/listen na tym porcie.

Ok rozumiem, czyli plik o nazwie plik.stxxl (czy ma być to plik po prostu o nazwie stxxl??) zostawiam w tym samym miejscu (/home/kamil/Project-OSRM/ ) a zmieniam jedynie jego zawartość na:
disk=/home/kamil/Project-OSRM/tmp/stxxl,25000,syscall - coś takiego?

“a routed odpala zasadniczy serwer na gnieździe tcp - musisz mieć prawa do bind/listen na tym porcie.” - jak ustawić te prawa?

Tak, spróbuj, tylko jak jeszcze w podkatalogu to go najpierw załóż. Masz taki plik stxxl.errlog? Pokaż gościa jak jest.
W pliku server.ini masz wiersz Port, powinien wskazywać na wartość większą niż 1024 bo tam tylko user może się podbindować.

Niestety nie mam takiego pliku stxxl.errlog

Plik server.ini: Port = 5000

Podsumowując:

zawartość katalogu Project-OSRM:

  • plik map.osm (3.2GB nazwa zmieniona z poland.osm)
  • katalog tmp (pusty)
  • plik o nazwie plik.stxxl o zawartości : disk=/home/kamil/Project-OSRM/tmp/stxxl,25000,syscall

Niestety dalej po wpisywaniu polecenia: ./osrm-extract map.osm pojawia mi się brak pliku lub katalogu
Dodatkowo moge powiedzieć, że przy wpisywaniu polecenia znajduje się w katalogu głównym Project-OSRM, plik mapowy map.osm też znajduje się w tym katalogu. Rozumiem, że osrm-extract to nazwa pliku/skryptu a map.osm to jego parametr. Przeglądając katalog Project-OSRM nie widze zadnego pliku o nazwie osrm-extract…

Hmm, a to go w ogóle skompilowałeś? przejrzyj dokładnie folder ze źródłami

Jak mówiłem jestem początkujący, jeszcze nie stawiałem serwera. Starałem robić wszystko zgodnie z instrukcją.
polecenia:
git clone https://github.com/DennisOSRM/Project-OSRM.git
sudo apt-get install build-essential git scons libprotoc-dev libprotobuf7 protobuf-compiler libprotobuf-dev libpng-dev libbz2-dev libstxxl-dev libstxxl-doc libstxxl1 libxml2-dev libzip-dev libboost-thread-dev libboost-system-dev libboost-regex-dev libboost-filesystem-dev libosmpbf-dev
właściwie to tylko te 2 polecenia uruchomiłem + stworzenie tego pliku