Cascafico's diary

Recent diary entries

Openrefine needs Nominatim certificates

Posted by Cascafico on 1 February 2019 in Italian (Italiano)

I was trying to geocode addresses via Nominatim, using the OpenRefine function “fetch from URL”, but I got empty strings. I re-run it, checking “store error box” and I got the problem: certificate was not recognized or missing. A little confusion: why browser happly donwloaded geocoding rresponses, while OR didn’t?

OR rely on Java funcions to do the job, so I had to fix certificate issue in the following way:

  • get certificate:
    $ openssl x509 -in <(openssl s_client -connect -prexit 2>/dev/null) -out /tmp/nominatim.crt

  • store it:
    $ keytool -import -file /tmp/nominatim.crt -keystore cacerts -storepass changeit

  • If keytools complains about finding cacert:
    $ find / -name cacerts -print
    (in my raspbian Java installation)

Monitor OSM changes

Posted by Cascafico on 14 December 2018 in Italian (Italiano)


Mountain hiking association asked me to monitor local hiking relations from edits done by other mappers. I wrote this script which generates an html page with OSM changeset involving daily changes. It is feeded by overpass-turbo query, like this, so you can customize which OSM objects to monitor.


The mentioned monitor script will:

  • extract relations modified in the last 24h and tagged operator=”CAI” in area provided as argument
  • filter useful informations
  • format an html file with OSM, Achavi and OSMcha links

automate runs

Of course it can be run periodically using crontab. To set a daily run, just execute
$ crontab -e
add a line like below, customizing your script path:
0 0 * * * /home/pi/scripts/  » /dev/null 2>&1


My instance include a telegram service fired when a changeset list is written. I use telegram-cli with the following line in script:
echo “msg $CHANNEL $MESSAGE”; echo “safe_quit” | /home/pi/apps/tg/bin/telegram-cli -W

Just add telegram CHANNEL and MESSAGE variables and insert the line inside $CHAN==0 else if


Fix area names which include spaces, ie “Cividale del Friuli”

Hiking relations in wiki table

Posted by Cascafico on 10 December 2018 in Italian (Italiano)


When adding several hiking routes, sometime it comes handy having updated tables in wiki format to be easily added in specific wiki pages.


  • overpass query on area name
  • some awk insertions
  • pyhon script csv2wiki


This overpass query will generate a csv file(ie: stregna.csv) with local network hiking paths. Example output:

6934010,Sentiero Italia - Tappa A14,SI,lwn
7112799,Sentiero Hum,,lwn

This awk will add OSM link to each relation:
$ awk -F “,” ‘FNR == 1 {print $0} FNR > 1 { print “[”$1” “$1”],”$2”,”$3”,”$4 }’ stregna.csv > stregna.txt

actual wiki formatting

Python script will generate the actual wiki text:
$ python csv2wiki stregna.txt >

summarizing script

This script performs the steps above (here you can customize query with whatever relation tags). Just provide an OSM area name.

Dirty datasets

Posted by Cascafico on 14 November 2018 in Italian (Italiano)

Mini abstract

I’ve found a 600+ rows Bed&Breakfast dataset, available opendata by RAFVG. No geo coordinates. Since hiousenumbers were recently imported from RAFVG dataset, I decided to go for geocoding. To get reliable coordinates I used csvgeocode script attached to nominatim geocoding service. Nominatim requires almost perfect (standardized) odonyms, hence I started openrefine and a reconcile service which comes in a separate jar. Reconcile service needs a csv with authoritative names, which I get from overpass-turbo and some filtering.


Bed and Breakfast is a rather new dataset (Oct 17) with more than 600 POIs. Many useful fields such as

  • name and operator
  • phone
  • email
  • site
  • opening hours
  • category (standard, comfort, superior)

Cleaninig data

Such duty has been accomplished by OpenRefine and Reconcilie plugin, connected as a reconciliation service,

In order to standardize messy B&B addresses (entered by B&B operators theirselves) I had to provide Reconcile with an authoritative set of highway names, which I got from overpass-turbo (see Strade d’Italia diary entry).


Just happened for other projects, I choose csvgecode which features pretty simple usage.

Here is a run using mapbox service:

$ csvgeocode input.csv output.csv –handler mapbox –delay 1000 –verbose –url “{{INDIRIZZO}},{{CAP}} {{COMUNE}}.json?access_token="

here using nominatim, instead:

$ csvgeocode input.csv output.csv –handler osm –delay 1000 –verbose –url “{{INDIRIZZO 1}}, {{COMUNE}}&format=json” Rows geocoded: 468
Rows failed: 114
Time elapsed: 879.4 seconds

114 rows not geocoded expose a geocoder problem with apostrophes in city field. Workaround to bypass such not escapable apostrophe is both removing it (ie: Farra d’Isonzo » Farra disonzo) or use postcode instead. Same problem for address, which only remove solution (ie: San Francesco d’Assisi » San Francescao dassisi). Of course above edits are for geocoding sake only. Besides, part of “success” geocoding rows could have been geocoded even with missing housenumber, resulting in highway centroid coordinates. To limit these false positives, I had to check which municipality were imported, faceting out rows belonging to municipalities in red


Conflation matched just 11 POIs, so If you want to collaborate in B&B import, here you can find the audit map to review mostly new nodes.

CAP (postcodes) of Italy

Posted by Cascafico on 29 August 2018 in Italian (Italiano)


Codici di Avviamento Postale (postcodes) are propriety of Poste Italiane S.p.A. Sometimes OSM mappers who love the completeness of data cannot get this codes from open sources.
The below procedure is a simple workaround, taking advantage of iPA (Public Administration index) OpenData which lists widespread public offices in Italy.

Getting data

Go to iPA site and download “Amministrazioni” file. Here you can read when it was last updated.

Fitlering data

On downloaded file, run:
$> awk –field-separator=”\t” ‘{ print $3”,”$6 }’ amministrazioni.txt | sort -u > CAP.csv
The command above takes TAB-separated columns 3 and 6 (municipality and postcode), sorting uniques and writes a comma-separated file.

Alternatively, you can switch columns for postcode sorting:
$> awk –field-separator=”\t” ‘{ print $6”,”$3 }’ amministrazioni.txt | sort -u > CAP.csv

Multi postcode municipalities:

Some cities have more than one postcode: it could be someway useful listing public office addresses (column 10) to approximately identify the area:
$> awk –field-separator=”\t” ‘{ print $3”,”$6”,”$10 }’ amministrazioni.txt | sort -u > CAP.csv

Take a look

To count extracted postcodes, simply:
$> wc -l CAP.csv
8638 cap.csv

For an overview of firsts and lasts codes:
$> head -3 CAP.csv && echo “…” && tail -3 CAP.csv
Abano Terme,35031
Abbadia Cerreto,26834
Abbadia Lariana,23821



Please, find in CSVs repo processed files.

Strade d'Italia

Posted by Cascafico on 21 June 2018 in Italian (Italiano)

Qualcuno in ML si era chiesto come rappresentare la diffusione dei vari odonimi nazionali. Il metodo grezzo sarebbe scaricare qualche Gbyte di pbf da Geofabrik ed utilizzare osmconvert e osmfilter. Ma per perché trasferire inutilmente il 99% dei dati? Facciamo invece lavorare overpass-turbo per noi :-)

I file che troverete citati di seguito sono disponibili in github come pure lo script bash che li genera.

Codice ISTAT

E’ noto che ogni comune italiano non può avere lo stesso odonimo per strade diverse, per cui la query se eseguita per ogni comune, ci permetterà di isolare solo la prima occorrenza del nome. Come individuare univocamente un comune? Il codice ISTAT assegnato al tag ref:ISTAT ci viene in aiuto. Facciamoci un’idea di quanti comuni abbiamo e qual’è il loro codice: query codici ISTAT comuni italiani

Sintetizzo l’output del file municipality_codes (7955 linee) con le prime e le ultime:


Adesso sappiamo che è numerico, composto da 6 cifre e che l’Italia ne ha oltre 7955; internet ci viene in aiuto rivelandoci che le prime 3 sono il codice provincia. Se poi ci viene la cursiosità di sapere quante sono, sul municipality_codes ottenuto sopra eseguimo un:
pi@raspberrypi:~ cat municipality_codes | cut -c 1-3 | sort -u | wc -l

Per i nostri scopi creiamo anche la lista delle provincie province_codes:
pi@raspberrypi:~ cat municipality_codes | cut -c 1-3 | sort -u > province_codes

Con municipality_codes potremmo già eseguire in loop una query overpass che estrarrebbe tutto, ma sia per limitare le richieste al server, sia per rendere futuri aggiornamenti dei nomi più gestibili, rompiamo ulteriormente municipality_codes generando un file per ogni provincia con la lista dei codici ISTAT dei suoi comuni; otteniamo per esempio il file “100”: pi@raspberrypi:~ cat 100

Script di query overpass-turbo

Lo script accetta come argomento un intervallo definito da due codici provincia ricavati precedentemente, in modo da limitare le richieste ed eseguirle in più tempi. Per esempio:
pi@raspberrypi:~ ./ 001 041
Inoltre lo script sceglie la prima occorrenza dell’odonimo, evitando di elencare gli eventuali altri pezzi di way. Formisce poi le coordinate del centro, in modo da poter facilmente generare una umap.
Una successiva esecuzione dello script su provincie già elaborate non sovrascriverà i risultati: può quindi essere necessario rimuovere i file con estensione csv se sono vuoti (a causa per esempio di disconnessioni o timeout overpass).

La soluzione che preferisco è eseguire con un solo codice provincia, per esempio:
pi@raspberrypi:~ ./ 041
Possiamo poi con una sola linea eseguire il tutto su scala nazionale:
pi@raspberrypi:~ while read province_codes; do ./ $province_codes; done

Elaborazione risultati

Che ce ne facciamo di questo centinaio di file .csv? Possiamo per esempio filtrare “Rosmini” e preparare il file per essere importato sulla umap degli Odonimi italiani:

Con il metodo manuale

Con un paio di comandi possiamo manipolare i risultati:
pi@raspberrypi:~ cat ???_names.csv | grep Rosmini > Rosmini.csv
aggiungendo gli header necessari alla rappresentazione spaziale:
pi@raspberrypi:~ sed -i ‘1 i\odonimo,lat,lon’ Rosmini.csv

Con il bot telegram

Ho fatto un bot che usegue più o meno i comandi manuali sopracitati: si chiama @italynames_bot e lo potete aggiungere ai vostri contatti. L’ho scritto in python solo perchè non son riuscito a far funzionare la versione in bash. Il codice è qui e perchè funzioni è necessaria la libreria telepot. Se gli inviate una stringa, vi informa quante volte l’ha trovata e vi manda il file .csv, pronto per l’importazione in umap.


crontab che periodicamente controlli se ci sono modifiche ai nomi delle vie… overpass-turbo query ha problemi di ram

Panoramica ciclabili Milano con umap

Posted by Cascafico on 15 May 2018 in Italian (Italiano)

Il comune di Milano ha pubblicato un dataset delle piste ciclabili. Facciamo una umap per capire la situazione rispetto ad osm.

  • facciamo il login con le credenziali OSM
  • selezioniamo “creare una mappa”
  • importiamo il dataset (nel nostro caso geojson) con il bottone e dx “importa dati”; se il nostro file non ha una estensione esplicita, dobbiamo informare umap di cosa si tratta con “scegli il formato dati”; se va tutto bene ci troviamo il layer delle ciclabili nel colore di default (blu).
  • otteniamo i dati al volo tramite overpass-turbo: questa è la query per Milano che estrae le ciclabili da OSM, per altri comuni basta sostituire la geocodeArea in alto.
  • su overpass-turbo salviamo da qualche parte la stringa che genera i dati della query: export>query, clicchiamo sul “compact” e copiamo il link
  • per importare i dati della query in umap è necessario creare un nuovo layer ed aprire il form a destra su “dati remoti”; qui incolleremo la stringa appena copiata; scegliamo il formato dati “osm”; mettiamo in ON le opzioni “dinamico” e “richiesta proxy”
  • salviamo la mappa e dopo alcuni secondi (dipende da traffico su overpass-turbo) dovremmo vedere anche il layer dei dati estratti da OSM.

Questa è la procedura di base, dopicichè si tratta di aggiustare lo sfondo (ho scelto il monocromatico), i colori dei layer e le eventuali etichette che appaiono passando il mouse sopra ed al click.

Elevations mass editing

Posted by Cascafico on 13 March 2018 in Italian (Italiano)

Update: comments pointed out that such edits are against the code of conduct, even if not automated. I leave this post just as personal hint on queries and regexp’s.

It happens there’s a lot of OSM tags “ele”=” m" that can't be processed by useful queries like [find volcanoes between 1000 and 2500 meters high](

How I remove unit of measure:

  • download faulty data with this generic overpass-turbo query
  • from export menu, “download/copy as raw OSM data”

  • load resulting .osm file in Notepad++ (or whatever regexp editor)
  • find&replace (CTRL+h) twice with the following fields:
    find: k=”ele” v=”(\d+(.\d+)) m” will find for example “450.5 m”
    replace: k=”ele” v=”$1” will replace “450.5”
    find: k=”ele” v=”(\d+) m” will find for example “450 m”
    replace: k=”ele” v=”$1” will replace “450”
  • load in JOSM modified .osm file
  • select all (CTRL+a) and add a fake tag (ie: pippo=pluto) to every node and remove it (just a shortcut to add “modify” tag to elements, otherwise you won’t be able to upload anything

Remember to add proper changeset comment.

Civici da Telegram

Posted by Cascafico on 22 February 2018 in Italian (Italiano)

Piersoft ha formito un prototipo a “Roma Capitale” per la rilevazione di punti di interesse (PDI) via bot Telegram.

La umap contiene in basso a sinistra il collegamento per scaricare i dati raccolti in formato csv.

I dati sono di pubblico dominio (CC0); tra varie categorie di PDI ci sono anche i numeri civici; i campi oltre al numero inserito dal rilevatore, contengono la data del sopralluogo ed il geocoding (via Nominatim) della strada; per importarli in Openstreetmap è necessario convertirli per esempio con csv2osm. Nel caso volessimo importare i civici in OSM avendo cura di:

  1. filtrare il .csv per “categoria”=”Civico” perl -i -ne ‘print if /,Civico/’ map_data.txt

  2. aggiungere lo header del .csv modificato, lasciando solo i campi utli del .csv:
    lat, lon,,,survey:date,,,source,,,,description,addr:housenumber

  3. adattare i valid_tags del .py
    valid_tags = [‘addr:housenumber’, ‘survey:date’, ‘source’, ‘description’]

  4. eseguire la conversione: python map_data.txt > civici.osm

Importato in JOSM il file civici.osm, eliminare errori di battitura o civici non validi, cercandoli (CTRL+F) con la stringa:

“addr:housenumber”=[0-9]*[a-z] or “addr:housenumber”=[0-9]*

avendo cura di abilitare “espressione regolare” tra i checkbox a sinistra.

In alternativa, per evitare questo lavoro di editing, credo sia possibile installare in JOSM il plugin per importare i file csv, ma la mia release è piuttosto vecchiotta e non accetta funzioni aggiuntive.

Ovviamente resta il problema della “conflation”, ovvero di importare solo i civici che non sono stati già mappati, nonchè addr:streetname.

Routing QA [eng]

Posted by Cascafico on 29 November 2017 in Italian (Italiano)

Mini abstract

Quoting OSM wiki about routing

“Checking your fix. After you have fixed an error on the map you will need to wait until the revised version of the map propagates into the routing engine you are using. This delay will depend for each engine…”,

…one of the problems in Qualty Assurance (QA) is the lag between OSM editing and update of routing databases. As far as I know, implementation takes some hours in Grasshopper and 24+ in Mapzen and OSMRM.

Hence, in trying to solve a routing problen (ie: for an interchange) testing can only be done well beyond editing time :-(

Let’s see how we can bypass this delay using an homemade router.

Choosing a router

Routino looks simple, functional and flexible. I picked out this SW because it works flawlessly even on a small device like my OrangeePi: as an example, you can route in Friuli Venezia Giulia with this live instance, updated daily. For larger areas we’d soon experience performance problems; so let’s leave global routinig up to above mentioned services and focus on a kind of patchwork on-demand…

Automating patch generation

User should be able to choose the area to debug: to achieve this (and due to my zero experience in html/perl scripts) I create a Telegram bot named Routino Patcher and a bash script to manage content.

What happens is:

  • bot ask you for “Location” (from mobile device GPS or thru attachment) and triggers script;
  • script runs a query [added barriers] around coordinates received which download an .osm containing highway and restrictions only [e barrier]; preset area is square 0.002° [cos(latitude) TBD];
  • script performs some cleaning ops (routino “planetsplitter” tool abort if “meta” and “note” tags are found in .osm input) and updates extents of routable database (which grows upon to accomodate each requested location);
  • in 30” or so, bot displays a message which comfirms routing database update (details can be found in routino data page) and a link to routino webGUI map, updated with our “patch”.

For each location sent, the related .osm is processed together with other areas previously requested [incremental update TBD]. Since this is a service wich aims to test “fresh” OSM edits, locations older than 24h are purged.


I know my low programming skills leaded to this dirty solution, but I needed it, hoping that in the meantime someone will find/build a service like this, already working and using a single interface :-)

Location: Baldasseria Media, UTI del Friuli Centrale, Friuli Venezia Giulia, 33100, Italia

Routing QA

Posted by Cascafico on 3 October 2017 in Italian (Italiano)

Mini abstract

Come riportato nella wiki sul routing. “Checking your fix. After you have fixed an error on the map you will need to wait until the revised version of the map propagates into the routing engine you are using. This delay will depend for each engine…”, uno dei problemi della Qualty Assurance (QA) è il tempo che intercorre tra la modifica OSM e l’integrazione nei database di routing. Per quel che ho visto, Grasshopper è più rapido ad aggiornarsi di Mapzen ed OSMRM, ma si tratta sempre di alcune ore per il primo e più di un giorno per gli altri.

Se trovo un problema di routing ad uno svincolo e cerco di risolverlo, il riscontro va ben oltre il tempo di editing, Vediamo quindi se possiamo ovviare a questo ritardo, in modo casalingo…

Individuiamo un router

Routino sembra essere semplice, funzionale e flessibile. La mia scelta è caduta su questo SW, perchè funziona agilmente anche sul mio OrangePi, con il quale posso fare routing sui dati per il Friuli Venezia Giulia. Per aree più estese si incontrerebbero presto i limiti hardware di questa macchinetta, per cui lasciamo il routing mondiale ai servizi sopraccitati e dedichiamoci a come generare al volo una sorta di patchwork on-demand…

Automatizziamo la compilazione

L’utilizzatore deve poter scegliere la zona geografica che vuole controllare; all’uopo (non avendo conoscenze di programmazione html5) ho creato un bot Telegram che ho chiamato RoutinoBot ed un bash script che ne gestisce i dati ottenuti. Quello che succede è:

  • il bot chiede una “Location” (da spedirgli con la “graffetta”)
  • lo script lancia una query [aggiungere barrier] con le coordinate ricevute che scarica un .osm contente solo highway e restriction [e barrier] di un’area di lato 0.002° [cos(latitudine) TBD]
  • lo script esegue alcune operazioni di pulizia (il tool di routino planetsplitter non accetta tag “metà” e “note” nei .osm in input) ed aggiona database ed estremi della mappa navigabile;
  • al bot viene mandato un messaggio da @Cascafico [TBM] a segnalare l’aggiornamento.
  • la mappa navigabile, aggiornata con la nostra patch, é accesibile sulla webGUI di routino

Per ogni Location inviata, sul server viene salvato il relativo .osm e viene ricompilato il database di routino [aggiornamento incrementale TBD]. Considerato che è un servizio di test finalizzato al controllo QA di dati “freschi”, ogni Location più vecchia di 24h viene cancellata.

[articolo in compilazione…]

OSM Analytic Tracker (OSMAT)

Posted by Cascafico on 18 September 2017 in Italian (Italiano)


Tracking vandalisms is often not an easy task. To accomplish this activity I hardly find useful digging in the history of OSM changesets.

Instead OSMAT features a clean list of create/modifiy/deletes and tag changes; the latter one is particularly useful to track “advanced vandalism”.

OSMAT focuses on fast detection, so don’t expect to configure it on a national base, since rows will start to scroll too fast for spotting problems. For the same reason, OSMAT relies on minimal base of mappers and (quoting its wiki) “Improve[s] team spirit of a regional OSM team/task-force”.

The following installation procedure has been brought live on a OrangePi PC single-board computer. Here you can find a regional live instance for Friuli Venezia Giulia Italy.

Docker installation

OSMAT deployment is Docker based, so refer to Davide’s Docker installation
UPDATE: as from 2019-03-20 installation command quoted at the above link doesn’t work anymore for my debian jessie armhf. Please, use the following:
$ sudo curl -sSL | sh

OSMAT download

Then download OSMAT sources:
$ git clone

Check docker service

$ sudo service docker status
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled)
Active: active (running) since Sat 2017-09-16 11:40:37 CEST; 2 days ago

OSMAT configure

Once you got docker up and running (I had to upgrade linux kernel > 3.10 for my Jessie Orange Pi) and before compiling container, you have to configure active region.

Default available regions are the ones defined by Geofabrik. For instance, navigate to nord-est, take note of .poly link (nowadays is and edit configuration file:

$ cd osm-analytic-tracker
$ vi config.json
You’ll need to replace 3 occourences of default “denmark.poly” with your poly (for instance “nord-est.poly”, without any trailing URL).

Optionally, here you can also adjust:

  • map zoom level and time horizon, just search for “map_scale”: “6”
  • logging interval, search for “horizon_hours”: “48”

Compile container

Once you’re done with region & zoom configuration, set your device OS (mine is Armbian, which I’ve found Raspian compatible) commenting one of the following lines :
$ vi Dockerfile
#FROM debian:jessie
FROM resin/rpi-raspbian

then compile container:
$ sudo docker build -t osm-analytic-tracker .


Then choose which port to listen (mine is 8889) and run it!
$ docker run -d –restart=always –name=osmat-container -p 8889:80 osm-analytic-tracker

[optional] Customizing

If you need a particular Area Of Interest, I’ve found easier to add a line in default regions list:

  1. Build a polygon: use JOSM opendata plugin to easily build and save a .poly which will be your AOI.
  2. Publish myAOI.poly somewere in internet
  3. Edit docker/regions.txt adding (or replacing) geofabrik URI’s with your URI, for instance:
    $ cd docker
    $ vi regions.txt
  4. Stop, remove and re-run container:
    $ docker stop osmat-container
    $ docker rm osmat-container
    $ docker run -d –restart=always –name=osmat-container -p 8889:80 osm-analytic-tracker

Try it

Go to http:127:0.0.1:8889 and wait for some changeset :-)

If you don’t see any changeset, at least you should see the map centered in your AOI and read in the upper right corner “Lag” around 1-5 minutes. Just wait for the next OSM changeset.

Controllare una rete di sentieri

Posted by Cascafico on 16 June 2017 in Italian (Italiano)

A seguito dell’accordo di collaborazione tra Club Alpino Italiano e Wikimedia Italia, si cercherà di fare un po’ di ordine nella rete delle relazioni sentieri CAI in modo che possa anche essere facilmente aggiornata. All’uopo è stata creata la pagina wiki OSM CAI che elenca nel dettaglio gli attributi che gli elementi escursionistici devono/possono avere.

Quello che segue è il metodo che sto applicando per il controllo delle relazioni CAI, applicato al settore 7 del Friuli Venezia Giulia. Lo strumento principale usato è overpass-turbo. L’identificativo numerico “@id” della relazione ci servirà per isolare facilmente tutti gli elementi che compongono il sentiero.

Situazione sopralluoghi

Intanto un’occhiata all’area geografica coinvolta: inquadriamo l’area che contiene i nostri sentieri ed eseguiamo questa query che evidenzia su mappa le relazioni del settore 7XX operate dal CAI che sono state etichettate con sopralluogo (survey:date=2017).

Poi ne generiamo
una lista:
@id @type name ref 1867679 relation 725 725
1867680 relation 749
7272887 relation 752
7276582 relation 746 746

Analogamente generiamo la lista delle relazioni senza survey:
@id @type name ref
126402 relation 727 727
1121382 relation 761a 761a
141593 relation 702
380612 relation sentiero C.A.I. 727 727
419017 relation 727A 727A

Non c’è molta uniformità nell’uso di “name” e “ref”, ma possiamo tralasciare.

Controlli OSM

Prendiamo per esempio la prima relazione senza sopralluogo del sentiero 702 con @id=141593 e controlliamola con due utili servizi online:
- OSM Relation Analyzer per vedere eventuali interruzioni del percorso, composizione dei tratti ecc.
- Waymarked trails per vedere la simbologia utilizzata, il profilo altimetrico ed una sitesi delle etichette.

Al momento la relazione passa il test dell’OSM Relation Analyzer; con Waymarked notiamo che il simbolo (bandierina rosso-bianca con numero generata dal tag osmc:symbol=green:red:white_bar:702:black)) è corretto mentre non è attivo il collegamento al profilo altimetrico: esso non è stato generato dal servizio, poichè il percorso è a “Y” (ha più di due estremità). Non c’è molto da fare: dovremo verificare con sopralluogo o con altre fonti se ciò sia corretto nella realtà.

Eseguito il controllo prettamente geometrico del sentiero, passiamo alle altre etichette: notiamo che non ci sono quelle di “network”, “from”, “to” ed altre come definito dalla wiki OSM CAI.

Che fare se la relazione è spezzata

Nel caso la relazione sia incompleta o qualche mappatore ne abbia cancellato una parte, OSM Relation Analyzer evidenzia subito il problema. Prendiamo l’analisi del percorso Vertikala SPDT: ci informa che la relazione è “Split into several pieces”; clicchiamo “analyze on map” e notiamo parecchi pin ad indicarci i punti di interruzione; con JOSM “Scarica oggetto”inseriamo 7201084 ed apriamo il suo modulo: opereremo nel lungo elenco di membri (sulla sinistra quelli della relazione, sulla destra i selezionati) ed useremo i bottoni che dividono le due liste per muoverci rapidamente tra i segmenti che si spera siano già ordinati.

Pre - sopralluogo

Prima di uscire, vediamo cosa ci offre OSM come elementi escursionistici già mappati. A tal scopo usiamo una query che ci riveli quelli in prossimità percorso. Notiamo che ci sarebbero la Forca Slips, un paio di guadi e dell’acqua da bere. A questo punto controlliamo quali eventualmente aggiungere alla relazione del sentiero CAI 702 con i consueti editor OSM. Personalmente uso JOSM, che mi permette di scaricare al volo la relazione e tutti gli elementi contenuti dalla voce di menu “Scarica oggetto” e numero @id. Se volessi scaricare il risultato della query che include anche gli elementi prossimi, basterebbe esportare i dati grezzi o per JOSM della query.

Location: Madriolo, UTI del Natisone, Friuli Venezia Giulia, 33043, Italia

[umap] Inserire stock di immagini dotate di exif

Posted by Cascafico on 29 May 2017 in Italian (Italiano)

Problema: la locale sede del CAI ha molte foto georeferenziate dei segnavia sentieri e vuole inserire le informazioni in Openstreetmap.

  1. installare exiftool sudo apt-get install exiftool

  2. creare il file csv da importare su umap con exiftool exiftool -filename -gpslatitude -gpslongitude -n -csv segnavia.csv

  3. mandare in qualche server i file delle foto; per esempio: sftp -P <porta di solito 22> «< $’put /root/Desktop/cai/out.csv’

  4. caricare come layer csv in umap e customizzare per un Level0 l’inserimento come nodi OSM

Preparare un import di toponimi

Posted by Cascafico on 11 May 2017 in Italian (Italiano)


La regione Friuli Venezia Giulia apre i dati dei toponimi orografici, una tabella di circa 8.000 nodi in cui appaiono i campi latitudine, longitudine, toponimo, comune di appartenenza.

Il problema è preparare un import nel DB Openstreetmap nel quale si suppone gran parte di tali toponimi siano già esistenti.


Eseguire un geocoding su OSM e filtrare la tabella mantenendo le righe che non contengono corrispondenze.


  • csvgeocode permette di ottenere le coordinate a partire dal nome, gestendo la consultazione di Nominatim (server dei nomi di Openstreetmap) per ogni riga di una tabella csv. Istalliamo: > sudo apt-get install npm
    > sudo npm install -g csvgeocode
    e, per alcuni sistemi,
    > sudo ln -s /usr/bin/nodejs /usr/bin/node

  • Nominatim la cui API restituisce le coordinate geografiche in base alla eventuale corrispondenza del nome.


La tabella toponimi_orografici.csv potrebbe per esempio contenere:

46.594043,12.784886,Bosco Suttul,Forni Avoltri
46.591637,12.787770,Buialecis,Forni Avoltri
46.590845,12.792660,Buialecis,Forni Avoltri

Avremo cura di rinominare le intestazioni relative alle coordinate, perchè non siano riscritte da csvgeocode:

46.594043,12.784886,Bosco Suttul,Forni Avoltri
46.591637,12.787770,Buialecis,Forni Avoltri
46.590845,12.792660,Buialecis,Forni Avoltri

Riga di comando

csvgeocode toponimi_orografici.csv out.csv \ –handler osm \
– delay 1000 \
–verbose \ –url “{{toponimo}},{{comune}}&format=json&viewvbox=12.3,46.68,13.95,45.54”

”–handler osm” definisce il servizio di ricerca Nominatim, che prevede la possibilità di inserire oltre alla query anche dei parametri di ricerca; nell’esempio sopra, il comune e la bounding box della regione.
“–delay 1000” definisce il ritardo tra le richieste, secondo la policy per Nominatim


Otteniamo la tabella out.csv:

46.594043,12.784886,Bosco Suttul,Forni Avoltri,,
46.591637,12.787770,Buialecis,Forni Avoltri,46.592597,12.7920874
46.590845,12.792660,Buialecis,Forni Avoltri,46.592597,12.7920874
46.579674,12.781615,Canale di Gorto,Forni Avoltri,,

csvgeocode ha aggiunto e valorizzato (laddove Nominatim trova corrispondenza) i campi “lat” e “lng”.


Ora possiamo filtrare la tabella con il nostro strumento preferito e prepararci ad importare. Potremmo per esempio usare Qgis per eliminare le righe che hanno coordinate da Nominatim (cioè quelle degli elementi già in OSM) e magari discriminare tutte le righe che iniziano per “Monte “ dal resto dei toponimi, in modo da otterene diverso tag per l’importazione (natural=peak piuttosto che place=locality).

Un esempio per il “calcolatore di campi” di Qgis:
CASE WHEN “toponimo” LIKE ‘Monte %’ THEN ‘natural=peak’ else ‘place=locality’ END

Trasporti urbani di Gorizia

Posted by Cascafico on 12 July 2016 in Italian (Italiano)

Riprendo ancora questo tema.

Raccolta dei dati

Fermate (GTFS stops.txt)

Query ovepass per la “Rete del Trasporto Pubblico Urbano di Gorizia” dell’operatore “APT”

Viaggi (GTFS trips.txt)

Devo estrarre la sequenza di fermate per ogni linea.
1: Sant’andrea - Montesanto
1: Montesanto - Sant’Andrea


Per la linea from=Montesanto ottengo la sequenza
ref 07002 07040 …
07032 07035 CIP05 07213

devo verificare in OSM perchè sembra che si tratti del viaggio opposto (infatti la fermata iniziale 07002 è a Sant’Andrea. Da invertire l’ordine nella relazione.

Sistemato, posso elaborare con spreasheet…



Be’ qua il lavoro comincia a farsi tosto e noioso… Perché non provare gtfs-editor? É open source, le procedure sono guidate e mi permette di creare da mappa, con un riscontro decisamente più immediato.


  • Tengo utile la query che mi elenca le fermate e le relative coordinate
  • creo un Agenzia ed una route con un paio di fermate cliccate a caso sulla mappa
  • esporto un gtfs giusto per avere un template dove inserire le vere fermate della query
  • adatto gli header del CSV ed importo il gtfs modificato. A questo punto ho tutte le fermate sulla mappa
  • rinuncio alla query delle relazioni OSM, a favore del clicca su mappa la sequenza (trip)
Location: Sant'Andrea, Gorizia, UTI Collio - Alto Isonzo, Friuli Venezia Giulia, 34170, Italia

Transit APT

Posted by Cascafico on 28 June 2016 in Italian (Italiano)

Inizio a compilare i file GTFS per l’Azienda Provinciale Trasporti (APT - Gorizia) con qualcosa di semplice: i collegamenti aeroportuali.

Fonte il volantino dell’azienda dei Collegamenti Aeroporto Estate 2016, dove non viene definita nessuna licenza all’uso (o almeno non ne ho intravisto la definizione)-

Inserito alcune fermate e creo relazioni con JOSM; un utile strumento per verificare questa attività è overpass: questa query evidenzia la linea ref=1 della network=”Rete del Trasporto Pubblico Urbano di Gorizia”.

Poi comincio a raccogliere i dati per il file stops.txt con la seguente Overpass query

MI vengono restituite le seguenti linee:

20605,Grignano Miramare,45.7068082,13.7159159
20608,Piazza della Libertà,45.6571277,13.7722080
01629,capolinea APT,45.8207708,13.4838185
20106,Duino Centro,45.7733263,13.6044971

Standardizzo lo header con
compilando quindi il file stops.txt

Il tag OSM “ref:apt” (che diventa GTFS “stop_id”) sembra univoco per tutta APT; TODO: verificare le altre sue linee, per non avere duplicati.

Inserisco le date di inizio e fine validità in calendar.txt dai dati APT

Per i codici dei viaggi riporto quelli APT (anche questi sembrano univoci) compilando “trip_id” di trips.txt

Per i codici delle linee riporto quelli APT, compilando la colonna “route_short_name” di routes.txt

Transit a Udine

Posted by Cascafico on 6 June 2016 in Italian (Italiano)

Note per la creazione di un feed GTFS che mi servità per “alimentare” un’istanza di Open Trip Planner

Osservo la struttura dei file template da preparare; inizio dalle fermate (stops.txt):

  • stop_id,stop_name,stop_desc,stop_lat,stop_lon,stop_url,location_type,parent_station
  • S1,Mission St. & Silver Ave.,The stop is located at the southwest corner of the intersection.,37.728631,-122.431282,,,

Creo una query overpass per estrarre i dati delle fermate della linea 4 nel formato standard come quello sopra (poi dovrò anche rinominare i nomi dei campi della prima riga).


  • ref,name,@lat,@lon header che modifico in…
  • stop_id,stop_name,stop_lat,stop_lon
  • 391,Roma / Torino,46.0487494,13.1928968
  • 389,Roma / Novara,46.0474911,13.1972403
  • 391,Roma / Torino,46.0485943,13.1937346
  • 381,Via Lignano / Santa Caterina,46.0457494,13.1972616

Purtroppo ad Udine il riferimento (in OSM tag “ref”) delle fermate ai due lati della strada è unico ed il GTFS non accetta duplicati come il qui sopra “391”.

Soluzione 1: ricorro ad excel “rimuovi duplicati” oppure a linux “sort uniq” e rinuncio alle coordinate di una delle due fermate.

Soluzione 2; ricorro ad un foglio elettronico, ordino per fermata, inserisco una nuova fermata dove applico la formula =SE(B1=B2;CONCATENA(B2;”a”);B2)

in questo modo ottengo, per esempio:

111,111,Via Cividale / Albona,46.0690524,13.2474479 111a,111,Via Cividale / Albona,46.0690138,13.2470564

Poi compilo i file “required”, secondo le direttive

  • agency.txt una o più aziende erogatrici dei dati del servizio

  • stops.txt (vista sopra) fermate, ovvero singole posizioni dove i veicoli prendono e lasciano le persone

  • routes.txt percorsi di transito. un percorso è un gruppo di viaggi elencati ai passeggeri come singolo servizio

  • trips.txt viaggi per ogni percorso. un viaggio è una sequenza di due o più fermate (stops) che avvengono ad una data ora

  • stop_times.txt ora in cui un veicolo arriva e parte da una fermata per ogni viaggio; questa è la compilazione più onerosa, per la quale uso una mappa cliccabile a supporto

  • calendar.txt Date per gli ID del servizio, su orario settimanale. specifica quando un servizio inizia e finisce, come pure i giorni della settimana in cui è attivo

  • TODO come opzione si può creare un shapes.txt, utile a disegnare meglio i “trips”, altrimenti linee rette che collegano le fermate in sequenza; su produce un kml con umap e si elabora con kml2gfs . Non capisco perchè non possano essere disegnati come la parte pedonale, che usa i dati vettoriali OSM (forse son la versione non jar si può configurare)

Finito questo lavorone, si zippa tutto e si lancia nella stessa cartella…

java -Xmx512M -jar otp-0.14.0.jar –build C:\utils\otp –inMemory –securePort 8100

Io ho usato otp-0.14.0.jar, invece del “latest”, perchè quest’ultimo non era compatibile con in mio “vecchio” software Java (JVM)

Biblioteche in Friuli Venezia Giulia

Posted by Cascafico on 26 January 2016 in Italian (Italiano)

Visto che l’Istituto Centrale per il Catalogo Unico delle Biblioteche Italiane ha da tempo liberato i dati anagrafici delle biblioteche, o pensato di importarli in Openstreetmap.

Le etichette utili sono:

  • codice-isil
  • denominazione
  • indirizzo
  • cap
  • comune
  • latitude
  • longitude
  • telefono
  • fax
  • email
  • url

Come spesso accade, la qualità del dataset non è di un livello compatibile con Openstreetmap, in quanto le coordinate geografiche sono imprecise (da pochi a centinaia di metri). Ho creato una umap perchè intendo importare tramite un processo manuale assistito.

La umap ha due strati con i quali si interagisce tramite dei pop-up.

Farmacie in Friuli Venezia Giulia

Posted by Cascafico on 19 November 2015 in Italian (Italiano)

Il Ministero della Salute ha aperto i dati delle farmacie italiane


  • indirizzi non standardizzati (C. Battisti, Battisti Cesare, P.zza Liberta’, Papa Giovanni XXIII, ecc)

  • coordinate raramente corrette, frutto di geocoding non precisato

Soluzioni attuate (per il Friuli Venezia Giulia):

  • (eliminazione virgola dal campo INDIRIZZO)

  • filtro del csv originale per DESCRIZIONEREGIONE e DATAFINEVALIDITA

  • eliminazione duplicati per CODICEIDENTIFICATIVOFARMACIA

  • standardizzazione con direttive ISTAT (Cesare Battisti, Piazzale Libertà, papa Giovanni Ventitreesimo, ecc)

  • prerequisito per il geocoding preciso: [numeri civici regionali importati] (
  • geocoding con csvgeocode (grazie Napo), risultato in tabella

Quality Assurance:

  • creazione della umap farmacie FVG con layer “geocoded”, alimentato dalla relativa tabella e “preesistenti”, alimentato query overpass amenity=pharmacy nei confini regionali

  • creazione popup per facilitare il copincolla sugli editor OSM (ie: JOSM)

Inserimento in OSM

  • csv > Qgis > shp

  • JOSM plugin “open data” per leggere shp

  • adattare i tag (ie: PARTITAIVA > ref:vatin)

  • conflation in JOSM

in alternativa, se le farmacie mancanti non sono molte:

  • umap individuare le palette blu (geocoded) senza il pallino verde (preeesistenti in OSM) ed aprire l’area inquardrata in iD oppure JOSM (espandere menu a sinistra)


  • per risultato univoco del geocoding, inserire nella ricerca anche il CAP (o più lento, DESCRIZIONEPROVINCIA); verificare nominatim