OpenStreetMap

Cascafico's diary

Recent diary entries

OSM Analytic Tracker (OSMAT)

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

Tracking vandalisms is often not an easy task. I hardly find useful digging in the history of OSM changesets. 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.

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 Docker installation

OSMAT download

Then download OSMAT sources:
$ git clone https://github.com/MichaelVL/osm-analytic-tracker.git

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 https://download.geofabrik.de/europe/italy/nord-est.poly) 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"). Here you can adjust map zoom level and time horizon, just search for "map_scale": "6" and "horizon_hours": "48".

Compile container

Once you're done with region & zoom configuration, compile container:
$ sudo docker build -t osm-analytic-tracker .

Run

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
    http://bpi.uk.to/osm/regions/myAOI.poly
    https://download.geofabrik.de/asia/myanmar.poly
    https://download.geofabrik.de/asia/japan.poly
    https://download.geofabrik.de/asia/vietnam.poly
    [snip]
  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: Borgo Brossana, Madonna delle Grazie, Cividale del Friuli, UD, 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 www-data@pippo.zapto.org:/var/www/osm/cai/files <<< $'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)

Intro

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.

Metodo

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

Strumenti

  • 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.

Dati

La tabella toponimi_orografici.csv potrebbe per esempio contenere:

lat,lon,toponimo,comune
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:

xlat,xlon,toponimo,comune
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 "http://nominatim.openstreetmap.org/search?q={{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

Risultati

Otteniamo la tabella out.csv:

xlat,xlon,toponimo,comune,lat,lng
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".

TODO

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

eccetera.

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...

trip_id,arrival_time,departure_time,stop_id,stop_sequence
61,,,07213,1
61,,,CIP05,2
61,,,07035,3
61,,,07032,4
...
61,,,07038,16
61,,,07039,17
61,,,07040,18
61,,,07002,19

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.

gtfs-editor

  • 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 / Štandrež, Gorizia, GO, Friuli Venezia Giulia, 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:

ref:apt,name,@lat,@lon
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
12029,Monfalcone,45.8086023,13.5326253
20110,Sistiana,45.7713633,13.6373722

Standardizzo lo header con
stop_id,stop_name,stop_lat,stop_lon
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).

Ottengo:

  • 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

Problemi:

  • 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)

TODO

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

[Civici FVG] no_match 30026 (Cividale del Friuli)

Posted by Cascafico on 31 July 2014 in Italian (Italiano)

Aggiornata la lista "no_match" delle incongruenze tra dati regionali e dati OSM del comune di Cividale del Friuli. Nei file 30026_no_match ESRI aggiunto un campo "note"; nella descrizione del download vengono elencate le incongruenze. Dove necessario è stata creata una OSM note per verifica sul territorio.

Serverino TMS FVG

Posted by Cascafico on 27 April 2012 in Italian (Italiano)

Ciao forum! Lascio per qualche settimana un server TMS per alcune zone del Friuli. E' un android di fascia bassa: lasciate qualche commento sulle prestazioni.

Di default sovrappone il mio rendering ed addende varie (tra cui Corine landcover) ai dati OSM con rendering Mapnik; la numerazione delle tile è Openlayers, per cui non va bene per chi usa JOSM. Prossimamente, se le prestazioni sono decenti, produrrò anche la numerazione per JOSM e copertura San Daniele, Cordoipo, Palmanova, Risorgive.

Udine - Cividale

Location: Borgo Poscolle, Paderno, Udine, UD, Friuli Venezia Giulia, Italia

Grattacapo da Qgis

Posted by Cascafico on 3 March 2011 in Italian (Italiano)

Sto trafficando non poco per importare la montagna di shp che ho in ufficio. Sembra che Qgis proprio non ne voglia sapere di far importare al layer osm un qualsiasi layer shp.

Start!

Posted by Cascafico on 10 February 2011 in Italian (Italiano)

Oggi ho iniziato a mappare! Dopo infruttuosi tentativi via Portlatch a causa di una connessione non molto veloce, ho scoperto JOSM e debbo dire che l'applicativo è molto ben studiato per la collaborazione. Avevo una certa esperienza in altro applicatvo GIS sviluppato in Java, OpenJump e JOSM è altettanto efficiente.

Location: Borgo di Ponte, Madonna delle Grazie, Cividale del Friuli, UD, Friuli Venezia Giulia, 33043, Italia