European Commission logo
INSPIRE Community Forum

Observational Coverages

Dear all,

in the process of revisiting the observational encoding options, we discovered that there are a few gaps somewhere between the UML specification and the available encoding options. This is due to timing issues, with the coverage specifications & implementations becoming available late in the O&M specification process. Now that both O&M and coverages have settled a bit, we'd like to sort this issue to ease implementation for all.

The specific problem encountered pertains to the ProfileObservation, which specifies the use of either RectifiedGridCoverage or ReferenceableGridCoverage as result. RectifiedGridCoverage seems to be working, but when one attempts to utilize ReferenceableGridCoverage one ends up dead-ended in abstract features.

At present, we're analysing possible implementation options, taking the updated coverage specifications into account. My request to all is to provide input if:

  • you are working with coverages within the INSPIRE Observational Themes
  • you are interested in providing input to this work

:)

Kathi

  • Sylvain GRELLET

    By Sylvain GRELLET

    Hi Kathi,

    Thanks for this post.

    As I told you, exposing geology log using INSPIRE ProfileObservation would make sense.
    At BRGM, we are currently exposing those using GWML2 GW_GeologyLogCoverage, an O&M specialization (http://docs.opengeospatial.org/is/16-032r2/16-032r2.html#82).
    You'll find running examples here : http://ressource.brgm-rec.fr/obs/RawGeologicLogs/BSS001REWW

    Fun is that the intervals are irregular. 
    And, to be conceptually clean, the borehole trajectory is not a simple vertical line even if in databases geological surveys often simplify this or store the real geometry elsewhere.

    Sylvain

  • Katharina SCHLEIDT

    By Katharina SCHLEIDT

    Hi all,

    I've gone through the various coverage models available in gml, my current conclusion is that the GeneralGridCoverage as defined in CIS 1.1 would serve our purposed nicely. Have yet to try Sylvain's GeologyLogCoverage example, but do have a first shot at a simple marine ProfileObservation utilizing GeneralGridCoverage - thoughts?

    :)

    Kathi

    <?xml version="1.0" encoding="UTF-8"?>
    <omso:ProfileObservation gml:id="PO_1619169_NTKGAATX" xmlns:om="http://www.opengis.net/om/2.0&quot; xmlns:xlink="http://www.w3.org/1999/xlink&quot; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:gml="http://www.opengis.net/gml/3.2&quot; xmlns:sams="http://www.opengis.net/samplingSpatial/2.0&quot; xmlns:gmlcov="http://www.opengis.net/cis/1.1/gml&quot; xmlns:sf="http://www.opengis.net/sampling/2.0&quot; xmlns:swe="http://www.opengis.net/swe/2.0&quot; xmlns:omso="http://inspire.ec.europa.eu/schemas/omso/3.0&quot; xsi:schemaLocation="
                        http://www.opengis.net/cis/1.1/gml
                        http://schemas.opengis.net/cis/1.1/gml/cisAll.xsd
                        http://inspire.ec.europa.eu/schemas/omso/3.0
                        http://inspire.ec.europa.eu/schemas/omso/3.0/SpecialisedObservations.xsd
                        http://www.opengis.net/swe/2.0
                        http://schemas.opengis.net/sweCommon/2.0/swe.xsd"&gt;
        <!--<omso:PointTimeSeriesObservation gml:id="o_1">-->
        <gml:description xlink:href="http://seadatanet.maris2.nl/v_cdi_v3/print_xml.asp?n_code=1619169"&gt;
            <!-- Description  -->
            A single series of CTD or STD cast data collected on 17.06.2006
        </gml:description>
        <gml:name>TS profile 527 Cruise 2006209</gml:name>
        <!-- Name -->
        <om:type xlink:href="http://inspire.ec.europa.eu/featureconcept/ProfileObservation"/&gt;
        <om:metadata xlink:href="http://seadatanet.maris2.nl/v_cdi_v3/print_xml.asp?n_code=1619169"/&gt;
        <!-- Type -->
        <om:phenomenonTime>
            <!-- Phenomenon Time -->
            <gml:TimePeriod gml:id="PT_1619169_NTKGAATX">
                <gml:beginPosition>2006-06-17</gml:beginPosition>
                <gml:endPosition>2006-06-17</gml:endPosition>
            </gml:TimePeriod>
        </om:phenomenonTime>
        <om:resultTime>
            <gml:TimeInstant gml:id="RT_1619169_NTKGAATX">
                <gml:timePosition>2006-06-17</gml:timePosition>
            </gml:TimeInstant>
        </om:resultTime>
        <!-- link to the procedure. Still looking to see where this can be taken from in SDN -->
        <om:procedure xlink:href="mySensorML.com"/>
        <!-- Definition of the Observed Property -->
        <om:observedProperty xlink:href="http://vocab.nerc.ac.uk/collection/P01/current/NTKGAATX/"/&gt;
        <om:featureOfInterest>
            <!-- Foi -->
            <sams:SF_SpatialSamplingFeature gml:id="FOI_1619169_NTKGAATX">
                <sf:type xlink:href="http://www.opengis.net/def/samplingFeatureType/OGC-OM/2.0/SF_SamplingPoint"/&gt;
    <!--            <sf:sampledFeature xlink:href="https://sweet.jpl.nasa.gov/2.3/realmOcean.owl#OpenOcean&quot; xlink:title="OpenOcean"/> -->
                <sf:sampledFeature xlink:href="http://vocab.nerc.ac.uk/collection/E01/current/ESS070/"/&gt;
                <sams:shape>
                    <!-- Note: srs is missing from CDI file, gmd:referenceSystemInfo is empty, assuming 4326 -->
                    <gml:Point gml:id="SF_1619169_NTKGAATX" srsName="http://www.opengis.net/def/crs/EPSG/0/4326"&gt;
                        <gml:pos>19.8829 70.9942</gml:pos>
                    </gml:Point>
                </sams:shape>
            </sams:SF_SpatialSamplingFeature>
        </om:featureOfInterest>
        <om:result>
            <!-- Result -->
            <gmlcov:GeneralGridCoverage gml:id="GGC_1619169_NTKGAATX">
                <gmlcov:DomainSet>
                <!-- Note: I can't find a srs for depth,  -->
                <!-- should correspond to the following WKT: CS[vertical,1],AXIS["depth (D)",down,LENGTHUNIT[“metre”,1.0]]  -->
                <!-- Currently improvising with http://www.opengis.net/def/crs/OGC/0/depth -->
                    <gmlcov:GeneralGrid srsName="http://www.opengis.net/def/crs/OGC/0/depth&quot; axisLabels="d">
                        <gmlcov:DisplacementAxisNest axisLabels="d" uomLabels="m">
                            <gmlcov:P>
                                <gmlcov:C>15.3</gmlcov:C>
                                <gmlcov:C>35.1</gmlcov:C>
                                <gmlcov:C>105.5</gmlcov:C>
                                <gmlcov:C>155.7</gmlcov:C>
                                <gmlcov:C>205.9</gmlcov:C>
                                <gmlcov:C>255.9</gmlcov:C>
                                <gmlcov:C>305.9</gmlcov:C>
                                <gmlcov:C>405.6</gmlcov:C>
                                <gmlcov:C>506.1</gmlcov:C>
                                <gmlcov:C>606</gmlcov:C>
                                <gmlcov:C>705.7</gmlcov:C>
                                <gmlcov:C>806.6</gmlcov:C>
                                <gmlcov:C>907.8</gmlcov:C>
                                <gmlcov:C>1007.9</gmlcov:C>
                                <gmlcov:C>1245.1</gmlcov:C>
                                <gmlcov:C>1495.5</gmlcov:C>
                                <gmlcov:C>1747.2</gmlcov:C>
                                <gmlcov:C>1992.5</gmlcov:C>
                                <gmlcov:C>2492.5</gmlcov:C>
                                <gmlcov:C>2980.8</gmlcov:C>
                                <gmlcov:C>3474.7</gmlcov:C>
                                <gmlcov:C>3967.7</gmlcov:C>
                                <gmlcov:C>4550.2</gmlcov:C>
                                <gmlcov:C>4550.3</gmlcov:C>
                            </gmlcov:P>
                        </gmlcov:DisplacementAxisNest>  
                        <gmlcov:GridLimits srsName="http://www.opengis.net/def/crs/OGC/0/Index1D&quot; axisLabels="d">
                            <gmlcov:IndexAxis axisLabel="d" lowerBound="15" upperBound="4551"/>                                
                        </gmlcov:GridLimits>                    
                    </gmlcov:GeneralGrid>
                </gmlcov:DomainSet>
                <gmlcov:RangeSet>
                    <gmlcov:DataBlock>
                        <gmlcov:CV>
                            <gmlcov:V>0.02</gmlcov:V>
                            <gmlcov:V>1.24</gmlcov:V>
                            <gmlcov:V>1.65</gmlcov:V>
                            <gmlcov:V>2.09</gmlcov:V>
                            <gmlcov:V>3.35</gmlcov:V>
                            <gmlcov:V>3.94</gmlcov:V>
                            <gmlcov:V>4.77</gmlcov:V>
                            <gmlcov:V>7.02</gmlcov:V>
                            <gmlcov:V>10.43</gmlcov:V>
                            <gmlcov:V>16.25</gmlcov:V>
                            <gmlcov:V>6.5</gmlcov:V>
                            <gmlcov:V>23.23</gmlcov:V>
                            <gmlcov:V>21.97</gmlcov:V>
                            <gmlcov:V>18.94</gmlcov:V>
                            <gmlcov:V>18.09</gmlcov:V>
                            <gmlcov:V>17.91</gmlcov:V>
                            <gmlcov:V>17.65</gmlcov:V>
                            <gmlcov:V>17.68</gmlcov:V>
                            <gmlcov:V>17.44</gmlcov:V>
                            <gmlcov:V>18.01</gmlcov:V>
                            <gmlcov:V>18.82</gmlcov:V>
                            <gmlcov:V>20.23</gmlcov:V>
                            <gmlcov:V>20.09</gmlcov:V>
                            <gmlcov:V>20.01</gmlcov:V>
                        </gmlcov:CV>
                    </gmlcov:DataBlock>
                </gmlcov:RangeSet>
                <gmlcov:RangeType>
                    <swe:DataRecord>
                        <swe:field name="NTKGAATX">
                            <swe:Quantity definition="http://www.opengis.net/def/dataType/OGC/0/double"&gt;
                                <swe:uom code="umol/kg"/>
                            </swe:Quantity>
                        </swe:field>
                    </swe:DataRecord>
                </gmlcov:RangeType>
            </gmlcov:GeneralGridCoverage>
        </om:result>
    </omso:ProfileObservation>

    O&M ProfileObservation with GeneralGridCoverage from CIS1.1

  • Peter BAUMANN

    Hi Sylvain,

    you mention GW_GeologyLogCoverage. Let me point out that this is not related to OGC's general coverage concept, which is defined by the Coverage Implementation Schema (CIS) standard. As a consequence of the structural incompatibility such "coverages" are not in scope of the Web Coverage Service (WCS) standards suite. Reusing the term "coverage" in this incompatible context actually is an unfortunate misnomer.

    Sorry for not having better news. Still some harmonization miles to make...

    -Peter

     

     

     

  • Ilkka RINNE

    Hi Kathi,

    I already posted this FMI ProfileObservation example once in https://themes.jrc.ec.europa.eu/discussion/view/141542/point-time-series-observation-example (GML example available at https://themes.jrc.ec.europa.eu/file/view/141651/mast-weather-observations-as-a-collection-of-profileobservations). It's about a profile of weather sensor data along a radio mast at different heights.

    Since this implementation is pre-CIS 1.1, we are using gmlcov:MultiPointCoverage with gmlcov:SimpleMultiPoint domain and gml:DataBlock as range. Since we wanted to have the coordinates along the mast starting from the group up, our srsName refers to linear referencing SRS specific for this radio mast: http://xml.fmi.fi/gml/crs/mastSRS.php?id=fmisid-101000

    Ilkka  

     

  • Katharina SCHLEIDT

    By Katharina SCHLEIDT

    O&M profileObservation with ReferenceableGridCoverage from gmlcov

    Hi Ilkka,

    thanks for the example, nice! My only worry is the constraint on profileObservation constraining the result to rectified or referencableGridCoverage, so formally not valid :(

    After yesterday's Coverage Webinar and some subsequent mail ping-pong with the organizers, I've now managed to put together a valid encoding utilizing the ReferenceableGridCoverage from http://www.opengis.net/gmlcov/1.0 together with the ReferenceableGridByArray from http://www.opengis.net/gml/3.3/rgrid

    Result block here inline, entire GML attached

    Thoughts?

    :)

    Kathi

    <gmlcov:ReferenceableGridCoverage gml:id="RGC_1619169_NTKGAATX">
        <gml:gridDomain>
            <gmlrgrid:ReferenceableGridByArray gml:id="RGA_1619169_NTKGAATX" dimension="1" srsName="http://www.opengis.net/def/crs/OGC/0/depth"&gt;
                <gml:limits>
                    <gml:GridEnvelope>
                        <gml:low>15</gml:low>
                        <gml:high>106</gml:high>
                    </gml:GridEnvelope>
                </gml:limits>
                <gml:axisLabels>d</gml:axisLabels>
                <gml:posList>15.3 35.1 105.52</gml:posList>
                <gmlrgrid:sequenceRule axisOrder="+1">Linear</gmlrgrid:sequenceRule>
            </gmlrgrid:ReferenceableGridByArray>
        </gml:gridDomain>
        <gml:rangeSet>
            <gml:ValueArray gml:id="RGVA_1619169_NTKGAATX">
                <gml:valueComponents>
                    <gml:Count>3</gml:Count>
                    <gml:QuantityList uom="umol/kg">0.02 1.24 1.65</gml:QuantityList>
                </gml:valueComponents>
            </gml:ValueArray>
        </gml:rangeSet>
        <gmlcov:rangeType>
            <swe:DataRecord>
                <swe:field name="NTKGAATX">
                    <swe:Quantity definition="http://www.opengis.net/def/dataType/OGC/0/double"&gt;
                        <swe:uom code="umol/kg"/>
                    </swe:Quantity>
                </swe:field>
            </swe:DataRecord>
        </gmlcov:rangeType>
    </gmlcov:ReferenceableGridCoverage>

  • Ilkka RINNE

    Hi Kathi,

    You are correct, the INSPIRE D2.9 O&M Guidelines explicitly states that the value of the result property for omso:ProfileObservation shall be either "RectifiedGridCoverage" or "ReferenceableGridCoverage", so the gmlcov 1.0 MultiPointCoverage in my (pre-CIS 1.1) example would be invalid.

    However, I could not find an clear definition of these in the document, assuming they refer to CIS 1.0 (A.K.A GMLCOV 1.0). This is a bit unfortunate, as I would like to see the INSPIRE guidance using CIS 1.1 rather than CIS 1.0, and with it the easier-to-use coverage descriptions like the GeneralGridCoverage.

    The UML and tables in D2.9 are also a bit confusing now that I'm looking at them, as sometimes the abstract ISO 19123 classes are used (CV_DiscretePointCoverage) and sometimes the concrete GML/CIS XML Schema implementation classes (ReferenceableGridCoverage).

    If we would have used only the ISO 19123 classes in the D2.9 UML and coverage type restrictions ("CV_DiscreteGridPointCoverage" instead of "RectifiedGridCoverage" or "ReferenceableGridCoverage"), we could use either CIS 1.1 GeneralGridCoverage or CIS 1.0 ReferenfeableGridCoverage as the result type. Maybe something to consider for the version 2.1?

    Personally I would try to avoid using the CIS 1.0 or GML 3.3 grid types in documents and examples that would hopefully be future-proof for years to come, as the CIS 1.1 addressed many of the issues faced with CIS 1.0 and GML 3.3 coverages in a neat way. CIS 1.1 is intended to backwards compatible with CIS 1.0 and GML 3.3 grids on the semantic level: all the same functionality is there, even if the exactly same XML structures cannot be used due to namespace and element name changes (correct me Peter Baumann, if I'm misinterpreting something here).

    About the use of the "depth" srsName in the example: As you know, the CRS definition http://www.opengis.net/def/crs/OGC/0/depth does not exist, so we should find something else. The interesting question in sea profile cases is the reference point (datum) for the depth axis?

    Quoting INSPIRE Data Specification in Coordinate Reference Systems version 3.2 (page VII):

    The coordinate reference systems for the expression of the vertical component in marine areas has
    been refined by the Elevation thematic working group of the INSPIRE annex II theme. For depth
    values of the sea floor in marine areas with an appreciable tidal range, depths shall be referenced to
    the Lowest Astronomical Tide (LAT), as has already been mandated by Technical Resolution A2.5 of
    the International Hydrographic Organisation (IHO). In marine areas without an appreciable tidal range,
    in open oceans and effectively in waters deeper than 200 metres (where tide is not measured, since it
    has no significant impact on the accuracy of the sounding), the Mean Sea Level (MSL) or a welldefined
    reference level close to the MSL shall be used as the reference surface.

    So either LAT (http://www.opengis.net/def/crs/EPSG/0/5861) or MSL (http://www.opengis.net/def/crs/EPSG/0/5715) should be used here, I guess. Note, that the LAT datum (http://www.opengis.net/def/datum/EPSG/0/1080) the CRS definition says:

    Users are advised to not use this generic vertical datum but to define explicit realisations of LAT by specifying location and epoch, for instance "LAT at xxx during yyyy-yyyy". 

    Be what may, but both LAT and MSL are listed as "official" INSPIRE coordinate reference systems, so the users of those should be in safe waters [pun intended]. The other question is if the the sea surface (depth 0m) has been recorded as a LAT coordinate at the time of making the measurements. If not, then it would be quite a challenge to bind the depths to a geodetic CRS.

  • Peter BAUMANN

    great discussion! Mind you, we are the maintainers of the OGC CRS resolver, and OGC granted us some freedom - so if you have some (XML) definition of a depth CRS we can add this on short notice.

    Re GML 3.3 etc: We painfully observe now how much difficulties it causes to overload the term "coverage", rather than working on it jointly (W3C, do you hear? ;-) ). In the case of CIS 1.0, it was a rock-solid requirement to remain backwards compatible with GML 3.2.1, and that expresses itself in the Rectified- and ReferenceableGridCoverage model. CIS 1.1 has taken a cautious step to modernize this. (Glad that you like it!)

    Re relative depths: You can consider a bathymetry map as offering 3D, conceptually: x, y, d. In the domainSet you find x and y, in the range Set you can define - as aka cell type - a depth CRS. When evaluating the coverage a tool can make use of [corrected] x,y,d to determine local actual depth. The time parameter might go into metadata, or you define a 4D [corrected] x/y/d/t coverage upfront that happens to have just one time point. If I got all right that has been said here :)

     

  • Ilkka RINNE

    Hi all,

    Recognising that the depth (below sea surface) values for the profile measurements discussed in Kathi's example are probably of more importance than seeing those depth coordinates as MSL values, I'd like to add an example of using GML 3.3 linear referencing to define a measurement-specific srsName for the CIS 1.1 GeneralGridCoverage:

    <cis:GeneralGridCoverage gml:id="GGC_1619169_NTKGAATX">
    	<cis:DomainSet>
    		<cis:GeneralGrid srsName="#SRS_1619169_NTKGAATX" axisLabels="d">
    			<cis:IrregularAxis uomLabel="m" axisLabel="d">
    				<cis:C>15.3</cis:C>
    				<cis:C>35.1</cis:C>
    				<cis:C>105.5</cis:C>
    				<cis:C>155.7</cis:C>
    				<cis:C>205.9</cis:C>
    				<cis:C>255.9</cis:C>
    				<cis:C>305.9</cis:C>
    				<cis:C>405.6</cis:C>
    				<cis:C>506.1</cis:C>
    				<cis:C>606</cis:C>
    				<cis:C>705.7</cis:C>
    				<cis:C>806.6</cis:C>
    				<cis:C>907.8</cis:C>
    				<cis:C>1007.9</cis:C>
    				<cis:C>1245.1</cis:C>
    				<cis:C>1495.5</cis:C>
    				<cis:C>1747.2</cis:C>
    				<cis:C>1992.5</cis:C>
    				<cis:C>2492.5</cis:C>
    				<cis:C>2980.8</cis:C>
    				<cis:C>3474.7</cis:C>
    				<cis:C>3967.7</cis:C>
    				<cis:C>4550.2</cis:C>
    				<cis:C>4550.3</cis:C>
    			</cis:IrregularAxis>				
    		</cis:GeneralGrid>
    	</cis:DomainSet>
    	<cis:RangeSet>
    		<cis:DataBlock>
    			<cis:CV>
    				<cis:V>0.02</cis:V>
    				<cis:V>1.24</cis:V>
    				<cis:V>1.65</cis:V>
    				<cis:V>2.09</cis:V>
    				<cis:V>3.35</cis:V>
    				<cis:V>3.94</cis:V>
    				<cis:V>4.77</cis:V>
    				<cis:V>7.02</cis:V>
    				<cis:V>10.43</cis:V>
    				<cis:V>16.25</cis:V>
    				<cis:V>6.5</cis:V>
    				<cis:V>23.23</cis:V>
    				<cis:V>21.97</cis:V>
    				<cis:V>18.94</cis:V>
    				<cis:V>18.09</cis:V>
    				<cis:V>17.91</cis:V>
    				<cis:V>17.65</cis:V>
    				<cis:V>17.68</cis:V>
    				<cis:V>17.44</cis:V>
    				<cis:V>18.01</cis:V>
    				<cis:V>18.82</cis:V>
    				<cis:V>20.23</cis:V>
    				<cis:V>20.09</cis:V>
    				<cis:V>20.01</cis:V>
    			</cis:CV>
    		</cis:DataBlock>
    	</cis:RangeSet>
    	<cis:RangeType>
    		<swe:DataRecord>
    			<swe:field name="NTKGAATX">
    				<swe:Quantity definition="http://www.opengis.net/def/dataType/OGC/0/double">
    					<swe:uom code="umol/kg"/>
    				</swe:Quantity>
    			</swe:field>
    		</swe:DataRecord>
    	</cis:RangeType>
    	<cis:Metadata>
    		<gmllr:LinearSRS gml:id="SRS_1619169_NTKGAATX">
    			<gml:identifier codeSpace="http://data.sdn.eu/linearsrs">SRS_1619169_NTKGAATX</gml:identifier>
    			<gmllr:linearElement>
    				<gmllr:LinearElement gml:id="LE_1619169_NTKGAATX">
    					<gmllr:curve>
    						<gml:LineString gml:id="PROFILE_1619169_NTKGAATX" srsName="http://www.opengis.net/def/crs/EPSG/0/5715" srsDimension="1">
    							<gml:posList>7.900 5000</gml:posList>
    						</gml:LineString>
    					</gmllr:curve>
    					<gmllr:defaultLRM>
    						<gmllr:LinearReferencingMethod gml:id="LRM-1619169_NTKGAATX">
    							<gmllr:name>chainage</gmllr:name>
    							<gmllr:type>absolute</gmllr:type>
    							<gmllr:units>m</gmllr:units>
    						</gmllr:LinearReferencingMethod>
    					</gmllr:defaultLRM>
    					<gmllr:measure uom="m">1.0</gmllr:measure>
    				</gmllr:LinearElement>
    			</gmllr:linearElement>
    			<gmllr:lrm xlink:href="#LRM-1619169_NTKGAATX"/>
    		</gmllr:LinearSRS>
    	</cis:Metadata>
    </cis:GeneralGridCoverage>
    

    The linearSRS definition is embedded here as the coverage metadata, and it's using MSL to anchor the line defining the "local" SRS to a geodetic coordinates. Here, the point in which the profile has been measured has been set to MSL value 7.9 meters (7.9 above the MSL vertical datum), and it points to a MSL position 5000. Using this as srsName of the GeneralGrid makes it possible to use the depth measurements directly as coordinates of the grid points using the IrregularAxis. At the same time the this would IMHO fulfil the INSPIRE requirement of using known geodetic coordinate reference systems.

  • Katharina SCHLEIDT

    By Katharina SCHLEIDT

    Hi Ilkka,

    many thanks for providing this, you're continuing to confirm my preference for CIS 1.1 as a way of moving forward to the future instead of continuously bowing to various (non-implemented) versions of the past ;)!

    To all - what disadvantages of going straight for CIS 1.1 do you see? Where's the hidden tricky bit? or is it as good as it seems?

    :)

    Kathi

Environmental Monitoring & Observations

Environmental Monitoring & Observations

Environmental Monitoring Facilities, Observations and Measurements