Międzymapowy routing w GARMIN-ie

Z UMP

(Różnice między wersjami)
(Nowa strona: Mapy dla odbiorników Garmin mogą być tworzone jako pojedyńcze mapki i wtedy sprawa routingu jest dość oczywista. Większe mapy tworzone są jako zestawy map i tak jest w przypadku...)
Aktualna wersja (17:37, 23 gru 2011) (edytuj) (anuluj zmianę)
(Wzór pliku bat do patchowania granic)
 
(Nie pokazano 23 wersji pośrednich.)
Linia 1: Linia 1:
-
Mapy dla odbiorników Garmin mogą być tworzone jako pojedyńcze 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 drugimuszą być spełnione dwa warunki:
+
==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
1. Na obu arkuszach drogi muszą się kończyć w punkcie o tych samych współrzędnych
 +
<Gallery>
 +
Grafika:Granica_od_Plocka.jpg
 +
Grafika:Granica_od_Lodzi.jpg
 +
</Gallery>
2. W tym punkcie na obu arkuszach musi zostać wygenerowany szczególny rodzaj węzła (external node)
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 mapedt+) 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 w sąsiednim arkuszu.
+
 
 +
[[Grafika:wi3.png|thumb|left|250px]]
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
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 [http://umplodz.republika.pl/netgen.html 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ę:
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ę:
-
1. Montujemy obszar A
+
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
===Jak to zrobić===
 +
 
 +
Szczegółową instrukcję wraz z obrazkami znajdziesz tu: [[Rysowanie_poza_obszar]]
 +
 
 +
1. Montujemy obszar A (lub &ndash; jeśli korzystamy z perlowego mont-demont-multi2.pl oraz mdm-gui.pl, możemy zmontować jednocześnie obszar A i B)
 +
 
2. Rysujemy drogę w pobliże granicy obszaru
2. Rysujemy drogę w pobliże granicy obszaru
-
3. W linii granicznej dodajemy węzeł w miejscu, gdzie droga będzie przechodziła na sąsiedni arkusz
+
 
-
4. Dociągamy ostatni węzeł narysowanej wcześniej drogi do tego punktu w granicy
+
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ą).
-
5. Zamykamy mapedit zapisując pracę
+
 
-
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)
+
4. Dociągamy ostatni węzeł narysowanej wcześniej drogi do tego nowego punktu granicznego
-
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.
+
 
 +
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:
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:
-
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%\narzedzia\granice.txt granice-wspolne.txt.diff.txt
 
-
pause 0
 
-
9. Montujemy obszar B - w lini granicznej powinien już być nowy punkt
+
====Wzór pliku bat do patchowania granic====
-
10. Rysujemy ciąg dalszy drogi dbając by kończyła się ona dokładnie w nowym punkcie w granicy.
+
if not exist ..\setenv.bat copy ..\narzedzia\setenv.bat ..\setenv.bat
-
11. Aplikujemy diif'y lub/i nowości
+
call ..\setenv.bat
-
12. Commitujemy zmiany dla obu obszarów pamiętając by wycommitować też granice.txt z katalogu narzedzia
+
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 s&ndash;- 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.
 +
 
 +
[[Category:Routing]]

Aktualna wersja

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ć

Szczegółową instrukcję wraz z obrazkami znajdziesz tu: Rysowanie_poza_obszar

1. Montujemy obszar A (lub – jeśli korzystamy z perlowego mont-demont-multi2.pl oraz mdm-gui.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 s–- 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.