Hi Dan et al,
Dan, thanks for that summary documentation. It will come in handy.
To add to it, and to help you along in understanding IOOS SOS GetObservation responses (since, unlike the rest of us on this list, you weren't involved in the development of the Reference Implementation), I'll summarize here some important concepts; I'll also mention the extent to which the existing SOS servers and demo endpoints span the full range of possible GetObservation responses in IOOS SOS Milestone 1.
First, seeing the Milestone 1 template XML responses can be pretty useful, since they represent what pyoos is targeting and what the SOS servers are supposed to deliver. All the templates are here:
http://code.google.com/p/ioostech/source/browse/#svn%2Ftrunk%2Ftemplates%2FMilestone1.0
The inline comments are pretty rich and helpful.
However, as I mentioned in another email recently, the GetObservation response is currently split into two component XML's: the enclosing OM-GetObservation.xml and various possible SWE-* responses. The merged response I created exercises most (but not all) of the capabilities available in a Milestone 1 GetObs response:
https://github.com/ioos/ioossos2kml/blob/master/SWETesting/OM-GetObservation-SWE-MultiStation-TimeSeries-Corrected.xml
Take a look at the inline comments. This is the GetObs response parsed in my Wakari notebook at
https://www.wakari.io/sharing/bundle/emayorga/pyoos1_test_3
Now, to summarize the structure and capabilities:
* A response (to a network offering) can consist of multiple stations, each made up of 1 or 2 "feature types", with each feature type in a station having 1 or more sensors, and each sensor having 1 or more observed properties. Currently only timeSeries and timeSeriesProfile feature types are implemented in the templates or in the wild; the third one, "trajectories" (or something like that), is not implemented yet.
* Different feature types are encoded as separate, parallel blocks (om:ObservationCollection/om:member/om:Observation elements). A station having sensors of two different feature types (eg, a depth profiling buoy that has weather sensors -- we have several of those in NANOOS) would then be split up into two parallel blocks, by feature type. In contrast, a station having >1 sensors of the same feature type (say, a weather sensor package and a fixed-depth water sensor package, both of which produce "timeSeries" data) would be encoded in a single om:member/om:Observation element, as shown in OM-GetObservation-SWE-MultiStation-TimeSeries-Corrected.xml. There's currently no merged template file showing a response with two feature types AND multiple stations AND multiple sensors per station. I can create one, eventually.
* ncSOS is constrained to return only one one feature type per response, having only one station; but that response can have multiple sensors. This restriction is due to a core limitation in the CF/CDM conventions. So, the most complex response you'll find from ncsos would look like this:
timeSeries > station1
> sensor1 > air_temperature
> sensor1 > wind_speed
> sensor2 > sea_water_temperature
> sensor2 > salinity
and so on ...
* 52North IOOS SOS does not have the built-in ncsos constrain. However, the stable demos are fixed to return only one kind of limited response. Specifically, each station offering has two sensors, each sensor belonging to a different feature type and having just one observed property. So, the most complex GetObs response to a network offering request looks like this:
timeSeries
> station1 > sensor1 > air_temperature
> station2 > sensor1 > air_temperature
timeSeriesProfile
> station1 > sensor2 > sea_water_temperature
> station2 > sensor2 > sea_water_temperature
At this time, we can fully flex pyoos only with hard-wired merged XML templates like mine. Between my template, existing ncsos servers, and the 52n stable demo, we do have a reasonably good set of tests, though.