Archivio

Archive for the ‘Open Source’ Category

OpenDistributoriCarburantiBot: risparmiare sul pieno di carburante con Telegram

28 febbraio 2016 6 commenti

In questi ultimi tempi, su più fronti si sente parlare molto spesso di Telegram, non solo e non tanto come app di messaggistica (per certi versi in alternativa o in opposizione / concorrenza a WhatsApp), quanto per la possibilità offerta di poter realizzare delle chat automatiche (denominati “bot”), il cui scopo è quello di rispondere alle nostre domande, alle nostre richieste, e facilitare in generale operazioni varie.

Si và da esempi molto semplici, piccoli giochi, sino a cose più serie ed articolate. Riporto ad esempio:

  • @webcamstravelbot che fornisce l’elenco delle webcam intorno ad un punto di interesse
  • @escilaricettaBot che permette di ricercare ricette dato un certo ingrediente di interesse
  • @emergenzeprato_bot per le segnalazioni meteo a di rischio dell’area del comune di Prato
  • @divinacommediabot che permette di ricercare versi della Divina Commedia di Dante
  • @gttorari_bot con cui la compagnia dei trasporti pubblici di Torino informa i propri utenti dei passaggi degli autobus

…. sino ad arrivare, notizia proprio degli ultimi giorni, al canale @pgpompei attraverso il quale Papa Francesco fà arrivare giornalmente il Vangelo del giorno!!! Quindi davvero dal “sacro” al “profano” …..

Non mi dilungo qui a spiegare più nel dettaglio: su internet si trovano abbondanti informazioni sia sulla piattaforma sia su cosa sono questi bot, per cui rimando a queste fonti tutti coloro che fossero interessati ad approfondire.

Più che lo strumento di messagistica in sè, con le sue dichiarate caratteristiche peculiari di maggior sicurezza e rispetto della privacy (nel bene e nel male ….), rispetto ai suoi concorrenti, mi ha incuriosito la possibilità di realizzare queste chat automatiche e quindi, volendone approfondire l’argomento, ho deciso a provare a realizzarne una.

Mi mancava un caso d’uso che non fosse un classico “Hello World!” e che, ovviamente, avesse anche una sua componente “spaziale”.

Dopo qualche riflessione ed ipotesi mi sono ricordato di un bel lavoro fatto tempo fà da Stefano Sabatini (@__sabas) sui distributori di carburanti in Italia che mi sembrava fosse adatto allo scopo: dati “reali”, dati open, liberamente utilizzabili (licenza iodl 2.0), aggiornati giornalmente, con coordinate e quindi facilmente trasformabili in un dato spaziale per poi essere utilizzabili anche con funzionalità spaziali.

E’ così che è nata l’ipotesi, pian piano concretizzatasi, di OpenDistributoriCarburantiBot.

Questo bot permette di sapere, dato un comune italiano, quali sono i distributori di carburante che vi ricadono o, data una posizione georiferita, quali sono i distributori di carburante che ricadono nel suo intorno per una certa distanza (scelta tra 500, 1000, 2000 e 3000 metri).

I dati sono aggiornati giornalmente a partire dalle 08.30 attingendo direttamente dagli open del Ministero dello Sviluppo Economico (MISE).

E’ possibile selezionare il carburante di proprio interesse ed i risultati sono ordinati sulla base del prezzo: è quindi possibile individuare quelli più convenienti per le nostre esigenze.

A seconda del tipo di ricerca effettuata, e se si è fornita o meno la posizione georiferita, è possibile:

  • visualizzare su mappa OpenStreetMap la localizzazione del distributore
  • visualizzare la descrizione del percorso per raggiungere il distributore dalla posizione corrente
  • visualizzare, su mappa 2D, il percorso per raggiungere il distributore dalla posizione corrente
  • visualizzare, su mappa 3D, il percorso per raggiungere il distributore dalla posizione corrente. Per questa ultima funzionalità è necessario disporre di un web browser di ultima generazione che supporti webGL (le ultime versioni di Mozilla Firefox e Chrome sono già abilitate)

Il suo utilizzo è molto semplice: nel seguito vi illustro una sequenza di passi per il suo utilizzo e anche una breve sessione utente registrata in video.

Occorre ovviamente avere installato Telegram sul proprio smartphone, tablet o desktop (nota: la versione desktop è un pò limitata per le funzonalità supportate, ad esempio non è possibile fornire la propria posizione, o almeno io non ci sono riuscito): fatto questo è sufficiente ricercare “OpenDistributoriCarburantiBot” come illustrato

01

All’avvio viene visualizzato un messaggio di benvenuto con una una breve sintesi sulle sue caratteristiche.

02

Occorre avviare il bot se si intende utilizzarlo

04

In qualunque momento questo messaggio è nuovamente visualizzabile scrivendo il comando /start.

Sono disponibili anche altri due comandi, rispettivamente /info (per avere informazioni di dettagli tecnico)…

05

…. e /credits (per i doverosi e necessari ringraziamenti) ….

06

E possibile scrivere il nome di un comune italiano: il nome può essere scritto minuscolo o maiuscolo in modo indifferente. Sono trattati anche nomi di comuni con spazi ed apostrofi.

07

Per i comuni il cui nome contiene lettere accentate è necessario utilizzare gli apici

08

A questo punto occorre selezionare, dal menù visualizzato, il tipo di carburante e attendere il risultato della ricerca

09

Se la ricerca produce risultati questi sono ordinati per prezzo crescente e, per ogni risultato, è possibile visualizzare su una mappa OpenStreetMap la localizzazione del relativo distributore

10

11

L’indicazione del comune non è l’unica modalità di ricerca: è infatti possibile indicare le propria posizione corrente o di interesse cliccando sull’icona della graffetta che in queste videate compare in basso a destra e poi selezionare l’opzione ‘Posizione

12

13

A questo punto è necessario selezionare, dal menù visualizzato, il raggio di ricerca

14

A questo punto occorre selezionare, dal menù visualizzato, il tipo di carburante

15

In questo caso, se la ricerca produce risultati questi sono ordinati per prezzo crescente e, per ogni risultato, è possibile:

  • visualizzare su una mappa OpenStreetMap la localizzazione del relativo distributore
  • visualizzare la descrizione del percorso per raggiungere il distributore di interesse a partire dal punto di ricerca
  • visualizzare il percorso per raggiungere il distributore di interesse a partire dal punto di ricerca su una mappa OpenStreetMap bidimensionale
  • visualizzare il percorso per raggiungere il distributore di interesse a partire dal punto di ricerca su una mappa OpenStreetMap tridimensionale (OSM Buildings)

16

17

18

19

20

Ed ecco ora in video come avviene dal vivo una sessione utente immaginandone la fruizione durante una gita nel territorio Albese:

Come detto in precedenza i dati sono giornalmente tratti direttamente dal Ministero dello Sviluppo Economico (MISE) a cui è demandato il livello di completezza e aggiornamento rispetto alle diverse realtà locali: devo dire che ho notato, almeno nelle zone che conosco, che, da quando ho iniziato a fare questo piccolo esperimento, aggiornamento e completezza sono in crescita.

Per concludere devo ringraziare tutti coloro da cui ho tratto spunti ed ispirazione, nonchè supporto diretto in varie forme, e quindi, sperando di non dimenticare nessuno direi:

  • Stefano Sabatini (@__sabas), per il suo lavoro iniziale da cui ho tratto spunto per l’idea
  • Matteo Tempestini (@il_tempe), Francesco “Piersoft” Paolicelli (@Piersoft) e Gabriele Grillo da cui ho tratto il codice inziale e per il loro supporto via mail
  • Alessandro Furieri, per il suo grandissimo lavoro su Spatialite, data base open source che ho usato come tool per memorizzare i dati georiferiti, e per il suo paziente supporto online
    Fabrizio Massara per la pazienza ed il suo supporto a 360° nonchè, per la condivisione del server su cui stà girando il codice del bot in produzione
  • mia moglie, per il tempo che le ho rubato per fare tutto ciò

Un ringraziamento particolare, perchè si è dimostrato un vero “signore” (merce rara …), lo devo a @Piersoft per la sua disponibilità a rinunciare a pubblicare un lavoro analogo in buona parte realizzato, pur di non “bruciarmi” la news ….. grazie mille!!!!

Per chi fosse interessato a maggiori dettagli tecnici per sapere “come è fatto dentro” rimando ad un altro post

A questo punto non resta quindi che iniziare a provare ad usare di OpenDistributoriCarburantiBot e vedere di iniziare a risparmiare facendo il pieno nei distributori più convenienti!

Test automation su web gis application “OpenLayers based” usando Selenium Web Driver


Per ragioni lavorative mi sono occupato di valutare l’utilizzo della suite Selenium HQ per il test automation di web application.

Tale suite risulta essere uno dei principali prodotti open source di test automation per web application: sostanzialmente è caratterizzato da due tool, Selenium IDE e Selenium Web Driver (ve ne sono poi altri due, Selenium Grid e Selenium Remote Control che non ho analizzato).

Selenium IDE è un plugin per Firefox (non esiste omologo per altri browser), che permette di catturare una sessione utente di una web application (comprese le azioni di imputazione di dati ….), produrre automaticamente uno script che può poi essere rieseguito come tale o modificato.

Il tool è adatto per test semplici (sostanzialmente adatto per l’entry level …), non richiede alcuna conoscenza tecnica pregressa (sebbene un profilo tecnico, tipo programmatore, probabilmente riesce ad ottenere il meglio dallo strumento ….), ed è molto facile da utilizzare: ha tuttavia dei limiti che, anche con le personalizzazioni degli script ottenuti automaticamente, difficilmente possono essere superati.

La maggior parte della comunità che utilizza la suite Selenium utilizza per i propri scopi Selenium Web Driver.

Selenium Web Driver permette di creare delle vere e proprie suite di test programmando i test cases nei principali linguaggi di programmazione (Java, Ruby, Python, ecc …): nel mio caso ho utilizzato Java ma questa non è la scelta esclusiva anche se è quella per cui forse si trovano maggiori esempi, documentazione e supporto.

Sostanzialmente Web Driver “emula” una sessione browser ma lo fà server-side.

La sua installazione (è necessario usare Eclipse …), è molto semplice e ben documentata (nel senso adatta anche a chi non ha grosse conoscenza tecniche, si tratta di un tutorial veramente descritto “passo – passo” ….), sul sito di Selenium o in vari altri blog.

A differenza di Selenium IDE è quindi rivolto ad una utenza decisamente più tecnica, diciamo figure professionali con profili da programmatore (e la cosa si evidenzia andando a vedere il supporto che si ottiene on-line sui vari StackExchange, StackOverflow, ecc …, nel senso che chi risponde sono tutte figure di questo genere, lo si intende dal livello di risposte fornite).

Fatta questa esperienza professionale ho deciso di provare a vedere come il tool si comportava con web gis application che sono tipicamente caratterizzate da un abbondante uso di librerie javascript, anche “verticali” quali OpenLayers o Leaflet, e un livello di interattività (intendo quello sulla mappa ….), decisamente superiore ad una tipica web application gestionale.

Ho quindi provato a vedere cosa succedeva ad utilizzare Web Driver inizialmente con alcuni degli esempi consultabili sul sito di OpenLayers 2.13, ed infine con una web gis application “vera” Java based ed utilizzante OpenLayers ed ExtJS (non ho provato per ragioni di tempo con Leaflet ma credo che, rispetto alle conclusioni che se ne possono trarre, la cosa sia piuttosto invariante).

I .jar che vi potete scaricare dovrebbero essere eseguibili direttamente dando il seguente comando:

java -jar <nome_esempio>.jar

e richiedono come minimo la jdk 1.6.

Vi condivido comunque il codice sorgente in modo che, chi interessato, una volta installato e configurato Eclipse con le diverse librerie che servono per Web Driver (per l’installazione e configurazione vi rimando alla documentazione ufficiale …).

In merito al codice sorgente solo una nota: il codice è puramente a scopo didattico e pensato per poter essere compilato ed eseguito nel maggior numero di situazioni, non và preso come codice di “produzione”, per cui i “puristi” o i programmatori veri (cosa che io oramai non sono più ….), non me ne vogliano per le diverse System.out che troveranno nel codice, sò da me che avrei dovuto usare, come deve essere fatto correttamente, Log4J e compilare di conseguenza, ma lascio il tutto a coloro che vorranno poi scrivere dei test cases veri.

Altra cosa è che i test case NON analizzano come trattare eventuali situazioni di errore: il loro focus è provare se si riesce a simulare una sessione utente che comprenda le principali interazioni con la mappa. Trattandosi di test case realizzati in modalità “programmatica” la gestione dell’errore viene lasciata alla modalità organizzativa ritenuta più efficace dall’organizzazione: raccogliere i dati su un database, scatenare eventi, inviare messaggi, tracciare su file di log, ecc … Ovviamente tutto questo era, al momento, out-of-scope di queste prove.

Vediamo allora il primo test case sull’esempio base di OpenLayers effettuando uno zoom in interattivo sulla mappa

Il codice sorgente che implementa questo test è il seguente:

package myTests;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;
import org.openqa.selenium.interactions.Actions;

public class interactiveZoomInOpenLayerstest_01 {

private static WebDriver driver = null;

public static void main(String[] args) throws InterruptedException {

//Create a new profile and load my Firefox default profile
System.out.println("Creo un nuovo profilo e vi carico il profilo di default di Firefox ...");
Thread.sleep(3000L);
ProfilesIni profile = new ProfilesIni();
FirefoxProfile ffProfile = profile.getProfile("default");

// Create a new instance of the Firefox driver using my new Firefox profile
System.out.println("Creo una nuova sessione del browser Firefox ...");
Thread.sleep(3000L);
driver = new FirefoxDriver(ffProfile);

//Put a Implicit wait, this means that any search for elements on the page could take the time the implicit wait is set for before throwing exception
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

// It is always advisable to Maximize the window before performing DragNDrop action
System.out.println("Massimizzo la finestra del browser ...");
Thread.sleep(3000L);
driver.manage().window().maximize();

//Launch the OpenLayers 2.x sample
System.out.println("Mi collego all'esempio di OpenLayers 2.x ...");
Thread.sleep(3000L);
driver.get("http://dev.openlayers.org/releases/OpenLayers-2.13.1/examples/example.html");

// Find the viewport inside in witch there is the map
System.out.println("Individuo il viewport al cui interno c'è la mappa ...");
Thread.sleep(3000L);
WebElement el = driver.findElement(By.id("OpenLayers_Map_2_OpenLayers_ViewPort"));

// Create a new Action instance
System.out.println("Creo un oggetto di tipo \"Action\" ...");
Actions act = new Actions(driver);

// Moves to 2nd location
System.out.println("Moves to 1st location: 200, 50 ...");
Thread.sleep(3000L);

// Draw rectangle and execute zoom in
System.out.println("Moves to 1st location: 300, 150 ...");
act.moveToElement(el,200,50).click().keyDown(Keys.SHIFT).clickAndHold().moveToElement(el, 300, 150).click().release().keyUp(Keys.SHIFT).build().perform();

// Print TEST = OK!!
System.out.println("TEST = OK !!");
//driver.quit();

}

}

Il codice sorgente è liberamente scaricabile.

E’ possibile anche scaricare lo zip dell’eseguibile Java: una volta decompresso posizionarsi in

InterActiveZoomInTest\InterActiveZoomIn\jar

e poi riprodurlo in locale con il seguente comando

java -jar InterActiveZoomIn.jar

Vediamo ora il  secondo test case sull’esempio del calcolo della misura di un’area disegnata interattivamente di OpenLayers

Per brevità non si riporta il codice sorgente che comunque liberamente scaricabile.

E’ possibile anche scaricare lo zip dell’eseguibile Java: una volta decompresso posizionarsi in

MeasureAreaOpenTest\MeasureAreaOpenLayers\jar

e poi riprodurlo in locale con il seguente comando

java -jar MeasureAreaOpenLayers.jar

Vediamo ora il  terzo test case sull’esempio di OpenLayers dell’interrogazione interattiva di un marker presente sulla mappa

Per brevità non si riporta il codice sorgente che comunque liberamente scaricabile.

E’ possibile anche scaricare lo zip dell’eseguibile Java: una volta decompresso posizionarsi in

IdentifyOpenLayersTest\IdentifyOpenLayers\jar

e poi riprodurlo in locale con il seguente comando

java -jar IdentifyOpenLayers.jar

Vediamo ora il quarto test case sull’esempio di OpenLayers dell’interrogazione interattiva di geometrie di un servizio WMS presente sulla mappa

Per brevità non si riporta il codice sorgente che comunque liberamente scaricabile.

E’ possibile anche scaricare lo zip dell’eseguibile Java: una volta decompresso posizionarsi in

GetFeatureInfoWMSTest\GetFeatureInfoWMSTest\jar

e poi riprodurlo in locale con il seguente comando

java -jar GetFeatureInfoWMSTest.jar

Vediamo ora il  quinto test case sull’esempio di OpenLayers dell’editing interattivo su mappa 

Per brevità non si riporta il codice sorgente che comunque liberamente scaricabile.

E’ possibile anche scaricare lo zip dell’eseguibile Java: una volta decompresso posizionarsi in

EditingOpenLayersTest\EditingOpenLayers\jar

e poi riprodurlo in locale con il seguente comando

java -jar EditingOpenLayers.jar

Ma il tutto è applicabile anche a progetti reali? La risposta è sì: ho provato a costruire una navigazione interattiva su un progetto di web mapping reale di Regione Piemonte ad accesso libero realizzato con MapStore (prodotto open source realizzato partendo da GeoExplorer e quindi basato su ExtJS e OpenLayers).

Per brevità non si riporta il codice sorgente che comunque liberamente scaricabile.

E’ possibile anche scaricare lo zip dell’eseguibile Java: una volta decompresso posizionarsi in

AeraTest\AeraProject\jar

e poi riprodurlo in locale con il seguente comando

java -jar AeraProject.jar

Occorre precisare che la realizzazione di test suite richiede l’impegno di risorse con un profilo tecnico (programmatori) medio-alto, e non è banale per cui anche i tempi di realizzazione non sono bassi: non è quindi ammortizzabile, in termini di costi, per progetti “piccoli”, mentre per progetti medio – grandi, in particolare se critici o sensibili per aspetti diversi, sicuramente, una volta redatti ed automatizzati i test, si ha la possibilità di eseguirli automaticamente in tempi molto rapidi e tutte le volte he lo si ritiene necessario.

Essendo in questo caso le suite di test “codice”, le si possono (anzi le si devono ….), trattare come tali e quindi possono (devono), essere mantenuti su repository da cui, con tools di software automation, agganciare a processi di building automatici che permettano di eseguire i test automaticamente ad ogni rilascio significativo del codice di business dell’applicazione.

Non occorre però scordare due aspetti fondamentale che esulano dall’automazione: il codice delle suite di test deve essere manutenuto allo stesso modo del codice di business applicativo e, altro aspetto fondamentale, anche la base dati su cui si eseguono i test deve essere mantenuta (o replicata), coerente.

Concludendo quindi si può dire che per l’automazione di test di web mapping application si possono usare senza problemi i medesimi tools che si utilizzano per le web application gestionale e che quindi, in questo caso …. “spatial is not special” !!!

OpenStreetMap, GeoPortale Nazionale e OpenRefine: tutorial per come farsi del geocoding in casa partendo da un elenco di indirizzi


Partendo dal mio ultimo post “Come convertire indirizzi in coordinate geografiche (geocoding) usando i servizi WFS del GeoPortale Nazionale e Open Refine“, che ha tratto ispirazione da quest’altro post “Using OpenRefine to geocode your data with Google and OpenStreetMap API”, ho provato a mettere insieme le cose per cercare di ottenere una sorta di “guida” su come, partendo da un foglio elettronico in  cui vi siano dei dati da georiferire per indirizzo, ottenerne la georeferenziazione, con la migliore precisione possibile e al più approssimata  al Comune.

Ecco quali sono i criteri che ho provato a seguire:

  1. se il dato è possibile georiferirlo usando i dati di OpenStreetMap e quindi le  MapQuest Nominatim API, questa viene considerata la prima e migliore delle opzioni: occorre tuttavia appurare che la georeferenziazione avvenga per “osm_type=node”, e quindi per punto. Sostanzialmente se quello specifico numero civico esiste tra i dati di OpenStreetMap, questo viene considerato il dato migliore
  2. se il dato non è georiferibile usando i dati di OpenStreetMap e quindi le  MapQuest Nominatim API per “nodo”, si verifica se lo sia usando i servizi WFS del GeoPortale Nazionale: se lo è viene questa viene considerata come seconda opzione
  3. se il dato non è georiferibile usando i dati di OpenStreetMap e quindi le  MapQuest Nominatim API per “nodo”, e nemmeno usando i servizi WFS del GeoPortale Nazionale, si verifica se lo sia usando i dati di OpenStreetMap e quindi le API di Nominatim per “osm_type=way”, e quindi per interpolazione sulla strada: se lo è viene questa viene considerata come terza opzione
  4. se il bene non è georiferibile nè usando i dati di OpenStreetMap e quindi le  MapQuest Nominatim API per “nodo”, nè usando i servizi WFS del GeoPortale Nazionale, e nemmeno usando i dati di OpenStreetMap e quindi le  MapQuest Nominatim API per “osm_type=way”, si verifica se lo sia usando e API di Nominatim georeferendo per Comune: se lo è (e lo dovrebbe essere sempre …..), viene questa viene considerata come quarta opzione ovviamente con un grado di approssimazione molto elevato e grossolano.

In questo modo, classificando la tipologia di metodo di georeferenziazione, possiamo differenziare per  la “qualità” della precisione con cui quel dato è stato georiferito per indirizzo.

Come detto in precedenza si ipotizza di partire da un foglio elettronico che contenga i dati da georiferire. La sua struttura dati può essere libera: nel seguito si indicheranno quali sono i nuovi campi da creare che, al termine delle operazioni potranno essere eliminati, lasciando i soli campi contenenti le coordinate degli indirizzi e la tipologia di modalità di geocodifica.

  1. aprire il foglio elettronico in Google Refine / Open Refine e generare un progetto
  2. creare una colonna con nome “Comune-work-1” contenente il nome del comune
  3. creare una colonna con nome “Comune-work-2” partendo dalla colonna “Comune-work-1” applicando la formula replace(value,' ','%20')
  4. modificare il contenuto della colonna “Comune-work-2” applicando la formula replace(value,'\'','%27'). NOTA: se nel nome del comune compaiono altro caratteri particolari, replicare sostituendo le rispettive sequenze di escape.
  5. creare una colonna con nome “Ubicazione-work-1” contenente la ubicazione (es. Via Roma), SENZA civico
  6. creare una colonna “Ubicazione-work-2” partendo dalla colonna “Ubicazione-work-1” eliminando gli spazi sostituendoli con il carattere di escape %20, eliminando gli apostrofi sotituendoli con il carattere di escape %27, ecc … Occorre lavorare un pò direttamente in Refine: se non ci sono info o se ci sono info non corrette mettere come valore “xxx”
  7. creare una colonna con nome “Civico-work-1” contenente il SOLO numero civico. Occorre lavorare un pò in Excel o Refine: se non ci sono info o se ci sono info non corrette mettere “xxx”
  8. creare una colonna “ResponsePCN” il cui contenuto è il risultato delle query WFS al PCN, fatte ogni 1500 millisecondi (o superiore …) ottenute da 'http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Numeri_Civici_2012.map&VERSION=1.1.0&service=wfs&request=GetFeature&TYPENAME=IN.NUMERICIVICI.2012&Filter=%3Cogc:Filter%20xmlns:ogc=%22http://www.opengis.net/ogc%22%3E%3CAND%3E%3Cogc:PropertyIsEqualTo%20matchCase=%22false%22%3E%3Cogc:PropertyName%3Ecomune%3C/ogc:PropertyName%3E%3Cogc:Literal%3E' + cells["Comune-work-2"].value + '%3C/ogc:Literal%3E%3C/ogc:PropertyIsEqualTo%3E%3Cogc:PropertyIsEqualTo%20matchCase=%22false%22%3E%3Cogc:PropertyName%3Enome%3C/ogc:PropertyName%3E%3Cogc:Literal%3E' + cells["Ubicazione-work-2"].value + '%3C/ogc:Literal%3E%3C/ogc:PropertyIsEqualTo%3E%3Cogc:PropertyIsLike%20matchCase=%22false%22%20wildCard=%22*%22%20singleChar=%22.%22%20escapeChar=%22!%22%3E%3Cogc:PropertyName%3Ecivico%3C/ogc:PropertyName%3E%3Cogc:Literal%3E*' + cells["Civico-work-1"].value + '*%3C/ogc:Literal%3E%3C/ogc:PropertyIsLike%3E%3C/AND%3E%3C/ogc:Filter%3E'
  9. creare una colonna “Lat-PCN” partendo dalla colonna “ResponsePCN” ed applicare la seguente regola: toNumber(split(trim(substring(value.parseHtml().select("gml|Point gml|pos")[0].toString(),10, -10)), " ")[0])
  10. creare una colonna “Lon-PCN” partendo dalla colonna “ResponsePCN” ed applicare la seguente regola: toNumber(split(trim(substring(value.parseHtml().select("gml|Point gml|pos")[0].toString(),10, -10)), " ")[1])
  11. usare le facets “Text” sulla colonna “Lat-PCN“: selezionare le righe “blank” e valorizzare a 0
  12. usare le facets “Text” sulla colonna “Lon-PCN“: selezionare le righe “blank” e valorizzare a 0
  13. creare una colonna “AddressForOsmNominatim” da valorizzare con la seguente regola: cells["Ubicazione-work-2"].value + "%20" + cells["Civico-work-1"].value + "," + cells["Comune-work-2"].value + ",Italia"
  14. creare una colonna “ResponseNominatimForAddress” il cui contenuto è il risultato della query a Nominatim con la seguente chiamata: 'http://open.mapquestapi.com/nominatim/v1/search.php?format=json&q=' + cells["AddressForOsmNominatim"].value
  15. creare una colonna “Lat-OSM-Address-Node” partendo dalla colonna “ResponseNominatimForAddress” ed applicare la seguente regola: if(value.parseJson()[0].osm_type=="node",value.parseJson()[0].lat,"")
  16. usare le facets “Text” sulla colonna “Lat-OSM-Address-Node“: selezionare le righe “blank” e valorizzare a 0
  17. creare una colonna “Lon-OSM-Address-Node” partendo dalla colonna “ResponseNominatimForAddress” ed applicare la seguente regola: if(value.parseJson()[0].osm_type=="node",value.parseJson()[0].lon,"")
  18. usare le facets “Text” sulla colonna “Lon-OSM-Address-Node“: selezionare le righe “blank” e valorizzare a 0
  19. creare una colonna “Lat-OSM-Address-Way” partendo dalla colonna “ResponseNominatimForAddress” ed applicare la seguente regola: if(value.parseJson()[0].osm_type=="way",value.parseJson()[0].lat,"")
  20. usare le facets “Text” sulla colonna “Lat-OSM-Address-Way“: selezionare le righe “blank” e valorizzare a 0
  21. creare una colonna “Lon-OSM-Address-Way” partendo dalla colonna “ResponseNominatimForAddress” ed applicare la seguente regola: if(value.parseJson()[0].osm_type=="way",value.parseJson()[0].lon,"")
  22. usare le facets “Text” sulla colonna “Lon-OSM-Address-Way“: selezionare le righe “blank” e valorizzare a 0
  23. creare una colonna “CityForOsmNominatim” e valorizzare con la seguente regola: cells["Comune-work-2"].value + ",Italia&limit=1"
  24. creare una colonna “ResponseNominatimForCity” il cui contenuto è il risultato della query a Nominatim con la seguente chiamata: 'http://open.mapquestapi.com/nominatim/v1/search.php?format=json&q=' + cells["CityForOsmNominatim"].value
  25. creare una colonna “Lat-OSM-City” partendo dalla colonna “ResponseNominatimForCity” ed applicare la seguente regola: value.parseJson()[0].lat
  26. usare le facets “Text” sulla colonna “Lat-OSM-City“: selezionare le righe “blank” e valorizzare a 0
  27. creare una colonna “Lon-OSM-City” partendo dalla colonna “ResponseNominatimForCity” ed applicare la seguente regola: value.parseJson()[0].lon
  28. usare le facets “Text” sulla colonna “Lon-OSM-City“: selezionare le righe “blank” e valorizzare a 0
  29. creare una colonna “GeoRefType” e valorizzare cona la seguente regola: if(cells["Lon-OSM-Address-Node"].value!="0","OSM_NODE",(if(cells["Lon-PCN"].value!="0","GN",(if(cells["Lon-OSM-Address-Way"].value!="0","OSM-WAY","OSM-CITY")))))
  30. creare una colonna “Lat” e valorizzare cona la seguente regola: if(cells["Lat-OSM-Address-Node"].value!="0",cells["Lat-OSM-Address-Node"].value,(if(cells["Lat-PCN"].value!="0",cells["Lat-PCN"].value,(if(cells["Lat-OSM-Address-Way"].value!="0",cells["Lat-OSM-Address-Way"].value,cells["Lat-OSM-City"].value)))))
  31. creare una colonna “Lon” e valorizzare cona la seguente regola: if(cells["Lon-OSM-Address-Node"].value!="0",cells["Lon-OSM-Address-Node"].value,(if(cells["Lon-PCN"].value!="0",cells["Lon-PCN"].value,(if(cells["Lon-OSM-Address-Way"].value!="0",cells["Lon-OSM-Address-Way"].value,cells["Lon-OSM-City"].value)))))
  32. applicare la trasformazione “To number” alle celle della colonna “Lat
  33. applicare la trasformazione “To number” alle celle della colonna “Lon
  34. cancellare, se desiderato, tutte le colonne di lavoro mantenendo solo le colonne “GeoRefType“, “Lat” e “Lon

Quanto descritto sopra ha valenza generale e può essere modificato a piacere, sia alterando i criteri utilizzati per dare le priorità di georeferenziazione tra le diverse alternative, sia, qualora si individuassero altri servizi WFS di esposizione dei numeri civici georiferiti in aggiunta a quelli del GeoPortale Nazionale, per estendere le fonti utilizzate.

A questo punto non vi resta che provare con dei vostri dati (se ci sono errori o cose non chiare segnalate e chiedete …. proviamo a risolvere insieme), e mettere così le vostre informazioni, delle quali al momento avete solo un indirizzo, su una qualunque mappa desideriate.

Enjoy!

 

Open Location Code: “indirizzi” per qualunque cosa ovunque?


Questa sera mi sono imbattuto in un post di Google Open Source Blog  dal titolo quanto mai accattivante e che comunque attira l’interesse per chi si occupa di georeferenziazione per indirizzo: Open Location Code: Addresses for everything, everywhere

Sembra che BigG stia provando a tirare fuori una cosa che potrebbe diventare un (piccola? grande? lo vedremo solo vivendo …), rivoluzione nel campo della georeferenziazione (tra l’altro applicabile sia in zone ove c’è la disponibilità degli indirizzi, sia in zone ove questa non è presente …),  ….. SENZA fare uso di indirizzi !!!

Il tutto è spiegato, per sommi capi, direttamente sul sito di Open Location Code: il maggior dettaglio è disponibile direttamente su GitHub.

Open Location Code assegna un “codice” ad ogni luogo sulle terra, codice derivato dalle coordinate latitudine e longitudine, disponibili ovunque: questi codici sono simili ad un “numero telefonico” – 8FQ93M9M+9PF, è ad esempio quello che individua la localizzazione del Museo Egizio di Torino -, ma che può essere abbreviato a sole 4 o 6 cifre quando combinate con la località (ad esempio la stessa localizzazione di cui sopra può essere espressa come 9M+9PF Centro, Torino, Piemonte, Città Metropolitana di Torino).

Ovviamente localizzazioni che siano vicine le une alle altre avrano codici simili.

Per la codifica è stato scelto un set di 20 caratteri calcolando tutte le possibili combinazioni di 20 caratteri da 0-9A-Z in modo che costituissero più di 10.000 parole  in 30 lingue diverse, questo per evitare, per quanto possibile, che le combinazioni includessero parole riconoscibili.

Il set di caratteri individuato è il seguente: 23456789CFGHJMPQRVWX.

I primi quattro caratteri descrivono un’area di un grado di latitudine per uno di longitudine. Aggiungendo altri quattro caratteri al codice, l’area si riduce di 1/20-simo di grado per 1/20-simo di grado all’interno dell’area precedente. Proseguendo nello stesso modo, ogni coppia di caratteri riduce di 1/400-esimo l’area precedente (nota: è un principio, se vogliamo, che ricorda l’organizzazone a tiles un catalogo di immagini TMS o di un servizio WMTS …..)

olc_10_character

olc_11_grid

Ovviamente con questa tecnica ogni location è in realtà un’area e non un punto, ma si arriva a celle relative ad aree sul territorio piuttosto ristrette, ad esempio 2.6m x 2.8m

Una location può essere convertita in un codice e un codice può essere riconvertito in una location in modo completamente offline: non ci sono tabelle dati o tabelle di look up e non sono richiesti servizi online.

L’algoritmo è pubblicamente disponibile e può essere usato senza alcuna restrizione (Apache License Version 2.0).

Esiste anche un sito demo che permette di ottenere gli open location codes navigando ed interrogando interattivamente una mappa.

OLC-Egizio

Per il momento non ho avuto tempo di fare prove, ma mi sembra una cosa interessante da approfondire ….

GeoWave “estende spazialmente” i “big data”?


Sembra che si inizi a pensare di utilizzare sul serio la componente spaziale dell’informazione anche nel mondo dei “big data”: un articolo interessante riporta i piani di un progetto ambiziono di GeoWave.

I pezzi salienti  dell’articolo sono i seguenti:

  • Geowave intends to do for “big data” databases (initially Apache Accumulo) what PostGIS does for SQL databases (PostgreSQL). GeoWave is open source software (licensed under Apache 2.0) that adds support for geographic objects, multi-dimensional indexing and geospatial operators to Apache Accumulo.
  • Apache Accumulo is a distributed database that is based on Google’s BigTable design and is built on top of Apache Hadoop and other Apache projects.
  • GeoWave includes a GeoServer plugin to enable geospatial data in Accumulo to be shared and visualized via GeoServer OGC standard web services. It provides plugins to connect the popular geospatial toolset GeoTools and the point cloud library PDAL to an Accumulo based data store. The PDAL plugin makes it possible to interact with point cloud data in Accumulo through the PDAL library.
  • The GeoWave project Work plans to extend the same geospatial capabilities to other distributed key-value stores in addtition to Accumulo. The next data store will be HBase. It also will support other geospatial frameworks in addition to GeoTools/GeoServer. Mapnik is the next geospatial framework targeted for GeoWave support. GeoWave says it is very interested in GeoGig and support for this geospatial data versioning library is currently on their backlog. GeoGig takes the concepts used in distributed version control such as Git and applies them to versioned spatial data.

Sicuramente un progetto da tenere in osservazione …..

OSM & Pubblica Amministrazione: non è proprio collaborazione stretta ma i punti di contatto aumentano


Negli ultimi tempi chi segue un po’ le vicende e le attività su OpenStreetMap, e in generale i temi degli open  data (georiferiti), ha potuto notare che c’è stato un bel fiorire di iniziative che, a partire dai dati resi disponibili dalle P.A. e con licenze compatibili alla ODbL (Open Data Commons Open Database License), hanno portato ad incrementare i dati presenti nel data base di OSM

Cito i casi di:

Oltre a queste esperienze, che rappresentano se vogliamo un effetto collaterale, non direttamente strutturato, della pubblicazione di open data georiferiti, spicca sicuramente l’iniziativa di Regione Toscana che, sulla falsariga dell’accordo stabilito qualche anno fa con GFOSS.it nell’ambito del software open source in campo GIS, per prima in Italia su scala regionale, ha recentemente messo a disposizione come Open Data la produzione regionale della sua banca dati topografica in scala 1:2.000.

In tale iniziativa viene sottolineata la ferma intenzione di aprire un dialogo ed una collaborazione stretta con OpenStreetMap, con l’obiettivo di veicolare i dati della Regione Toscana (strade, civici, edifici, copertura del suolo, idrografia, toponimi, ecc.) all’interno di OSM, facendone crescere la qualità nell’ambito del territorio toscano e fornendo quindi, anche tramite la mappa pubblica, un servizio migliore al territorio regionale.

I dati messi potenzialente a disposizione sono molti: si parla, per ciascun comune, di oltre 90 livelli informativi in formato ESRI shapefiles.

La Regione ha dimostrato ampia disponibilità permettendo di estendere la possibilità di portare in OSM anche i dati dei livelli informativi di strade e civici.

Sembra quindi che per la prima volta, sul panorama nazionale, qualcosa si stia muovendo nella forma di una collaborazione strutturata ed ufficiale: si spera, e sarebbe auspicabile, che quanto fatto da Regione Toscana costituisca ben presto una best practise seguita da altre P.A.

Non sullo stesso livello di impatto ma iniziativa comunque ufficiale è anche la seconda edizione del Piemonte Visual Contest organizzato dal Consiglio Regionale del Piemonte, dal Consorzio TOP-IX , dal CSI Piemonte e altri, che per il 2015 è incentrato con un mappathon su OSM, segnale anche questo di un occhio di riguardo e di attenzione da  parte di una pubblica amministrazione nei confronti della realtà costituita da questa comunità mondiale.

Tutti gli esempi di cui sopra sono riferiti al flusso di dati “dalla P.A verso il  mondo OSM“, mentre meno battuta è ancora la strada inversa che permetterebbe, una volta aperta, di innescare invece aspetti decisamente interessanti.

In questo senso si iniziano però a smuovere un po’ le acque: andando oltre lo stretto rapporto OSM – PA ed iniziando ad affrontare le problematiche di un ciclo virtuoso di collaborazione  tra “neo-geografia” e la modalità classica della produzione dei dati geografici da parte della P.A, occorre citare il workshop sul tema dei dati geografici armonizzati che si è tenuto ad ASITA e che è stato sintetizzato nel post di Massimo Zotti sul “Collaudo collaborativo dei dati geografici“.

Nell’ambito del workshop si è discusso sull’adottare nuovi modelli di produzione e aggiornamento dei dati geografici, basati su servizi web centralizzati invece che sulle tradizionali  produzioni distribuite su client stand-alone e sul ripensamento dei processi della Pubblica Amministrazione secondo il  paradigma della neogeografia, che prevede il coinvolgimento degli  utilizzatori del dato geografico fin dalle prima fasi della sua produzione.

Mentre il ragionamento di cui sopra si svolge più su un piano organizzativo e di processo, occorre evidenziare che anche da un punto di vista prettamente tecnico iniziano ad affacciarsi tecnologie che potrebbero essere abilitanti: già da tempo i principali produttori commerciali di software GIS  propongono soluzioni per il version control dei dati spaziali ed ora anche le comunità software del mondo gis open source stanno presentando analoghe soluzioni. L’ultima nata in questo campo che sembra essere piuttosto promettente è Versio un distribuited version control per dati spaziali che viene proposto da Boundless.

Sembra quindi che ci siano convergenze e humus fertile per far maturare, o almeno intraprendere, iniziative volte ad una collaborazione fattiva e proficua tra il mondo della  VGI (Volunteered Geographic Information) o neo-geography, e di OMS in particolare, ed il mondo dei “authoritative data” offerti e gestiti dalla P.A.

Di lavoro da fare ce nè ancora molto ma se non si inizia sicuramente non lo si riesce a portare a termine ed invece, forse, si stanno finalmente muovendo i primi passi: se son rose fioriranno come si suol dire e, almeno personalmente, spero di vederle presto spuntare fiorite da qualche parte!!!

FOSS4G 2015: mondiale in Corea del Sud (Seoul) ed europeo in Italia (Como)


Sono state decise le sedi di FOSS4G 2015: l’evento mondiale si terrà in Corea del Sud, a Seoul, dal 14 al 19 Settembre 2015 presso il COEX Convention & Exhibition Center, mentre quello europeo si terrà in Italia, a Como, dal 15 al 17 Luglio 2015 presso il Politecnico di Milano in Como.

foss4g2015_c

FOSS4G2015-EU