OpenStreetMap

Realizzazione di una mappa delle utility utilizzando il servizio gratuito umap che riporta, suddivise per categoria, le attività (utility) presenti nell’area geografica del Comune di Limone P.te:

  • i dati derivano dal database di openstreetmap e sono aggiornati giornalmente con l’utilizzo di google sheet (2 sheet per ogni categoria):

  • il primo sheet importa i dati con query csv di overpass turbo modificata grazie a questo turorial; di seguito esempio query

http://overpass-api.de/api/interpreter?data=out:csv(::id,::lat,::lon,::timestamp,::type,""name"",""amenity"",""phone"",""contact:phone"",""contact:mobile"",""mobile:phone"", ""website"",""facebook"",""contact:website"",""contact:facebook"",""email"",""contact:email"";true;"","")] [timeout:20];area[admin_level=8][boundary=administrative][""ref:ISTAT""=""004110""]->.boundaryarea; ( node(area.boundaryarea)[amenity=cafe]; way(area.boundaryarea)[amenity=cafe]; node(area.boundaryarea)[amenity=bar]; way(area.boundaryarea)[amenity=bar]; ); out meta center;")

  • il secondo sheet è una copia completa del primo senza formula ed è inserito come url csv nella mappa delle utility di umap come layer remoto

  • con apps script, sempre in google sheet, una funzione aggiorna giornalmente la query overpass turbo del foglio 1 (cancella e ricopia la query) ed una funzione sostituisce i dati aggiornati nel foglio 2; è possibile creare le due funzioni in modo semplice registrando le operazioni manuali andando su estensioni>macro>registra macro

function scrip_healt() { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('A1').activate(); spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true}); spreadsheet.getCurrentCell().setFormula('=IMPORTDATA("query overpass impostata come sopra")'); spreadsheet.getRange('A2').activate(); };

function scrip_healt_umap() { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('B:S').activate(); spreadsheet.setActiveSheet(spreadsheet.getSheetByName('umap_healt'), true); spreadsheet.getRange('A:A').activate(); };

  • per l’aggiornamento dei dati due attivatori di funzioni di apps script eseguono le funzioni ad orari prestabiliti (il primo attivatore esegue la funzione di aggiornamento query ed il secondo, a distanza di un’ora, esegue la funzione di sostituire i dati nel foglio collegato ad umap) immagine

Controllo dei dati di OpenStreetMap appartenenti alle categorie della mappa di cui sopra con Qgis e google sheet.

Google Sheet:
  • tutte le categorie dei dati inseriti nella mappa delle utility vengono importate con una sola query complessiva in un solo foglio di google sheet, con la funzione di importdata riportata sopra

  • è stato creato uno script per aggiornare e esportare i dati in formato .tsv da google sheet ad una cartella presente su google drive, la quale è sincronizzata con cartella su computer desktop fisico

  • lo script si compone di 3 funzioni: la prima aggiorna la query di overspass turbo (cancella e ricopia la query), vedi sopra, la seconda “qgis_export_delete” cancella il file presente nella cartella di google drive e la terza “qgis_export”, esporta il csv aggiornato in formato .tvs
    N.B.: la prima volta che si eseguono le funzioni è necessario che sia già presente un file qgis_export.tsv nella cartella di drive

function qgis_export_delete() { var folder = DriveApp.getFolderById("1Ll-ltTjRKTDh5RsmSctwaFVq-c_j0F3n") var files =folder.getFiles() while(files.hasNext()){ files.next().setTrashed(true) } }

function qgis_export() { var filename = "qgis_export.tsv"; // TSV file name var folder = "1Ll-ltTjRKTDh5RsmSctwaFVq-c_j0F3n"; // Folder ID var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.setActiveSheet(spreadsheet.getSheetByName('dati_qgis'), true); var csv = ""; var v = SpreadsheetApp .getActiveSpreadsheet() .getActiveSheet() .getDataRange() .getValues(); v.forEach(function(e) { csv += e.join(",") + "\n"; }); var url = DriveApp.getFolderById(folder) .createFile(filename, csv, MimeType.CSV) .getDownloadUrl() .replace("?e=download&gd=true",""); return url; }

  • per l’aggiornamento dei dati tre attivatori di funzioni di apps script eseguono le funzioni ad orari prestabiliti (vedi sopra)
Qgis:
  • è stato creato un progetto qgis dove si trovano i dati aggiornati giornalemente “export-daily” (file qgis_export.tsv rinominato) e quelli salvati in locale nel giorno del controllo “poi_export_datacontrollo”; eseguendo filtro temporale sui dati “export-daily” è possibile visualizzare solo quelli modificati dal giorno della data del precedente controllo; (dopo il controllo è sufficiente salvare una copia dei dati live “export-daily” sul proprio computer rinoninando con la data del controllo) immagine

  • per il controllo delle modifiche avvenute sui dati, sia grafico che di contenuto, sono stati applicate espressioni, stili, filtri ed etichette (posizionando il cursore sui punti si apre subito un popup informativo…) immagine

  • per un controllo dei dati sono state inserite anche le note con url dinamico utilizzando le api di openstreetmap

  • si riportano di seguito i file .qml per gli stili utilizzati in qgis
    stile per le note
    stile per “poi_export_datacontrollo”
    stile per “export-dayli”

Aggiornamento dei dati

Grazie alla collaborazione con Olivier Bottero dell’ufficio turistico del comune di Limone Piemonte, si è deciso di promuovere la mappattura in openstreetmap per l’aggiornamento dei dati, utilizzata ad oggi proprio dall’ufficio turistico, con successivo controllo da parte del sottoscritto tecnico Geom. Roberto Brazzelli incaricato dal Comune per aggiornamento della mappa.

Nelle informazioni della mappa delle utility si danno prime informazioni a cittadini o esercenti attività per segnalare errori o nuove attività

..credo che la cosa più difficile sia stata studiare e testare una soluzione semplice pensando che possa essere riutilizzata facilmente da altri uffici turistici, atl o consorzi turistici…

Comment from Pieter Vander Vennet on 29 January 2023 at 16:24

Hi there,

I want to grow MapComplete (https://mapcomplete.osm.be) into a direction that would solve these usecases. Any interest in testing this?


Login to leave a comment