This py notebook shows how to retrieve water data from the Bureau of Meteorology's water data services (see http://www.bom.gov.au/waterdata/). The data service is a Sensor Observation Service (SOS) v2.0.
The following imports the required OWSLib library, and contructs the base service object using the BoM service URL. Note that some of the functions use here are not yet merged into OWSLib (see https://github.com/geopython/OWSLib/pull/241).
from owslib.sos import SensorObservationService
from owslib.swe.observation.sos200 import SOSGetObservationResponse
from IPython.core.display import HTML
service = SensorObservationService('http://www.bom.gov.au/waterdata/services',version='2.0.0')
We now have a service description document (capabilities doc). This describes what the service can do and provides some identifiers for various data offerings. For example, we can extract all the available observed properties from the service:
str =''
for prop in service.observed_properties:
str += '<li>' + prop.replace('http://bom.gov.au/waterdata/services/parameters/','') + '</li>'
HTML(str)
This still doesn't describe identifiers for stations, or exactly which variables/phenomena are available at each station. To do this we need to use the 'GetDataAvailability' function. This call can be used to describe the available data series at a particular station. This is not part of the core SOS 2.0 spec, but it has been implemented by the Bureau using the HydroSOS profile.
This still needs to be implemented in OWSLib Will try and add it.
An example using an HTTP KvP request:
The Bureau service supports the GetFeatureOfInterest call, which is useful for discovering features with spatial filters. This call is not in OWSLib yet, but can be made using straight HTTP calls. I'll add an example..
This example below requests water course discharge data for a specific monitoring site (http://bom.gov.au/waterdata/services/stations/181.1 - a site in Tasmania), for the period 1st Jan 2016 to 5th March 2016
response = service.get_observation(featureOfInterest='http://bom.gov.au/waterdata/services/stations/181.1',
offerings=['http://bom.gov.au/waterdata/services/tstypes/Pat4_PC_1'],
observedProperties=['http://bom.gov.au/waterdata/services/parameters/Water Course Discharge'],
eventTime='om:phenomenonTime,2016-01-01T00:00:00+10/2016-03-05T00:00:00+10')
Once you have the service response, you can parse the response uing the OWSLib SOSGetObservationResponse class. This will identify the type of service response (in this case, WaterML2.0) and provide a parsed object.
Here we just pull out the time-value pairs and pass to Pandas to plot. Note that missing points and gaps are correctly passed through.
%matplotlib inline
from owslib.etree import etree
import pandas as pd
from pandas import Series
et = etree.fromstring(response)
parsed_response = SOSGetObservationResponse(et)
for o in parsed_response.observations[0:2]:
series = o.get_result()
dates = [p.datetime for p in series]
values = [p.value for p in series]
series = pd.Series(values, index=dates)
series.plot()
And there we have it. A discharge series - for any station in Australia.