There are various way we can report a collection of values organised spatially (eg, distributed over an aquifer). Since we use O&M to represent most of our values, we can use om:parameter to attach a location to the observation and repeat as many observations as we need :
example of one of the observation
<?xml version="1.0" encoding="UTF-8"?>
<om:OM_Observation gml:id="ab.ww.402557.flow.1"
xsi:schemaLocation="http://www.opengis.net/om/2.0 http://schemas.opengis.net/om/2.0/observation.xsd"
xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:swe="http://www.opengis.net/swe/2.0" xmlns:cv="http://www.opengis.net/cv/0.2/gml32"
xmlns:om="http://www.opengis.net/om/2.0" xmlns:spec="http://www.opengis.net/samplingSpecimen/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<gml:description>Flow measurement in a single Observation with a location in om:parameter</gml:description>
<om:phenomenonTime>
<gml:TimeInstant gml:id="ab.ww.402557.flow.1.pt">
<gml:timePosition>2012-05-01</gml:timePosition>
</gml:TimeInstant>
</om:phenomenonTime>
<om:resultTime>
<gml:TimeInstant gml:id="ab.ww.402557.flow.1.ti">
<gml:timePosition>2012-05-01</gml:timePosition>
</gml:TimeInstant>
</om:resultTime>
<om:procedure xlink:href="http://www.opengis.net/def/gwml/procedure/flowmeter"
xlink:title="flow meter" />
<!-- based on SOS 2.0 http://www.opengis.net/spec/SOS/2.0/req/spatialFilteringProfile -->
<om:parameter>
<om:NamedValue>
<om:name
xlink:href="http://www.opengis.net/def/param-name/OGCOM/
2.0/samplingGeometry" />
<om:value>
<gml:Point gml:id="SamplingPoint">
<gml:pos srsName="urn:ogc:def:crs:EPSG::4326">52.9 7.52</gml:pos>
</gml:Point>
</om:value>
</om:NamedValue>
</om:parameter>
<om:observedProperty
xlink:href="http://www.opengis.net/def/gwml/phenomenon/flowspeed"
xlink:title="groundwater flow speed" />
<!--/req/gwml2-well/waterwell_observation_foi -->
<om:featureOfInterest xlink:href="#ab.ww.402557"
xlink:title="ab.ww.402557" />
<om:result xsi:type="gml:MeasureType" uom="m/s">0.0021</om:result>
</om:OM_Observation>
The other way is to use gml:Coverage and use a single observation that reports all the values into a single result (this is essentially what
WaterML does, but values are distributed temporally instead of spatially). This example reports 3 values (you would need to replicate the observation example above 3 times to reproduce this example below). This example uses a subtype of Coverage called
MultiPointCoverage.
I think the om:parameter value is unnecessary (mistakenly left after a copy and paste perhaps?) as the geometry is provided by om:result. The
WaterML example (
http://www.waterml2.org/) doesn't use om:parameter.Note also that rather than structuring the result as <domainSet> and <rangeSet>, these can be delivered as location:value pairs.
--
BruceSimons - 08 Dec 2014
Yes - it was a copy-paste mistake. fixed
--
EricBoisvert - 08 Dec 2014
<?xml version="1.0" encoding="UTF-8"?>
<om:OM_Observation gml:id="ab.ww.402557.flow.1"
xsi:schemaLocation="http://www.opengis.net/om/2.0 http://schemas.opengis.net/om/2.0/observation.xsd"
xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:swe="http://www.opengis.net/swe/2.0" xmlns:cv="http://www.opengis.net/cv/0.2/gml32"
xmlns:om="http://www.opengis.net/om/2.0" xmlns:spec="http://www.opengis.net/samplingSpecimen/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<gml:description>Flow measurement in a single Observation with a location in om:parameter</gml:description>
<om:phenomenonTime>
<gml:TimeInstant gml:id="ab.ww.402557.flow.1.pt">
<gml:timePosition>2012-05-01</gml:timePosition>
</gml:TimeInstant>
</om:phenomenonTime>
<om:resultTime>
<gml:TimeInstant gml:id="ab.ww.402557.flow.1.ti">
<gml:timePosition>2012-05-01</gml:timePosition>
</gml:TimeInstant>
</om:resultTime>
<om:procedure xlink:href="http://www.opengis.net/def/gwml/procedure/flowmeter"
xlink:title="flow meter" />
<om:observedProperty
xlink:href="http://www.opengis.net/def/gwml/phenomenon/flowspeed"
xlink:title="groundwater flow speed" />
<!--/req/gwml2-well/waterwell_observation_foi -->
<om:featureOfInterest xlink:href="#ab.ww.402557"
xlink:title="ab.ww.402557" />
<om:result>
<gml:MultiPointCoverage gml:id="cov1">
<gml:description>example of multipoint coverage of a series of flow
values. Note that is only one possible encoding, another interesting
way is to use NetCDF</gml:description>
<gml:descriptionReference />
<gml:identifier codeSpace="http://www.example.com/">string</gml:identifier>
<gml:name>string</gml:name>
<gml:boundedBy>
<gml:Envelope>
<gml:lowerCorner>51 -110</gml:lowerCorner>
<gml:upperCorner>52 -109</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<gml:domainSet>
<gml:MultiGeometry gml:id="gid">
<gml:description>geometries</gml:description>
<gml:identifier codeSpace="http://www.example.com/">string</gml:identifier>
<gml:name>string</gml:name>
<gml:geometryMember>
<gml:Point gml:id="obs_p1">
<gml:pos srsName="urn:ogc:def:crs:EPSG::4326">109.5 51.45</gml:pos>
</gml:Point>
</gml:geometryMember>
<gml:geometryMember>
<gml:Point gml:id="obs_p2">
<gml:pos srsName="urn:ogc:def:crs:EPSG::4326">109.554 51.31</gml:pos>
</gml:Point>
</gml:geometryMember>
<gml:geometryMember>
<gml:Point gml:id="obs_p3">
<gml:pos srsName="urn:ogc:def:crs:EPSG::4326">109.04 51.97</gml:pos>
</gml:Point>
</gml:geometryMember>
</gml:MultiGeometry>
</gml:domainSet>
<gml:rangeSet>
<gml:ValueArray gml:id="v1" uom="m/s">
<gml:identifier codeSpace="http://www.example.com/">values</gml:identifier>
<gml:name>values</gml:name>
<gml:valueComponent>
<!-- at this point, values can be many things, including a reference
to a external file or a free text datablock -->
<gml:Quantity uom="m/s">0.0021</gml:Quantity>
<gml:Quantity uom="m/s">0.0109</gml:Quantity>
<gml:Quantity xsi:nil="true" nilReason="missing" />
</gml:valueComponents>
</gml:ValueArray>
</gml:rangeSet>
<!-- no coverage function, therefore assume that there is a 1:1 between
domain elements and range elements -->
</gml:MultiPointCoverage>
</om:result>
</om:OM_Observation>
To add more values, just add elements , just add geometryMembers and gml:Quantity.
--
EricBoisvert - 28 Oct 2014
Note: There are many variations and encoding for Coverage. For instance, we can also use the "interleave pattern", that encodes the coverage as a collection of geometry-values pairs instead of grouping all the geometries in a single block and then all the results into another block.
Standard Coverage
- Coverage
- All geometries
- All values
- mapping (when there is a 1:1 mapping between geometries and values, it is not required)
<cv:CV_DiscreteCoverage gml:id="dc1"
xmlns:cv="http://www.opengis.net/cv/0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:gml="http://www.opengis.net/gml"
xsi:schemaLocation="http://www.opengis.net/cv/0.0 ../cv.xsd">
(...)
<cv:rangeType xsi:type="gml:ReferenceType" xlink:href="http://www.opengis.net/def/gwml/phenomenon/flowspeed"/>
<cv:element>
<cv:CV_GeometryValuePair>
<cv:geometry>
<gml:Point gml:id="obs_p1">
<gml:pos srsName="urn:ogc:def:crs:EPSG::4326">109.5 51.45</gml:pos>
</gml:Point>
</cv:geometry>
<cv:value xsi:type="gml:MeasureType" uom="m/s">0.0021</cv:value>
</cv:CV_GeometryValuePair>
</cv:element>
--
EricBoisvert - 08 Dec 2014
An alternate option is to use a
SamplingFeature to hold the locations, each value is serialized in their own Observation.
The following example is a stripped down version, just showing how Observation, SF_SpatialSamplingFeature and a GW_AquiferSystem are articulated.
<?xml version="1.0" encoding="UTF-8"?>
<gml:Bag xmlns:gwml2="http://www.opengis.net/gwml-core/2.0" xmlns:om="http://www.opengis.net/om/2.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sf="http://www.opengis.net/samplingSpatial/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/om/2.0 http://schemas.opengis.net/om/2.0/observation.xsd http://www.opengis.net/samplingSpatial/2.0 http://schemas.opengis.net/samplingSpatial/2.0/spatialSamplingFeature.xsd http://www.opengis.net/gwml-core/2.0 http://ngwd-bdnes.cits.nrcan.gc.ca/service/gwml/schemas/gwml2-core.xsd" gml:id="b1">
<gml:member>
<om:OM_Observation gml:id="o1">
<om:phenomenonTime/>
<om:resultTime/>
<om:procedure/>
<om:observedProperty/>
<om:featureOfInterest>
<sf:SF_SpatialSamplingFeature>
<sam:sampledFeature>
<gwml2:GW_AquiferSystem gml:id="aquifer">
<!-- properties of aquifer system remove for sake of brievity -->
</gwml2:GW_AquiferSystem>
</sam:sampledFeature>
<sf:shape>
<gml:Point srsName="EPSG:4326" gml:id="p1">
<gml:pos>64 -112</gml:pos>
</gml:Point>
</sf:shape>
</sf:SF_SpatialSamplingFeature>
</om:featureOfInterest>
<om:result/>
</om:OM_Observation>
</gml:member>
<gml:member>
<om:OM_Observation gml:id="o2">
<om:phenomenonTime/>
<om:resultTime/>
<om:procedure/>
<om:observedProperty/>
<om:featureOfInterest>
<sf:SF_SpatialSamplingFeature>
<!-- refers to an already serialised aquifer (above) -->
<sam:sampledFeature xlink:href="#aquifer" xlink:title="Aquifer x"/>
<sf:shape>
<gml:Point srsName="EPSG:4326" gml:id="p3">
<gml:pos>65 -113</gml:pos>
</gml:Point>
</sf:shape>
</sf:SF_SpatialSamplingFeature>
</om:featureOfInterest>
<om:result/>
</om:OM_Observation>
</gml:member>
<gml:member>
<om:OM_Observation gml:id="o3">
<om:phenomenonTime/>
<om:resultTime/>
<om:procedure/>
<om:observedProperty/>
<om:featureOfInterest>
<sf:SF_SpatialSamplingFeature>
<sam:sampledFeature xlink:href="#aquifer" xlink:title="Aquifer x"/>
<sf:shape>
<gml:Point srsName="EPSG:4326" gml:id="p3">
<gml:pos>65 -112</gml:pos>
</gml:Point>
</sf:shape>
</sf:SF_SpatialSamplingFeature>
</om:featureOfInterest>
<om:result/>
</om:OM_Observation>
</gml:member>
</gml:Bag>