Rilevare informazioni sul meteo con VB.Net e C#

Articolo che fornisce interessante spunto sulla gestione meteo, da utilizzare in qualsiasi ambiente, web, windows application e mobile.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

 In questo articolo vedremo come realizzare un semplice applicativo che permette di rilevare i dati del tempo del giorno stesso in cui viene eseguito.
Possiamo ottenere anche le previsioni per i giorni a seguire, ma ci limiteremo a vedere quelle del giorno stesso.
Per rilevare tali informazioni, utilizzeremo le API esposte dal sito open weathermap http://openweathermap.org/api il quale offre un servizio gratuito molto interessante.
In questa parte vedremo come utilizzare quelle del giorno, e come interpetrare i valori, qui http://openweathermap.org/current la pagina con le informazioni.

Creazione della form

Si crea un progetto di tipo Windows Application, selezionando il linguaggio di proprio interesse.
Inseriamo nella form che viene presentata alcuni controlli in particolare tre controlli di tipo cornice, un controllo pulsante 12 controlli label e 12 controlli textbox ed infine un controllo di tipo WebBrowser, il tutto come mostrato in figura 1.

Figura 1 – la form con i campi valorizzati


Dopo aver posizionato i vari controlli, impostiamo i nomi alle caselle di testo e pulsante.

Stesura del codice

Ora passiamo in visualizzazione codice per scrivere le istruzioni per rilevare i valori ed impostali nei singoli controlli.
Se facciamo doppio click sul pulsante, passeremo alla visualizzazione codice dell’evento click del pulsante.
A questo punto dobbiamo inserire lo spazio dei nomi, nei quali utilizzeremo le classi per la gestione dei siti web (System.Net) lo spazio dei nomi per la gestione dello streaming (system.io) ed infine per la gestione del formato (system.text).

Qui di seguito si riporta il frammento di codice relativo alla dichiarazione dello spazio dei nomi per entrambi i linguaggi di programmazione.

Vb.Net
Imports System.Net
Imports System.IO
Imports System.Text
C#
using System.Text;
using System.Net;
using System.IO;

Ritorniamo all’evento click del pulsante, nel quale andremo ad utilizzare le classi per la gestione del sito web.
Il sito web che richiameremo ci tornerà dei valori con i quali andremo ad impostare le varie caselle di testo.
Utilizzeremo la classe Webrequest, webresponse e streamreader, le quali avranno il compito di ottenere e gestire i dati che restituisce il sito.
Qui di seguito si riporta il sito che rileva i dati in formato (xml) per la città di Roma, ed in lingua italiana. Per quest’ultimo parametro, va ricordato che solo il tipo di previsione è scritto in italiano, altrimenti tutti i valori sono in lingua inglese.
Altro parametro è l’unità di misura della temperatura.
Il sito da richiamare è il seguente
http://api.openweathermap.org/data/2.5/weather?q=Rome,it&mode=xml&units=metric&lang=it

Come si può vedere, il parametro, q è valorizzato con la città (Rome) e la nazione tramite (it), il parametro mode, indica in quale formato ci restituisce i dati (xml) ma possiamo ottenere anche json e html, il parametro units indica l’unità di misura ed infine il parametro lang il tipo di lingua.
I parametri sono tutti facoltativi, possiamo utilizzare altri parametri, per esempio per code, oppure per coordinate GPS.
Ma vediamo ora come ottenere i dati dal sito appena citato.
Qui di seguito si riporta il frammento di codice per entrambi i linguaggi.

VB.Net
Private Sub BtnRilevaTemp_Click(sender As System.Object, e As System.EventArgs) Handles BtnRilevaTemp.Click
Dim url As String = "http://api.openweathermap.org/data/2.5/weather?q=Rome,it&mode=xml&units=metric&lang=it"
Dim request As WebRequest = WebRequest.Create(url)
Using response As WebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
Using reader As New StreamReader(response.GetResponseStream(), Encoding.UTF8)
Dim dsResult As New DataSet()
dsResult.ReadXml(reader)
txtMinima.Text = dsResult.Tables(4).Rows(0)(1).ToString()
txtMassima.Text = dsResult.Tables(4).Rows(0)(2).ToString()
txtAttuale.Text = dsResult.Tables(4).Rows(0)(0).ToString()
txtSorge.Text = DateTime.Parse(dsResult.Tables(3).Rows(0)(0).ToString()).ToString("dd/MM/yyyy hh:mm:ss")
txtTramonta.Text = DateTime.Parse(dsResult.Tables(3).Rows(0)(1).ToString()).ToString("dd/MM/yyyy HH:mm:ss")
txtumidita.Text = dsResult.Tables(5).Rows(0)(0).ToString() + dsResult.Tables(5).Rows(0)(1).ToString()
txtventoVelocita.Text = dsResult.Tables(8).Rows(0)(0).ToString() + " " + dsResult.Tables(8).Rows(0)(1).ToString()
txtDirezioneVento.Text = dsResult.Tables(9).Rows(0)(1).ToString() + "     " + dsResult.Tables(9).Rows(0)(2).ToString()
txtPrecipitazione.Text = dsResult.Tables(11).Rows(0)(0).ToString()
txtStato.Text = dsResult.Tables(12).Rows(0)(1).ToString()
webBrowser1.Navigate("http://openweathermap.org/img/w/" + dsResult.Tables(12).Rows(0)(2).ToString() + ".png")
End Using
End Using
End Sub
C#
private void BtnRilevaTemp_Click(object sender, EventArgs e)
{
string url = "http://api.openweathermap.org/data/2.5/weather?q=Rome,it&mode=xml&units=metric&lang=it";
WebRequest request = WebRequest.Create(url);
using (WebResponse response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
DataSet dsResult = new DataSet();
dsResult.ReadXml(reader);
txtMinima.Text =  dsResult.Tables[4].Rows[0][1].ToString();
txtMassima.Text = dsResult.Tables[4].Rows[0][2].ToString();
txtAttuale.Text = dsResult.Tables[4].Rows[0][0].ToString();
txtSorge.Text = DateTime.Parse(dsResult.Tables[3].Rows[0][0].ToString()).ToString("dd/MM/yyyy hh:mm:ss");
txtTramonta.Text = DateTime.Parse(dsResult.Tables[3].Rows[0][1].ToString()).ToString("dd/MM/yyyy HH:mm:ss");
txtumidita.Text = dsResult.Tables[5].Rows[0][0].ToString() + dsResult.Tables[5].Rows[0][1].ToString();
txtventoVelocita.Text = dsResult.Tables[8].Rows[0][0].ToString() + " " +  dsResult.Tables[8].Rows[0][1].ToString();
txtDirezioneVento.Text = dsResult.Tables[9].Rows[0][1].ToString() + "     " + dsResult.Tables[9].Rows[0][2].ToString();
txtPrecipitazione.Text = dsResult.Tables[11].Rows[0][0].ToString();
txtStato.Text = dsResult.Tables[12].Rows[0][1].ToString();
webBrowser1.Navigate("http://openweathermap.org/img/w/" + dsResult.Tables[12].Rows[0][2].ToString() + ".png");
}
}
}

Per ottenere l’icona dobbiamo utilizzare il link, indicando l’immagine il valore situato nel codice ID.
Alcune informazioni, codice e tipologia di immagine, si trovano al seguente sito http://openweathermap.org/weather-conditions nel quale troviamo anche l’esempio di come visualizzare l’immagine del tempo.
Nella pagina sono indicati tutti i codici di riferimento, non solo per le immagini.
Se invece vogliamo ottenere i giorni successivi, dobbiamo utilizzare il seguente link
http://api.openweathermap.org/data/2.5/forecast/daily?q=Rome,it&mode=xml&units=metric&lang=it&cnt=14

mettendo come riferimento “forecast” e non weahter, e come paramtri daily e cnt, dove il primo indica di ottenere i giorni successivi, in base al numero dei giorni impostati nel secondo parametro (cnt).

Conclusioni


L’articolo ha voluto fornire al lettore come dotare i nostri applicativi (Windows application in questo caso ma poteva essere anche una web application o mobile) della visualizzazione delle previsioni meteo.
Un sistema semplice e gratuito che possiamo aggiungere ai nostri programmi oppure realizzando programmi inerenti tale tematica.
Lasciamo al lettore l’interesse di scoprire le altre funzionalità offerte da questo sito, e le numerose api messe a disposizione.