Międzymapowy routing w GARMIN-ie
Z UMP
Jak to działa
Mapy dla odbiorników Garmin mogą być tworzone jako pojedyncze mapki i wtedy sprawa routingu jest dość oczywista. Większe mapy tworzone są jako zestawy map i tak jest w przypadku naszej mapy. Aby routing mógł "przeskoczyć" z jednego arkusza na drugi, muszą być spełnione dwa warunki:
1. Na obu arkuszach drogi muszą się kończyć w punkcie o tych samych współrzędnych
2. W tym punkcie na obu arkuszach musi zostać wygenerowany szczególny rodzaj węzła (external node)
Można oczywiście wykonać to w używanym przez nas mapedicie (zarówno w wersji "kanonicznej" jak mapedit+), generując najpierw węzły dla routingu, a następnie oznaczając każdy graniczny jako external. Jednak w naszym projekcie generowanie węzłów dla routingu odbywa się bezpośrednio przed kompilacją i wykorzystywany jest do tego program netgen Mariusza Dąbrowskiego. Program ten oprócz generowania "zwykłych" węzłów w miejscach przecięcia czy styku dróg potrafi wygenerować węzły "external" w miejscach przecięcia dróg ze specjalnym rodzajem linii (0x4b) nazywanej graniczną. Warunkiem powstania takiego węzła jest istnienie węzła w linii granicznej w punkcie, w którym kończy się droga mająca ciąg dalszy na sąsiednim arkuszu.
Zatem każdy z obszarów mających drogi wspólne z sąsiednim jest otoczony liniami granicznymi (są one wspólne dla sąsiednich obszarów). Te linie w źródłach przechowywane są w katalogu narzedzia w pliku granice.txt i z tego pliku pobierane podczas montowania dowolnego obszaru. Dodając nową drogę znajdującą się w dwóch (lub więcej) arkuszach możemy zastosować taką metodę:
Jak to zrobić
1. Montujemy obszar A (lub -- jeśli korzystamy z perlowego mont-demont-multi2.pl, możemy zmontować jednocześnie obszar A i B)
2. Rysujemy drogę w pobliże granicy obszaru
3. W linii granicznej (a nie w rysowanej linii) dodajemy węzeł w miejscu, gdzie droga będzie przechodziła na sąsiedni arkusz. Węzeł dodany w ten sposób na pewno będzie pomiędzy dwoma innymi na tej samej (prostej) linii, co jest bardzo ważne (linia graniczna pozostanie prostą).
4. Dociągamy ostatni węzeł narysowanej wcześniej drogi do tego nowego punktu granicznego
5. Zamykamy program mapedit zapisując pracę (chyba że mamy zmontowane dwa obszary naraz -- wtedy przechodzimy do punktu 10, pamiętając tylko o konieczności przypisania dwóch kawałków drogi do właściwych obszarów)
6. Uzyskujemy !nowości.txt lub diff-a dla pliku z drogami oraz plik granice-wspolne.txt.diff.txt (jeśli używamy mont-demont.bat) lub narzedzia-granice.txt.diff (jeśli używamy mont-demont-perl.bat lub perlowej wersji pod uniksem)
7. Aplikujemy diff-a (paczuj.bat) lub/i dorzucamy nowości do pliku z drogami - zmiany w granicach nie zostaną zaaplikowane, bo plik granic jest poza katalogiem obszaru w którym pracujemy.
8. Aplikujemy zmiany do pliku granice.txt. Można to zrobić ręcznie (odradzam) znajdując odpowiednią linijkę i zamieniając ja na tę z pliku diff lub uwzględniając odpowiednią nazwę pliku diff stworzyć plik bat do tego celu o treści:
Wzór pliku bat do patchowania granic
if not exist ..\setenv.bat copy ..\narzedzia\setenv.bat ..\setenv.bat
call ..\setenv.bat
rem ## setenv wychwytuje, ze zmiennych nie bylo, i przerywa
%ump%\narzedzia\patch.exe %ump%\granice.txt granice-wspolne.txt.diff.txt
pause 0
W uniksach po prostu kopiujemy nowy plik do narzedzia/granice.txt, zgodnie z podpowiedzią skryptu mont-demont-multi2.pl (wystarczy skopiować myszką gotową linijkę z komendą i ją wykonać)
9. Montujemy obszar B - w linii granicznej powinien już być nowy punkt
10. Rysujemy ciąg dalszy drogi, dbając o to, by kończyła się ona dokładnie w nowym punkcie granicy.
11. Aplikujemy diif-y lub/i nowości
12. Commitujemy zmiany dla obu obszarów, pamiętając by wycommitować też granice.txt z katalogu narzedzia
Jeśli jesteśmy w stanie poprawnie podzielić nową drogę na odpowiednie obszary ręcznie, to możemy od razu zmontować oba obszary, narysować drogę, dodać punkt w linii granicznej, dodać punkt na drodze blisko granicznego, dociągnąć go do granicznego (nie odwrotnie!), po czym podzielić drogę w tym miejscu (split polyline), zachować zmiany, rozmontować i pamiętać o umieszczeniu stosownych fragmentów nowej drogi w odpowiednich plikach obu zmontowanych obszarów.