I’ve been looking at the Weather Underground API (http://wiki.wunderground.com/index.php/API_-_XML) which gives access to the observation stations and the data they are collecting.

All the stations returned from the Weather Underground XML API when using "London" as the search string. Colour indicates air temperature with blue=12.7C, green=13.9C and red=20.5C

The API uses simple commands to query for a list of stations, for example:

http://api.wunderground.com/auto/wui/geo/GeoLookupXML/index.xml?query=london,united+kingdom

Using C# and .net, this is accomplished as follows:

 WebRequest request = WebRequest.Create(string.Format(GeoLookupXML, @"london,united+kingdom")); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
XmlDocument doc = new XmlDocument();
doc.Load(response.GetResponseStream());

Then the returned XML document is parsed using XQuery to extract the station name, lat/lon coordinates and whether it is an ICAO station or a personal weather station.

XmlNodeList Stations = doc.GetElementsByTagName("station");
foreach (XmlNode Station in Stations)
{
                XmlNode IdNode = Station.SelectSingleNode("id");
                XmlNode ICAONode = Station.SelectSingleNode("icao");
}

This gets us a list of stations ids and ICAOs which can then be used to build individual queries to obtain real time data from every station:

foreach (string Id in PWSStations)
{
                    XmlDocument ob = GetCurrentPWSOb(Id);
                    XmlNode Ntime = ob.SelectSingleNode(@"current_observation/observation_time_rfc822");
                    XmlNode Nlat = ob.SelectSingleNode(@"current_observation/location/latitude");
                    XmlNode Nlon = ob.SelectSingleNode(@"current_observation/location/longitude");
                    XmlNode NairtempC = ob.SelectSingleNode(@"current_observation/temp_c");
                    string time = Ntime.FirstChild.Value;
                    string airtempC = NairtempC.FirstChild.Value;
                    string lat = Nlat.FirstChild.Value;
                    string lon = Nlon.FirstChild.Value;

                    //do something with the data...
}

//NOTE: only slight difference in xml format between PWS and ICAO
foreach (string ICAO in ICAOStations)
{
                    XmlDocument ob = GetCurrentICAO(ICAO);
                    XmlNode Ntime = ob.SelectSingleNode(@"current_observation/observation_time_rfc822");
                    XmlNode Nlat = ob.SelectSingleNode(@"current_observation/observation_location/latitude");
                    XmlNode Nlon = ob.SelectSingleNode(@"current_observation/observation_location/longitude");
                    XmlNode NairtempC = ob.SelectSingleNode(@"current_observation/temp_c");
                    string time = Ntime.FirstChild.Value;
                    string airtempC = NairtempC.FirstChild.Value;
                    string lat = Nlat.FirstChild.Value;
                    string lon = Nlon.FirstChild.Value;

                    //do something with the data...

}

After that it’s simply a matter of writing all the data to a CSV file so that you can do something with it.

Air temperature for London plotted using the MapTubeD heatmap tile renderer

Trackback

No comments

Add your comment now