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
Last revisionBoth sides next revision
tecnica:gps_cartografia_gis:osm_recipes [2018/05/05 07:26] – [Personalizzazione dello stile default] niccolotecnica:gps_cartografia_gis:osm_recipes [2020/07/31 09:53] – [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 260: Line 318:
 ^ Centri abitati minori  |             5 km |           19 |        2 | ^ Centri abitati minori  |             5 km |           19 |        2 |
 ^ Track e path                       2 km |           20 |        1 | ^ Track e path                       2 km |           20 |        1 |
-^ Waypoint                       120-80 m |           24 |        |+^ Waypoint                       120-80 m |           24 |        |
  
 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 287: 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 304: 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 317: 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 326: 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 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 zoomQuesto è 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 con un codice Type diverso, qualcosa del tipo:
  
-==== Compilazione della mappa con stile e simbolismo personalizzato ====+<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>
  
-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 (non è necessario precompilare il file TYP):+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> <code>
Line 343: Line 440:
     ./typ/my_etrex10.txt     ./typ/my_etrex10.txt
 </code> </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/|Extract OpenStreetMap]]** - Produce automaticamente mappe anche per Garmin.
tecnica/gps_cartografia_gis/osm_recipes.txt · Last modified: 2020/07/31 09:54 by niccolo