
Gestione luoghi previsioni meteo
Abstract. Lista e documentazione specifica di ogni singola azione necessaria per la gestione completa dei loghi gestiti dai modelli meteorologici.
Objectives. Rendere più semplice l’interazione e la gestione dei luoghi.
Prior Work. Scrittura, sviluppo e composizione delle azioni in linguaggio Python tramite web framework Bottle.
Approach. Esaminando le azioni una per una si descrive il funzionamento ed eventuale spiegazione dei principi teorici.
Results. Documentazione completa delle azioni per poter replicare e/o migliorare l’approccio al lavoro svolto.
Value. Maggiore conoscenza d ogni singola azione e servizio sviluppato
1. Introduction
Acronimo di Application Programming Interface, un API è un interfaccia data da un software per attuare interazioni con altri software, allo stesso modo in cui un User Interface facilita l’interazione tra l’utente ed il software. L’API ha permesso alle comunità web di costruire un open space dove condividere contenuti e dati tra le comunità e applicazioni. In questo modo un contenuto che è stato creato da una parte può essere dinamicamente postato e aggiornato da un altra parte.
Quando si creano, si consultano o gestiscono API bisogna far sì che l’utente finale abbia tutte le informazioni richieste e nel formato migliore. Che tu sia uno sviluppatore, un tester o un manager alcuni strumenti ti aiutano a prendere il controllo di API e servizi REST facilmente.
Siamo nella situazione in cui viene installato un semplice micro web-framework come Bottle che richiede solo i moduli della Python Standard Library ma che ci mette a disposizione un modo veloce per scrivere le nostre API consultabili da qualsiasi client fornendo la risposta in formato JSON per qualsiasi sia il metodo HTTP usato, da GET, POST o DELETE, semplicemente dichiarando il tipo di route da gestire.
La stesura completa dei servizi spetta agli sviluppatori.
2. Body Text
La stesura completa dei servizi spetta agli sviluppatori. Ogni route viene chiamata dal framework action a cui è possibile assegnare uno specifico metodo HTTP a cui rispondere.
Il CCMMMA (Centro Campano per il Monitoraggio e la Modellistica Marina e Atmosferica) offre servizi e prodotti basati sui dati delle proprie previsioni meteomarine e della propria rete di monitoraggio. Tuttavia sviluppatori come Fabio Nisci si sono occupati di rendere questi dati grezzi e poco usabili in vere e proprie API che forniscano le informazioni in formato JSON fornendo una collezione pubblica e ben documentata di servizi utilizzata per lo sviluppo di applicazioni e servizi.
Personalmente ho ritenuto opportuno, dopo lo sviluppo dell’applicazione UniMeteo, fornire più informazioni agli utenti mettendo a disposizione dati omessi nelle vecchie API, così vista la mia esperienza in servizi di localizzazione le ho prodotte.
A. Latest update
,,
Title,Latest update
Author,Fabio Nisci
Description,Model last update date
Output,Model last update date. It could takes a while.
Params,model
Format,application/json
Authentication,Not Required
Response,200 Ok; 404 Wrong model
URI,https://api.uniparthenope.it/meteo/latest/<model>
Dato un modello meteorologico, dove model è una chiave proveniente dall’action getmodels, restituisce l’intera voce dell’ultimo aggiornamento eseguito sul backend.
La base dove sono contenute queste informazioni è “http://meteo.uniparthenope.it/dods/xml” fornita tramite protocollo DODS, basato su OPeNDAP protocollo di trasporto dati usato spesso dagli scienziati della terra, presentato in formato XML. L’algoritmo si innesta nella cartella interessata, che per l’ultimo aggiornamento disponibile consiste in “/serverdirectory/dataset” che costituirà l’intero dataset in cui cercare le informazioni desiderate.
Dopodiché opera la vera e propria ricerca del modello a cui siamo interessati. Escludendo eventuali modelli privati o aggiornamenti troppo vecchi a cui non saremmo comunque interessati.
Al completamento restituisce un output in formato JSON che rispecchia l’entry più recente per quel dato modello.
L’intera operazione potrebbe richiedere diversi secondi a causa della lunga elaborazione del server per quanto riguarda la prima stesura della directory dataset non dovuto assolutamente dall’action in question, tuttavia una volta elaborata l’algoritmo di ricerca è estremamente veloce.
B. Register new user
,,
Title,Register new user
Author,Fabio Nisci
Description,Insert new admin user into database. This user have privileges to edit; generate or update a place info
Output,Nothing useful; just admins informations
Params,username: username to insert; password: user password
Format,application/json
Authentication,Required
Response,200 Authorized; 206 Already authorized; 401 Not authorized
URI,https://api.uniparthenope.it/meteo/generate/insert;
Alcune action richiedono operazioni di scrittura su un database interno sqlite3 che mantiene le informazioni extra in grado di far funzione alcune API aggiuntive. L’action insert in questione si occupa di inserire un nuovo utente nel database che abbia privilegi di modificare, generare o aggiornare informazioni sui luoghi.
HTTPS e metodo POST assicurano una trasmissione sicura, dopodiché, se non già presenti, vengono salvate informazioni di nome utente e password nell’apposita tabella. Per garantire maggiore sicurezza, se i dati presenti sono particolarmente sensibili, è possibile abilitare i “profili incompleti” in cui sono già presenti alcuni utenti che diventeranno effettivi una volta che l’utente avrà compilato le informazioni.
C. Update or generate places database
C. Update or generate places database
,,
Title,Update or generate places database
Author,Fabio Nisci
Description, Update and refresh places in database
Output,Nothing useful; just admins informations
Params,username; password; alsofill: before update locations verify if there are new places; limit: limit places to process
Format,application/json
Authentication,Required
Response,200 Ok; 404 Not found
URI,https://api.uniparthenope.it/meteo/generate
Aggiorna o rigenera il database dei luoghi. Questa azione richiede di essere utenti autorizzati alla modifica del database, quindi bisogna essere registrati come tali essendo la prima operazione che viene svolta dall’action.
Se il parametro “alsofill” è impostato ad 1, viene effettuata l’operazione di verifica remota dalla lista dei luoghi, in questo modo se dovessero esserci aggiornamenti o aggiunta di nuovi luoghi rispetto a quelli già presenti verranno automaticamente integrati nel database. La lista fornita dal centro comprende solo l’identificativo interno del luogo ed il nome comune in lingua italiana, quindi adesso ha inizio la vera e propria operazione di inserimento.
Vengono, a questo punto, selezionati tutti i luoghi nel database che richiedono modifiche e, uno ad uno, sono processati. Il singolo record viene passato ad un servizio remoto di geocoding, il processo di trovare coordinate ed informazioni geografiche, spesso espresse come latitudine e longitudine, da altri dati geografici come indirizzo o codice postale.
Il geocoder, quindi, è in grado di fornire informazioni come: un indirizzo formattato e leggibile, informazioni di localizzazione GPS con latitudine e longitudine e confini del luogo. Dopodiché si salvano le modifiche permanentemente nel database.
D. Get place by its name
,,
Title,Get place by its name
Author,Fabio Nisci
Description,It returns place information you are looking for.
Output,Place informations. It could be a list.
Params,placename: Place common name to find aka Napoli; Rome or Paris; space separated by '+' sign
Format,application/json
Authentication,Not Required
Response,200 Ok; 404 Not found
URI,https://api.uniparthenope.it/meteo/byplacename/<placename>
Fornito il nome del luogo da ricercare individua tutte le possibili corrispondenze. Il nome del luogo da ricercare viene passato come parametro dell’azione in cui gli spazi sono separati dal simbolo “+” questo perché vengono effettuate due tipi di ricerche una complessa ed un’altra semplice. La prima viene innescata qualora si ricerchi un luogo tramite un prefisso articolato del tipo: “comune di”, “provincia di” o “porto di”. Altrimenti viene scelta la modalità di ricerca semplice dove viene analizzata semplicemente la similarità tra le parole.
Se trovati più di un risultato viene generata una lista dal luogo più vicino sintatticamente, in ogni caso vengono comunque presentate tutte le informazioni utili dal dataset.
E. Nearest places
,,
Title,Nearest places
Author,Fabio Nisci
Description,It returns nearest places your location; in radius.
Output,Place informations. It could be a list.
Params,latitude: current location latitude; longitude: current location longitude; radius radius in KM; limit: limit results set
Format,application/json
Authentication,Not Required
Response,200 Ok; 404 Not found
URI,https://api.uniparthenope.it/meteo/bycoords/<latitude>/<longitude>
Questa azione di ricerca consente di cercare luoghi all’interno di un’area specificata. È possibile rifinire la richiesta di ricerca fornendo latitudine e longitudine della posizione attuale o specificando il raggio di ricerca in chilometri. Viene restituita una lista di possibili luoghi in cui il primo rappresenta il più vicino alla posizione indicata.
Per calcolare la distanza rispetto due posizione viene usato l’algoritmo distanza di Manhattan (Taxicab geometry oppure Manhattan distance in inglese) successivamente sostituito con la formula dell’emisenoverso (chiamata anche The haversine formula in inglese).
La formula di Haversine è in trigonometria sferica qualcosa di molto simile al teorema di Pitagora.
Che, comunque, prevede la somma dei quadrati delle differenze delle distanze.
Tra l’altro il teorema di Pitagora vale per le coordinate UTM ovvero proiettate in piano.
Non è il caso delle coordinate trattate dai dispositivi mobili che, come tutti i GPS sono [latitudine, longitudine] ( non metriche ) su DATUM WGS84.
Il teorema di Pitagora applicato alle coordinate WGS84 in gradi non dovrebbe funzionare poiché parliamo di angoli e non lati.
Diversamente da quanto espresso dalla teoria però entrambi gli algoritmi restituiscono un risultato simile ma attraverso metodi diversi.
Ecco alcuni test da me effettuati per confrontare gli algoritmi:
Nei pressi di Bologna
Innanzitutto viene preso in considerazione il raggio di ricerca, se non impostato per default viene messo a 5km di distanza dal centro dopodiché viene prevaricata la funzione di Haversine per permettere il calcolo delle distanze, ed infine viene riordinata la lista ottenuta secondo le distanze più prossime.
F. Get place by its ID
,,
Title,Get place by its ID
Author,Fabio Nisci
Description, It returns place information you are looking for.
Output,Place informations.
Params,identifier: Place identifier code aka prov063; prov065; com15146
Format,application/json
Authentication,Not Required
Response,200 Ok; 404 Not found
URI,https://api.uniparthenope.it/meteo/byid/<identifier>
Algoritmo di ricerca di un luogo specifico indicando il suo identificativo, unico nell’intero database dei luoghi, successivamente abbreviato come ID. Questo ID appartiene ad un solo ed unico luogo. Viene usato per ottenere informazioni sulle previsioni meteorologiche passandolo come parametro ad altre azioni e modelli.
Dapprima l’azione verifica l’ID, dopodiché ricerca il luogo specifico restituendolo come risultato.
Fabio Nisci | fabionisci@gmail.com
3 License
Creative Commons Public License Attribuzione – Non commerciale 3.0 – http://creativecommons.org/licenses/by-nc/3.0/it/deed.it
4 References
Wikipedia – L’enciclopedia libera http://www.wikipedia.org/
Attualmente i servizi descritti sono disponibili su https://api.uniparthenope.it/meteo/