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/05/05 07:10] – [Personalizzazione del simbolismo (file TYP)] 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** 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**:
  
-^ %%--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 confini amministrativi e l'indicizzazione degli indirizzi per associare il centro abitato al nome del comune che lo contiene?  |+<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 pezzi =====
  
-===== Stile della mappa =====+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 ===== 
 + 
 +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: 
 + 
 +  * 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 247: Line 305:
 ==== Personalizzazione dello stile "default" ==== ==== Personalizzazione dello stile "default" ====
  
-Queste le esigenze per una mappa destinata all'**escursionismo off-road**:+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**.   * 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**.   * 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**.   * 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: Dai sorgenti di **mkgmap** si è estratta tutta la directory **mkgmap-r3741/resources/styles/default/**, quindi si sono modificati due file:
Line 278: Line 345:
 ==== Personalizzazione del simbolismo (file TYP) ==== ==== 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 in un oggetto Garmin **line Type=0x0a**, che viene mostrata sul display dell'eTrex 10 con un certo spessore e colore.+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 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.+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: Per ottenere il risultato è sufficiente creare un file **my_etrex10.txt** con questo contenuto:
Line 295: Line 362:
 UseOrientation=Y UseOrientation=Y
 Xpm="32 1 2  1" Xpm="32 1 2  1"
-"c #000000"+"c #000000"
  c none"  c none"
-"!!!!!!  !!!!!!  !!!!!!  !!!!!!  "+"------  ------  ------  ------  "
 ;12345678901234567890123456789012 ;12345678901234567890123456789012
 String1=0x04,Track String1=0x04,Track
Line 308: Line 375:
 UseOrientation=Y UseOrientation=Y
 Xpm="32 1 2  1" Xpm="32 1 2  1"
-"c #808080"+"c #808080"
  c none"  c none"
-"!!!!  !!!!  !!!!  !!!!  !!!!  !!"+"----  -----  ----  -----  ----  "
 ;12345678901234567890123456789012 ;12345678901234567890123456789012
 String1=0x04,Path String1=0x04,Path
Line 317: Line 384:
 </file> </file>
  
-La riga **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.+**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.1525497040.txt.gz · Last modified: 2018/05/05 07:10 by niccolo