User Tools

Site Tools


tecnica:gps_cartografia_gis:osm_recipes

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tecnica:gps_cartografia_gis:osm_recipes [2018/04/26 07:04] – [Personalizzazione stile default] niccolotecnica:gps_cartografia_gis:osm_recipes [2020/07/31 09:54] (current) – [Riferimenti Web] niccolo
Line 2: Line 2:
  
 In questa pagina alcune ricette utili per cucinare mappe OpenStreetMap da caricare su navigatore GPS. In particolare l'obiettivo è creare delle versioni ridotte compatibili con il **Garmin eTrex 10**, che ha capacità di memoria davvero ridotte (**circa 7 Mb**).  In questa pagina alcune ricette utili per cucinare mappe OpenStreetMap da caricare su navigatore GPS. In particolare l'obiettivo è creare delle versioni ridotte compatibili con il **Garmin eTrex 10**, che ha capacità di memoria davvero ridotte (**circa 7 Mb**). 
 +
 +Tutti gli script qui descritti sono contenuti nell'archivio **{{.:osm:garmin-etrex10-map.tgz}}**.
  
 ===== Spazio limitato: è necessario un compromesso ===== ===== Spazio limitato: è necessario un compromesso =====
Line 7: Line 9:
 Per motivi di capienza sarà quindi necessario restringere l'estensione della mappa ad **una sola regione** (in questo esempio la Toscana), inoltre si dovrà optare per una **mappa di tipo on-road** (ad esempio per uso cicloturistico) oppure una **off-road** (per uso trekking o MTB). Nel primo caso si includerà solo la rete stradale ordinaria (da **//motorway//** a **//unclassified//** nella classificazione OSM), nel secondo caso quella off-road (**//footway//**, **//track//** e **//path//** nella classificazione OSM). Per motivi di capienza sarà quindi necessario restringere l'estensione della mappa ad **una sola regione** (in questo esempio la Toscana), inoltre si dovrà optare per una **mappa di tipo on-road** (ad esempio per uso cicloturistico) oppure una **off-road** (per uso trekking o MTB). Nel primo caso si includerà solo la rete stradale ordinaria (da **//motorway//** a **//unclassified//** nella classificazione OSM), nel secondo caso quella off-road (**//footway//**, **//track//** e **//path//** nella classificazione OSM).
  
 +**ATTENZIONE**: Dopo un po' di prove sul campo ho realizzato che per fare trekking è necessario avere **contemporaneamente** sia le **strade asfaltate** che i **sentieri**. A queste condizioni **una regione intera** come la Toscana **non ci sta**. Il mio suggerimento è quindi di estrarre i dati solo di **alcuni comuni** limitrofi.
 ===== Cosa includere ===== ===== Cosa includere =====
  
Line 13: Line 16:
   * **Centri abitati**. Avere i centri abitati come waypoint è utile per effettuare ricerche e spostarsi velocemente sulla mappa del GPS.   * **Centri abitati**. Avere i centri abitati come waypoint è utile per effettuare ricerche e spostarsi velocemente sulla mappa del GPS.
   * **Confini amministrativi**. Si sono inclusi i confini delle regioni italiane soprattutto per fini "estetici", poiché sono utili ad interpretare la mappa a livelli di zoom inferiori. I confini NON vengono utilizzati per l'indicizzazione degli indirizzi da utilizzare durante la ricerca degli stessi. L'aggiunta dei confini regionali ha ingrossato la mappa finale di circa **170 kb**.   * **Confini amministrativi**. Si sono inclusi i confini delle regioni italiane soprattutto per fini "estetici", poiché sono utili ad interpretare la mappa a livelli di zoom inferiori. I confini NON vengono utilizzati per l'indicizzazione degli indirizzi da utilizzare durante la ricerca degli stessi. L'aggiunta dei confini regionali ha ingrossato la mappa finale di circa **170 kb**.
 +
 +===== Galleria =====
 +
 +{{.:etrex_osm:img_01.jpg?160|}}
 +{{.:etrex_osm:img_02.jpg?160|}}
 +{{.:etrex_osm:img_03.jpg?160|}}
 +
 +{{.:etrex_osm:img_04.jpg?160|}}
 +{{.:etrex_osm:img_05.jpg?160|}}
 +{{.:etrex_osm:img_06.jpg?160|}}
  
 ===== Confini regioni italiane da Istat ===== ===== Confini regioni italiane da Istat =====
Line 161: Line 174:
 </code> </code>
  
-Per estrarre le way e trasformarle al volo in nodi si usa una query **amenity_way.xml** leggermente diversa:+Per estrarre le way si usa una query **amenity_way.xml** leggermente diversa:
  
 <code xml> <code xml>
Line 173: Line 186:
 </code> </code>
  
-La differenza sta nell'aver aggiunto il modificatore **%%geometry="center"%%** nel **print**. Notare che secondo le indicazioni del wiki il **[[https://wiki.openstreetmap.org/wiki/Tag:amenity=drinking_water|tag:amenity=drinking_water]]** si applica solo ai nodi e non alle way, perciò non è stato ripetuto.+La differenza sta nell'aver aggiunto il modificatore **%%geometry="center"%%** nel **print**, in tal modo viene aggiunto all'elemento **%%<way>%%** un child **%%<center>%%**, mentre i nodi che compongono la way non saranno estrattiBisognerà manipolare opportunamente il file per avere **%%<node>%%** al posto di **%%<way>%%**. 
 + 
 +Notare che secondo le indicazioni del wiki il **[[https://wiki.openstreetmap.org/wiki/Tag:amenity=drinking_water|tag:amenity=drinking_water]]** si applica solo ai nodi e non alle way, perciò non è stato ripetuto.
  
 Con **wget** si scarica i due estratti da OpenStreetMap: Con **wget** si scarica i due estratti da OpenStreetMap:
Line 182: Line 197:
 </code> </code>
  
-Per diminuire le dimensioni del file destinazione si rimuove tutti i tag ad eccezione di **amenity** e **name**:+Con lo script **{{.:osm:name_fix.txt|name_fix}}** si assegna un **tag name** a tutti i nodi che non ce l'hanno, in modo che siano etichettati opportunamente nella lista che compare sul GPS. Ad esempio per una farmacia si usa **name=pharmacy** (forse si potrebbe fare anche con uno stile di mkgmap). Con questo passaggio dal file **op_amenity_n.osm** si ottiene il file **op_amenity_n_fix.osm**. 
 + 
 +Per diminuire le dimensioni del file destinazione si rimuovono tutti i tag ad eccezione di **amenity** e **name**:
  
 <code bash> <code bash>
-osmfilter "op_amenity_n.osm" --keep-node-tags="all amenity= name=" \+osmfilter "op_amenity_n_fix.osm" --keep-node-tags="all amenity= name=" \
     --drop-author --fake-version --out-osm -o="f_amenity_n.osm"     --drop-author --fake-version --out-osm -o="f_amenity_n.osm"
 </code> </code>
  
-  * FIXME Il file **op_amenity_w.osm** va convertito da way a node+Per trasformare ogni //way// del file **op_amenity_w.osm** in un //node// si usa lo script **{{.:osm:way2node.txt|way2node}}**. Il risultato è il file **f_amenity_w.osm**. 
-  FIXME Ai nodi che **non hanno il tag name** bisogna aggiungerne uno d'ufficio in modo che siano etichettati opportunamente nella lista che compare sul GPSAd esempio per una farmacia si usa **name=pharmacy** (forse si può fare con lo stile di mkgmap).+ 
 +Come si sono estratti gli opportuni oggetti **amenity**si estraggono anche gli oggetti **tourism**. In particolare si sono estratti: //hotel//, //motel//, //guest_house//, //chalet//, //hostel//, //alpine_hut//, //wilderness_hut//, //caravan_site// e //camp_site//.
 ===== Centri abitati da OSM ===== ===== Centri abitati da OSM =====
  
-===== mkgmap-splitter mkgmap =====+L'estrazione dei centri abitati è del tutto simile a quella degli altri waypoint. La query Overpass deve selezionare i node con tag **place** e valore //city//, //town// oppure //village//. Anche in questo caso si aggiunge il tag nome nel caso che sia assente ed infine si rimuovono tutti i tag ad eccezione di **name**, **place** e **population**: 
 + 
 +<code bash> 
 +osmfilter "tmp/op_place_n_fix.osm"
 +    --keep-node-tags="all name= place= population="
 +    --drop-author --fake-version --out-osm -o="tmp/f_place_n.osm" 
 +</code> 
 +===== Assemblare tutti i pezzi ===== 
 + 
 +Per combinare tutte le parti prodotte in precedenza si utilizza **osmconvert** contenuto nel pacchetto Debian **osmctools**: 
 + 
 +<code bash> 
 +osmconvert \ 
 +    "admin_boundaries.osm"
 +    "tmp/f_track.osm"
 +    "tmp/f_way.osm"
 +    "tmp/f_place_n.osm"
 +    "tmp/f_amenity_n.osm" "tmp/f_amenity_w.osm"
 +    "tmp/f_tourism_n.osm" "tmp/f_tourism_w.osm"
 +    -o="gmapsupp.osm" 
 +</code> 
 + 
 +Il risultato è un file **gmapsupp.osm** ancora nel **formato XML di OpenStreetMap**. 
 +===== mkgmap-splitter ===== 
 + 
 +Il file risultante **gmapsupp.osm** deve essere suddiviso in quadranti più piccoli (tile, mattonelle) per adeguarsi al formato Garmin, si utilizza il programma **mkgmap-splitter** installato dal pacchetto Debian omonimo. 
 + 
 +<code> 
 +mkgmap-splitter gmapsupp.osm 
 +</code> 
 + 
 +Il risultato è una serie di file la cui simensione è di circa **10 Mb** ciascuno: 
 + 
 +  * **63240001.osm.pbf** 
 +  * **63240002.osm.pbf** 
 +  * ... 
 + 
 + 
 +===== Personalizzare lo stile della mappa =====
  
-^ %%--region-name%% | Viene mostrato accanto al nome del centro abitato nella visualizzazione dell'elenco (altrimenti compare la stringa **ABC**). FIXME Forse esiste la possibilità di usare i confini amministrativi e l'indicizzazione degli indirizzi per associare il centro abitato al nome del comune che lo contiene?  |+Prima dell'esecuzione finale del programma **mkgmap** è opportuno definire lo stile della mappa; a causa delle limitate capacità grafiche del Garmin eTrex 10 lo stile predefinito non è ottimale. Tre sono i concetti propedeutici da comprendere:
  
-===== Stile della mappa =====+  * I **levels** sono versioni della stessa mappa a diversi livelli di dettaglio. Quando si varia lo zoom di visualizzazione, il device attiverà automaticamente il //level// più opportuno. 
 +  * Gli **styles** associano ogni elemento OSM ad un particolare simbolismo (rendering grafico) Garmin, indicando a quale //level// si applica. 
 +  * Il **linguaggio TYP** può essere usato per modificare i simbolismi predefiniti Garmin, ad esempio per modificare come viene visualizzato un certo tipo di track o path.
  
 Fondamentale lettura è il **[[https://www.mkgmap.org.uk/doc/pdf/style-manual.pdf|Conversion Style manual]]** di **mkgmap** (qui una {{.:osm:mkgmap-style-manual.pdf|copia locale}}). Si deve anzitutto familiarizzare con alcuni concetti: Fondamentale lettura è il **[[https://www.mkgmap.org.uk/doc/pdf/style-manual.pdf|Conversion Style manual]]** di **mkgmap** (qui una {{.:osm:mkgmap-style-manual.pdf|copia locale}}). Si deve anzitutto familiarizzare con alcuni concetti:
Line 218: Line 276:
 |           24 |   120 - 80 m | |           24 |   120 - 80 m |
  
-==== Personalizzazione dello stile "default" ==== +==== Lo stile "default" ====
- +
-Dai sorgenti di **mkgmap** si è estratta la directory **mkgmap-r3741/resources/styles/default/**, quindi si sono modificati alcuni file:+
  
-  * options +Lo stile **default** è inglobato nell'eseguibile di **mkgmap**, quindi è necessario ispezionare i sorgenti. In particolare osserviamo i file **options** e **lines**.
-  * lines+
  
 In **options** si vede che la mappa contiene 4 livelli di dettaglio: In **options** si vede che la mappa contiene 4 livelli di dettaglio:
Line 247: Line 302:
  
 Secondo le indicazioni OpenStreetMap l'//admin_level// per i confini amministrativi dell'Italia assume i valori: **2=Nazione**, **4=Regione**, **6=Provincia** e **8=Comune**. Questo significa che **il confine regionale appare alla risoluzione 19** o superiore. Nello stile //default// il primo livello che visualizza tali confini (partendo da quello meno dettagliato, cioè con indice maggiore) è quindi il **livello 2** che ha **risoluzione 20**. L'effetto pratico è che i confini regionali si vedono sul GPS con la mappa **alla scala dei 2 km** o inferiore (più ingrandita). Secondo le indicazioni OpenStreetMap l'//admin_level// per i confini amministrativi dell'Italia assume i valori: **2=Nazione**, **4=Regione**, **6=Provincia** e **8=Comune**. Questo significa che **il confine regionale appare alla risoluzione 19** o superiore. Nello stile //default// il primo livello che visualizza tali confini (partendo da quello meno dettagliato, cioè con indice maggiore) è quindi il **livello 2** che ha **risoluzione 20**. L'effetto pratico è che i confini regionali si vedono sul GPS con la mappa **alla scala dei 2 km** o inferiore (più ingrandita).
 +
 +==== Personalizzazione dello stile "default" ====
 +
 +Rispetto allo stile //default// si sono rese necessarie alcune modifiche per realizzare una mappa destinata all'**escursionismo off-road**:
 +
 +  * I **confini regionali** devono essere **sempre visibili** (anche alla scala 800 km). Prepareremo quindi un **livello #3** (il meno dettagliato) alla **risoluzione 18**.
 +  * Alcuni **centri abitati** compaiono alla scala **5 km**. Il **livello #2** verrà usato quindi alla **risoluzione 19**.
 +  * Le **track** e **path** devono essere visibili **dalla scala 2 km**. Per questo prepareremo un **livello #1** (dettaglio intermedio) alla **risoluzione 20**.
 +  * Gli **waypoint** appaiono dalla scala **120-80 m**. Si tratta del **livello #0** (il più dettagliato) alla **risoluzione 24**.
 +
 +Schematicamente:
 +
 +^ Oggetto                ^ Visibile da      ^ Risoluzione  ^ Livello  ^
 +^ Confini regionali      |           800 km |           18 |        3 |
 +^ Centri abitati minori  |             5 km |           19 |        2 |
 +^ Track e path                       2 km |           20 |        1 |
 +^ Waypoint                       120-80 m |           24 |        0 |
 +
 +Dai sorgenti di **mkgmap** si è estratta tutta la directory **mkgmap-r3741/resources/styles/default/**, quindi si sono modificati due file:
 +
 +  * **styles/default/options**
 +  * **styles/default/lines**
 +
 +Nel primo si definiscono i livelli di dettaglio e la relativa risoluzione:
 +
 +<file>
 +levels = 0:24, 1:20, 2:19, 3:18
 +</file>
 +
 +Nel secondo si definisce a quale risoluzione far comparire i vari oggetti:
 +
 +<file>
 +highway=footway|highway=path|highway=steps [0x16 road_class=0 road_speed=0 resolution 20]
 +highway=track [0x0a road_class=0 road_speed=1 resolution 20]
 +...
 +boundary=administrative & admin_level<3 [0x1e resolution 12] # admin_level:2 Nazione
 +boundary=administrative & admin_level<5 [0x1d resolution 18] # admin_level:4 Regione
 +boundary=administrative & admin_level<7 [0x1c resolution 21] # admin_level:6 Provincia
 +boundary=administrative & admin_level<9 [0x1c resolution 22] # admin_level:8 Comune
 +</file>
 +
 +==== Personalizzazione del simbolismo (file TYP) ====
 +
 +Ogni GPS Garmin ha un **simbolismo predefinito** che definisce l'aspetto grafico per ogni oggetto mappa. Ad esempio una **highway=track** della mappa OSM viene convertita da **mkgmap** in un oggetto Garmin **line Type=0x00a**, che viene mostrata sul display dell'eTrex 10 con un certo spessore e colore. Il simbolismo è **codificato all'interno del firmware** del GPS, nell'eTrex provvede anche ad adattare la rappresentazione grafica rispetto alla scala; ad esempio una strada di tipo //secondary// verrà rappresentata con una linea più spessa quando si aumenta lo zoom.
 +
 +Nella mappa compilata con mkgmap è possibile tuttavia definire delle **personalizzazioni** rispetto al simbolismo predefinito. Abbiamo sfruttato questa possibilità per **modificare l'aspetto** delle **linee** **Type=0x00a** e **Type=0x016** (track e path rispettivamente) in modo che fossero **più sottili** e non confondessero il display alla scala dei 2 km.
 +
 +Per ottenere il risultato è sufficiente creare un file **my_etrex10.txt** con questo contenuto:
 +
 +<file>
 +[_id]
 +ProductCode=0x1
 +FID=9999
 +[end]
 +
 +[_line]
 +Type=0x00a
 +;GRMN_TYPE: Roads/UNPAVED_ROAD/Gravel or dirt road/Non NT, NT
 +UseOrientation=Y
 +Xpm="32 1 2  1"
 +"- c #000000"
 + c none"
 +"------  ------  ------  ------  "
 +;12345678901234567890123456789012
 +String1=0x04,Track
 +ExtendedLabels=N
 +[end]
 +
 +[_line]
 +Type=0x016
 +;GRMN_TYPE: Roads/TRAIL/Walkway or trail/Non NT, NT
 +UseOrientation=Y
 +Xpm="32 1 2  1"
 +"- c #808080"
 + c none"
 +"----  -----  ----  -----  ----  "
 +;12345678901234567890123456789012
 +String1=0x04,Path
 +ExtendedLabels=N
 +[end]
 +</file>
 +
 +**ATTENZIONE**: Il file qui sopra produce un simbolismo che verrà **applicato per ogni level**. Cioè le linee **Type=0x00a** e **Type=0x016** saranno rappresentate sempre allo stesso modo ad ogni livello di zoom. Questo è molto differente dagli stili applicati internamente dall'eTrex, dove ad esempio il **Type=0x04** applicato alle **highway=secondary** produce linee via via più spesse quando si aumenta lo zoom. In alternativa si dovrebbero definire diverse righe nel file ''style/default/lines'' (vedi sopra), ciascuna associata ad una resolution diversa e con un codice Type diverso, qualcosa del tipo:
 +
 +<file>
 +highway=track [0x0a road_class=0 road_speed=1 resolution 24 continue]
 +highway=track [0x0a01 road_class=0 road_speed=1 resolution 23-20 continue]
 +highway=track [0x0a02 road_class=0 road_speed=1 resolution 19]
 +</file>
 +
 +La riga **[[wp>X_PixMap|Xpm]]** definisce il bitmap in termini di **larghezza**, **altezza**, **colori** e **caratteri per pixel**. Le righe successive definiscono il **colore** rappresentato da **ciascun carattere** (il punto esclamativo è nero o grigio, lo spazio è trasparente), infine il **bitmap** vero e proprio che nel nostro caso è una matrice di 32x1 caratteri.
 +
 +**NOTA BENE**: Con **mkgmap versione svn3741** non è più necessario compilare il file TYP, è possibile utilizzare direttamente il testo sorgente.
 +
 +===== No Results found: bug POI non elencati per categoria =====
 +
 +Sembra che ci sia un bug nel firmware dell'eTrex 10: in alcune circostanze gli **waypoint inclusi nella mappa non vengono elencati nelle opportune categorie**. Ad esempio uno waypoint a cui sia assegnato il **tipo 0x2c0d** viene visualizzato sulla mappa con l'icona **Place of worship** e dovrebbe comparire nel menu **Where to?** => **Community**.
 +
 +Dovrebbe essere sufficiente che la **mappa OSM** contenga un nodo di questo tipo:
 +
 +<file>
 +<node id="170860041" lat="43.91410710" lon="11.22389060" version="1">
 +  <tag k="amenity" v="place_of_worship"/>
 +  <tag k="name" v="Pieve di San Severo"/>
 +</node>
 +</file>
 +
 +e lo stile **styles/default/points** contenga una riga del tipo:
 +
 +<file>
 +amenity=place_of_worship [0x2c0d resolution 24]
 +</file>
 +
 +Si è verificato invece che in alcune condizioni ciò non accade, la categoria **Community** riporta **No Results found - Try Adjusting Search Parameters**. Dalle prove fatte è necessario rispettare le seguenti condizioni per **evitare il bug**:
 +
 +  - Il file mappa OSM deve **contenere dei nodi** - eventualmente fasulli - che verranno assegnati agli stili da 0x2c0a a 0x2c0c. Tali nodi devono essere in prossimità degli altri, cioè più o meno nel range della mappa; posizionandoli in prossimità delle coordinate lat=0 lon=0 non funziona.
 +  - Il file dello stile deve definire degli stili per i nodi di cui sopra, **assegando le icone da 0x2c0a a 0x2c0c**.
 +
 +In pratica sembra che l'eTrex abbia bisogno che nella mappa esista **la serie completa di sottotipi** (in questo caso a partire da 0x2c0a fino a quello che interessa a noi, cioè il 0x2c0d), altrimenti la categoria non viene creata. Non è chiaro come mai la serie completa in questo caso può iniziare da 0x2c0a, quando intuitivamente si potrebbe pensare che la serie inizia con 0x2c00.
 +
 +
 +===== mkgmap =====
 +
 +L'ultimo passaggio è quindi la compilazione della mappa con stile e simbolismo personalizzato.
 +
 +Durante l'invocazione di **mkgmap** è sufficiente passare il riferimento alla **directory con lo stile modificato** e al file con le **modifiche al simbolismo** per ottenere la mappa desiderata (il file TYP viene compilato al volo):
 +
 +<code>
 +mkgmap \
 +    --reduce-point-density=4 --unicode \
 +    --description="Trekking map for eTrex-10" \
 +    --style-file='./styles/default/' \
 +    --country-name='Italy' --country-abbr='I' \
 +    --region-name='Toscana' \
 +    --family-id=9999 \
 +    --gmapsupp 63240*.osm.pbf \
 +    ./typ/my_etrex10.txt
 +</code>
 +
 +L'opzione **%%--region-name%%** viene usata come stringa da visualizzare accanto al nome del centro abitato nella visualizzazione dell'elenco, altrimenti compare la stringa generica **ABC**. FIXME Forse esiste la possibilità di usare i confini amministrativi e l'indicizzazione degli indirizzi per associare il centro abitato al nome del comune che lo contiene?
 +
 +===== Riferimenti Web =====
 +
 +  * **[[http://www.mkgmap.org.uk/doc/typ-compiler|The mkgmap TYP file compiler]]**
 +  * **[[https://www.mkgmap.org.uk/doc/pdf/style-manual.pdf|mkgmap Conversion Style manual]]** - Qui una {{.:etrex_osm:mkgmap-style-manual.pdf|copia locale}}.
 +  * **[[https://wiki.openstreetmap.org/wiki/Mkgmap/help/style_rules|Mkgmap style rules]]** - Dichiarata //outdated//, ma utile.
 +  * **[[http://www.cferrero.net/maps/guide_to_TYPs.html|Guide to TYP files]]**
 +  * **[[http://gps.maroufi.net/etrex10map.shtml|Karten auf dem eTrex 10]]**
 +  * **[[https://sites.google.com/site/sherco40/]]** Il programma **TYPViewer** (per Windows, ma che gira anche sotto Wine) consente di ispezionare i file TYP compilati, traducendoli in testo sorgente e mostrando graficamente il simbolismo.
 +  * **[[https://extract.bbbike.org/|BBBike Extract OpenStreetMap]]** - Produce automaticamente mappe anche per Garmin.
tecnica/gps_cartografia_gis/osm_recipes.1524719041.txt.gz · Last modified: 2018/04/26 07:04 by niccolo