OpenStreetMap

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 ItalyNames.sh 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:
001001
001002
001003
...
111105
111106
111107

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
109

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
100002
100004
100003
100006
100001
100007
100005

Script di query overpass-turbo

Lo script ItalyHighwayNames.sh 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:~ ./ItalyHighwayNames.sh 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 ItalyHighwayNames.sh con un solo codice provincia, per esempio:
pi@raspberrypi:~ ./ItalyHighwayNames.sh 041
Possiamo poi con una sola linea eseguire il tutto su scala nazionale:
pi@raspberrypi:~ while read province_codes; do ./ItalyHighwayNames.sh $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.

TODO

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

Comment from bubix on 2 August 2018 at 12:46

grazie al bot @italynames_bot ho realizzato la mappa degli odonimi dedicati a Vittorio Emanuele III https://umap.openstreetmap.fr/it/map/vittorio-emanuele-iii-bot_237778 E' sempre un piacere utilizzare la tecnologia powered by Cascafico!

Login to leave a comment