Kompilacja mapy
Z UMP
Spis treści |
Kompilacja mapy
Wstęp
Wiele osób rysuje mapę, ale niewiele wie do końca w jaki sposób ze źródeł powstaje gotowy produkt. Ten artykuł ma za zadanie przybliżyć nowym użytkownikom drogę od rozmontowanych źródeł do gotowej mapy która ląduje w odbiorniku. Dodatkowo po jego przeczytaniu być może zaczną być jasne powody dla których generate-routing-graph oraz RouteParam powinny być unikane.
Ten opis miał być w założeniu uproszczonym wprowadzeniem do kompilacji. Jeśli chcesz się dowiedzieć jak i co się dokładnie dzieje podczas kompilacji, polecam prześledzić artykuł Alfreda na ten temat (prawie że nieczytelny dla nietechnicznych ;) Kompilacja_na_serwerze.
Mapa routowalna
Na początek kilka informacji na temat map routowalnych. Aby odbiornik mógł wyznaczać trasę na podstawie mapy musi ona zawierać odpowiednie dane. Każda droga i każde skrzyżowanie muszą posiadać swój unikatowy numer (RoadID, NodX), każda droga musi mieć zaznaczoną odpowiednią prędkość oraz klasę. Dodatkowo trzeba ustawić odpowiednie parametry routingu (jednokierunkowość, zakazy wjazdu, zakazy ruchu dla odpowiednich pojazdów , RouteParam), wszelkie zakazy skrętu oraz drogowskazy. Parametry te nie są przechowywane w źródłach, ale są generowane automatycznie przed kompilacją przy pomocy netgena. Powodem tego jest to, że ulegają one zmianie przy najmniejszej nawet modyfikacji mapy i ręczne ich ustawianie byłoby całkowicie bezsensowne.
Etap pierwszy - montowanie źródeł
Pierwszym etapem tworzenia mapy jest zamontowanie źródeł. Montowane są one z opcją --cityidx, która zamienia wpisy Miasto= (dla punktów poi oraz dróg) na wpisy CidyIdx przewidziane w formacie mp. Na ich podstawie w późniejszym etapie tworzone są odpowiednie indeksy miejscowości, ulic, oraz punktów poi. W wyniku tego otrzymujemy gotowy plik mp który można poddać dalszej obróbce.
Etap drugi - tworzenie danych routingowych
W drugim etapie tworzenia mapy do pracy zaprzęgany jest netgen. Wywołany jest on następująco:
netgen -b -j -k -R -Tnarzedzia/netgen.cfg < wynik > temp 2> netgenlog
Jego pierwszym zadaniem jest sprawdzenie źródeł na okoliczność występowania dróg przecinających się same ze sobą. Jeśli taka droga zostanie odnaleziona zostaje ona przecięta w taki sposób aby uniknąć zapętlenia. Z tego powodu w ump możemy rysować ronda w jednym kawałku (netgen je potem dzieli na pół). Z tego samego powodu czasami pojawiają się błędy za bliskich węzłów (bo netgen źle przeciął i dwa węzły routingowe są za blisko). Dodatkowo netgen przecina drogi w miejscach gdzie drogowskazy i zakazy nie zaczynają się lub kończą na węzłach routingowych.
Drugim zadaniem netgena jest wygenerowanie każdej dostępnej drodze unikatowego numeru (RoadID) oraz parametrów routingu (RouteParam). Wydaje mi się, że pierwsze nie wymaga wyjaśniania , natomiast warto powiedzieć kilka słów o drugim. Parametr RouteParam składa się z 12 cyr odzielonych przecinkami. Pierwsze dwie oznaczają szybkość obowiązującą na danej drodze (od 0 do 7) oraz klasę drogi (0-4). Te dwa pamaretry są ustawiane na podstawie klasy drogi (zobacz plik netgen.cfg), albo w przpadku gdy istnieją parametry ForceSpeed i ForceClass są kopiowane z tych zmiennych. Trzecia cyfra oznacza kierunkowość i jest ustawiana gdy w źródłach droga oznaczona jest jako jednokierunkowa. Pozostałe parametry są ustawiane zgodnie z wyznaczymi zawartymi w pliku netgen.cfg, albo zgodnie z tym co jest w źródłach (zakazy ruchu, zakazy wjazdu ciężarówek, drogi płatne itd - zakładka Routing).
Po wygenerowaniu numerów dróg oraz parametrów routingu dla każdej drogi netgen rozpoczyna generowanie danych o skrzyżowaniach (NodX=A,B,C). Każde skrzyżowanie otrzymuje swój unikatowy numer, a każda droga otrzymuje informacje w którym miejscu pojawia się skrzyżowanie (węzeł nr A, zaczynając od zera), oraz jaki posiada numer (wartość B). Dodatkowo gdy zdarzy się że dane skrzyżowanie jest na linii granicznej (pomiędzy dwoma arkuszami mapy), netgen ustawia parametr C na 1, co umożliwia routing między wieloma plikami img.
Następną rzeczą którą robi netgen jest dodanie zakazów i drogowskazów do mapy. Dla ułatwienia rysującym używamy do tych dwóch celów odpowiednio przygotowanych linii (np dla zakazów to linia typu timezone). Kompilator wymaga zupełnie innego opisu, dlatego netgen zamienia te linie na odpowiednie wpisy w plikach mp:
[RESTRICT] TRAFFPOINTS=A1,N,B1 TRAFFROADS=A,B [END]
I wreszcie ostatnią rzeczą którą robi netgen jest odpowiednie zbilansowanie klas dróg. Aby routing działał dobrze sieć drogowa musi posiadać ciągłą klasę routingową (nie mogą pojawiać się dziury w klasach). Dlatego netgen przegląda drogi i podwyższa klasę dla ramp, rond, łączników i innych tego typu obiektów (np rampy zjazdowe z autostrad dostają klasę autostrady). Dodatkowo netgen redukuje do dwóch liczbę klas dróg na danym skrzyżowaniu (gdy jest ich więcej klasa najniższych dróg zostaje podwyższona).
Etap trzeci - kompilacja i generowanie indeksów
Po przetworzeniu mapy netgenem jest ona kompilowana przy pomocy cgpsmappera w wyniku czego tworzone są pliki img. Ostatnim etapem jest generowanie indeksów dla miejscowości które również lądują w pliku img (przed generowaniem indeksów wszystkie POI oraz miejscowości są uzupełniane przez program wojek o dane dotyczące województwa i państwa w którym się znajdują). Tak przygotowany obraz mapy można już wgrać do odbiornika i cieszyć się mapą.