Javascript, HTML, CSS e... !
2 commenti

Con un servizio open source

Georeferenziare un CAP con una chiamata in GET in Google Apps Script

Curiosando in rete ho trovato un servizio carino ed open source dove tramite una chiamata RESTful API a api.zippopotam.us, fornendo come parametri un paese nel formato ISO 3166-1 alpha-2 ed un codice postale presente in quel territorio, vengono fornite le informazioni di geolocalizzazione di quella determinata area.

Tra le informazioni restituite ci sono: la regione (cona la sua sigla di abbreviazione), la città, la longitudine e la latitudine.

Per ottenere il risultato basta semplicemente effettuare una chiamata in GET con un formato simile al seguente: api.zippopotam.us/IT/57100
Nel caso specifico di cui sopra ho fornito come paese IT (Italia) e come codice postale 57100 (Livorno), come confermato dal contenuto della risposta in JSON:

{"post code": "57100", "country": "Italy", "country abbreviation": "IT", "places": [{"place name": "Livorno", "longitude": "10.3167", "state": "Toscana", "state abbreviation": "TC", "latitude": "43.55"}]}

Con Google Apps Script, tramite la classe UrlFetchApp (in modo simile a come già utilizzato nell'articolo 'Creare un servizio Whois con una chiamata in GET in Google Apps Script') sono sufficienti pochissime righe di codice per poter recuperare il JSON risultante pronto per essere gestito:

function getGeolocByZip() {
  var country = 'IT';
  var zip = '57100';
  var response = UrlFetchApp.fetch("http://api.zippopotam.us/" + country + "/" + zip, {muteHttpExceptions: true});
  Logger.log(response);
}

Il risultato, contenuto nella variabile response e visualizzato nel log (Fig. 1), è quello anticipato poco sopra:



log di apps script con le informazioni georeferenziate del cap di livorno

Fig. 1 - Log di Apps Script con le informazioni georeferenziate del CAP di Livorno


L'utilizzo di questo servizio può trovare una valida applicazione nella gestione di indirizzi fisici, presenti ad esempio in Spreadsheet, al fine di arricchirli con dettagli di geolocalizzazione.

La lista dei paesi supportati, insieme ad altre informazioni, è presente nella pagina ufficiale del servizio (ovvero la root dell'API): api.zippopotam.us.

Tags

Michele Pisani

Michele Pisani

Sviluppatore Javascript ed esperto in Digital Analytics

L'esperienza nel settore Digital Analytics unita ad anni di sviluppo in Javascript ha trovato la massima espressione in Google Apps Script che mi ha permesso, con estrema facilità e poche righe di codice, di realizzare potenti applicazioni interattive e processi automatizzati integrati con i prodotti della G Suite.

Come contattarmi
scrivi un commento

2 Commenti

  1. sabato 3 marzo 2018 alle ore 12.16 Pietro

    ho provato il servizio in una mia web app però ho visto che con alcuni cap nel json ci sono molti risultati e non solo uno, ho trovato su un sito una funzione ma recupera solo il primo risultato. c'è il modo per avere una lista completa anche quando si richiamano in un ciclo diversi cap? grazie

    Rispondi a questo commento
    • sabato 3 marzo 2018 alle ore 21.52 Michele PisaniAutore

      Ciao Pietro,
      durante i miei test su questa API avevo trovato anch'io risposte che per lo stesso CAP contenevano più di un risultato, uno che ricordo è Lucca, api.zippopotam.us/IT/55100:


      {"post code": "55100", "country": "Italy", "country abbreviation": "IT", "places": [{"place name": "Maggiano", "longitude": "10.4132", "state": "Toscana", "state abbreviation": "", "latitude": "43.856"}, {"place name": "Saltocchio", "longitude": "10.5393", "state": "Toscana", "state abbreviation": "", "latitude": "43.8882"}, {"place name": "Cerasomma", "longitude": "10.4323", "state": "Toscana", "state abbreviation": "", "latitude": "43.8287"}, {"place name": "Ponte Del Giglio", "longitude": "10.7659", "state": "Toscana", "state abbreviation": "", "latitude": "43.8354"}, ...


      Si tratta di frazioni, che hanno lo stesso codice di avviamento postale ma diverse informazioni di longitudine e latitudine (oltre ovviamente al nome della frazione).

      Ti riporto di seguito un estratto di uno script che realizzai e che ho modificato leggermente per adattarlo alla tua esigenza, nel caso specifico viene effettuato un ciclo passando 3 CAP (quello di Livorno, quello di Pisa e quello di Lucca) e fornisce come output un array contenente il paese, il nome della città/frazione, la latitudine e la longitudine (ho lasciato nello script alcuni controlli, come quello della presenza del paese e del contenuto nella risposta):


      function startFunc() {
      var country = ['IT'];
      var zip_list = ['57100','56100','55100']; // Livorno, Pisa, Lucca
      var zip_list_len = zip_list.length;
      var response = '';
      var response_concat = [];
      for (i=0; i<zip_list_len; i++) {
      response = zipGeoLoc(country[0], zip_list[i]);
      response_concat = response_concat.concat(response);
      }
      Logger.log(response_concat);
      }

      function zipGeoLoc(country, zip) {
      geoLoc_array = [];
      country = country === undefined ? 'IT' : country
      var response = UrlFetchApp.fetch("http://api.zippopotam.us/" + country + "/" + zip, {muteHttpExceptions: true});

      if (String(response.getResponseCode()) == '404') { return ["Attenzione! CAP non trovato per: " + country + '-' + zip] }
      var z = JSON.parse(response.getContentText());
      var places_len = z["places"].length;

      var res= [];
      for (j=0; j<places_len; j++) {
      res.push([z["country"], z.places[j]["state"], z.places[j]["place name"], z.places[j].latitude, z.places[j].longitude])
      }
      return res;
      }



      Il risultato è un unico array di array con le informazioni normalizzate in termini di formato, ovvero sono contenute tutte le risposte relative all'unica riga per il CAP di Livorno, l'unica riga per il CAP di Pisa e tutte le righe per il CAP delle frazioni di Lucca:


      [[Italy, Toscana, Livorno, 43.55, 10.3167], [Italy, Toscana, Pisa, 43.7167, 10.3833], [Italy, Toscana, Maggiano, 43.856, 10.4132], [Italy, Toscana, Saltocchio, 43.8882, 10.5393], [Italy, Toscana, Cerasomma, 43.8287, 10.4323], [Italy, Toscana, Ponte Del Giglio, 43.8354, 10.7659], [Italy, Toscana, Piaggione, 43.9374, 10.5081], [Italy, Toscana, Ponte A Moriano, 43.9079, 10.531], [Italy, Toscana, Picciorana, 43.8477, 10.5489], [Italy, Toscana, San Lorenzo Di Moriano, 43.8587, 10.4683], [Italy, Toscana, Gattaiola, 43.8302, 10.4633], [Italy, Toscana, Vinchiana, 43.9279, 10.53], [Italy, Toscana, Montuolo, 43.8393, 10.447], [Italy, Toscana, San Concordio Di Moriano, 43.8948, 10.5028], [Italy, Toscana, Nozzano, 43.8356, 10.4172], [Italy, Toscana, San Pietro A Vico, 43.875, 10.5361], [Italy, Toscana, Massa Pisana, 43.8587, 10.4683], [Italy, Toscana, Pontetetto, 43.8229, 10.4942], [Italy, Toscana, Fagnano, 43.8348, 10.455], [Italy, Toscana, Ponte San Pietro, 43.8447, 10.4178], [Italy, Toscana, Santa Maria Del Giudice, 43.7811, 10.456], [Italy, Toscana, Lucca, 43.843, 10.508], [Italy, Toscana, Monte San Quirico, 43.9135, 10.5528], [Italy, Toscana, Mutigliano, 43.8844, 10.479]]



      Probabilmente nello script che avevi trovato non era presente il controllo sulla lunghezza del contenuto di 'places'.

      Rispondi a questo commento

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato.I campi contrassegnati da un * sono obbligatori
Puoi utilizzare i seguenti tag nei commenti:
[bold]testo[/bold] se vuoi evidenziare un testo con il grassetto[code]function helloworld() { }[/code] se vuoi pubblicare una porzione di codice[url]http://www.appsscript.it[/url] se devi riferirti ad un indirizzo web