[owslib] 01/03: Imported Upstream version 0.12.0
Johan Van de Wauw
johanvdw-guest at moszumanska.debian.org
Tue Sep 13 19:08:29 UTC 2016
This is an automated email from the git hooks/post-receive script.
johanvdw-guest pushed a commit to branch master
in repository owslib.
commit bc95d6e9c019d7791f0786ffebb28a400114a32d
Author: Johan Van de Wauw <johan at vandewauw.be>
Date: Tue Sep 13 21:00:30 2016 +0200
Imported Upstream version 0.12.0
---
VERSION.txt | 2 +-
docs/en/index.rst | 30 +-
owslib/__init__.py | 2 +-
owslib/csw.py | 6 +
owslib/feature/common.py | 66 +
owslib/feature/wfs100.py | 152 +-
owslib/feature/wfs110.py | 84 +-
owslib/feature/wfs200.py | 172 +-
owslib/namespaces.py | 1 +
owslib/ows.py | 13 +
owslib/swe/observation/om.py | 109 +
owslib/swe/observation/sos200.py | 127 +-
owslib/swe/observation/waterml2.py | 152 +
owslib/util.py | 98 +-
owslib/wfs.py | 25 +-
requirements-dev.txt | 1 +
tests/doctests/csw_pycsw.txt | 2 +
tests/doctests/sos_20_52N_demo.txt | 67 +
tests/doctests/sos_20_bom_gov_au.txt | 46 +
tests/doctests/sos_20_timeseries_decoder_ioos.txt | 57 +
tests/resources/sos_52n_get_observation_ioos.xml | 318 ++
.../sos_52n_get_observation_ioos_wml2.xml | 3216 ++++++++++++++++++++
.../sos_52n_getobservation_wml2_response.xml | 72 +
tox.ini | 2 +-
24 files changed, 4469 insertions(+), 351 deletions(-)
diff --git a/VERSION.txt b/VERSION.txt
index bc859cb..ac454c6 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-0.11.2
+0.12.0
diff --git a/docs/en/index.rst b/docs/en/index.rst
index 4543ee0..8413c7b 100644
--- a/docs/en/index.rst
+++ b/docs/en/index.rst
@@ -64,7 +64,7 @@ Standards Support
+-------------------+---------------------+
| `WMTS`_ | 1.0.0 |
+-------------------+---------------------+
-| `WaterML`_ | 1.0, 1.1 |
+| `WaterML`_ | 1.0, 1.1, 2.0 |
+-------------------+---------------------+
Installation
@@ -97,13 +97,13 @@ Anaconda:
.. note::
- The OWSLib conda packages are **not official** and provided on different conda channels: http://anaconda.org/search?q=type%3Aconda+owslib
+ The OWSLib conda packages are provided by the community, not OSGEO, and therefore there may be
+ multiple packages available. To search all conda channels: http://anaconda.org/search?q=type%3Aconda+owslib
+ However usually conda-forge will be the most up-to-date.
.. code-block:: bash
- $ conda install -c birdhouse owslib
- # or
- $ conda install -c ioos owslib
+ $ conda install -c conda-forge owslib
openSUSE:
@@ -319,8 +319,8 @@ Search for bird data:
>>> csw.results
{'matches': 101, 'nextrecord': 21, 'returned': 20}
>>> for rec in csw.records:
- ... print csw.records[rec].title
- ...
+ ... print(csw.records[rec].title)
+ ...
ALLSPECIES
NatureServe Canada References
Bird Studies Canada - BirdMap WMS
@@ -601,8 +601,8 @@ You can also submit a pre-made request encoded as WPS XML:
Output URL=http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=5103866488472745994OUTPUT.f80e2a78-96a9-4343-9777-be60fac5b256
-SOS
----
+SOS 1.0
+-------
GetCapabilities
@@ -612,6 +612,16 @@ GetObservation
.. include:: ../../tests/doctests/sos_10_ndbc_getobservation.txt
+SOS 2.0
+-------
+Examples of service metadata and GetObservation
+
+.. include:: ../../tests/doctests/sos_20_52n_geoviqua.txt
+
+Using the GetObservation response decoder for O&M and WaterML2.0 results
+
+.. include:: ../../tests/doctests/sos_20_timeseries_decoder_ioos.txt
+
SensorML
--------
.. include:: ../../tests/doctests/sml_ndbc_station.txt
@@ -782,6 +792,8 @@ Credits
.. _`OGC WMC`: http://www.opengeospatial.org/standards/wmc
.. _`OGC WPS`: http://www.opengeospatial.org/standards/wps
.. _`OGC SOS`: http://www.opengeospatial.org/standards/sos
+.. _`OGC O&M`: http://www.opengeospatial.org/standards/om
+.. _`OGC WaterML2.0`: http://www.opengeospatial.org/standards/waterml
.. _`OGC SensorML`: http://www.opengeospatial.org/standards/sensorml
.. _`OGC CSW`: http://www.opengeospatial.org/standards/cat
.. _`OGC WMTS`: http://www.opengeospatial.org/standards/wmts
diff --git a/owslib/__init__.py b/owslib/__init__.py
index 3a3f1dd..e90f0ff 100644
--- a/owslib/__init__.py
+++ b/owslib/__init__.py
@@ -1,3 +1,3 @@
from __future__ import (absolute_import, division, print_function)
-__version__ = '0.11.2'
+__version__ = '0.12.0'
diff --git a/owslib/csw.py b/owslib/csw.py
index ff6f9df..4117963 100644
--- a/owslib/csw.py
+++ b/owslib/csw.py
@@ -104,6 +104,12 @@ class CatalogueServiceWeb(object):
self.operations = []
for elem in self._exml.findall(util.nspath_eval('ows:OperationsMetadata/ows:Operation', namespaces)):
self.operations.append(ows.OperationsMetadata(elem, self.owscommon.namespace))
+ self.constraints = {}
+ for elem in self._exml.findall(util.nspath_eval('ows:OperationsMetadata/ows:Constraint', namespaces)):
+ self.constraints[elem.attrib['name']] = ows.Constraint(elem, self.owscommon.namespace)
+ self.parameters = {}
+ for elem in self._exml.findall(util.nspath_eval('ows:OperationsMetadata/ows:Parameter', namespaces)):
+ self.parameters[elem.attrib['name']] = ows.Parameter(elem, self.owscommon.namespace)
# FilterCapabilities
val = self._exml.find(util.nspath_eval('ogc:Filter_Capabilities', namespaces))
diff --git a/owslib/feature/common.py b/owslib/feature/common.py
new file mode 100644
index 0000000..b082b57
--- /dev/null
+++ b/owslib/feature/common.py
@@ -0,0 +1,66 @@
+import cgi
+from owslib.etree import etree
+from owslib.util import openURL
+
+try:
+ from urllib import urlencode
+except ImportError:
+ from urllib.parse import urlencode
+
+
+
+class WFSCapabilitiesReader(object):
+ """Read and parse capabilities document into a lxml.etree infoset
+ """
+
+ def __init__(self, version='1.0', username=None, password=None):
+ """Initialize"""
+ self.version = version
+ self.username = username
+ self.password = password
+ self._infoset = None
+
+ def capabilities_url(self, service_url):
+ """Return a capabilities url
+ """
+ qs = []
+ if service_url.find('?') != -1:
+ qs = cgi.parse_qsl(service_url.split('?')[1])
+
+ params = [x[0] for x in qs]
+
+ if 'service' not in params:
+ qs.append(('service', 'WFS'))
+ if 'request' not in params:
+ qs.append(('request', 'GetCapabilities'))
+ if 'version' not in params:
+ qs.append(('version', self.version))
+
+ urlqs = urlencode(tuple(qs))
+ return service_url.split('?')[0] + '?' + urlqs
+
+ def read(self, url, timeout=30):
+ """Get and parse a WFS capabilities document, returning an
+ instance of WFSCapabilitiesInfoset
+
+ Parameters
+ ----------
+ url : string
+ The URL to the WFS capabilities document.
+ timeout : number
+ A timeout value (in seconds) for the request.
+ """
+ request = self.capabilities_url(url)
+ u = openURL(request, timeout=timeout,
+ username=self.username, password=self.password)
+ return etree.fromstring(u.read())
+
+ def readString(self, st):
+ """Parse a WFS capabilities document, returning an
+ instance of WFSCapabilitiesInfoset
+
+ string should be an XML capabilities document
+ """
+ if not isinstance(st, str) and not isinstance(st, bytes):
+ raise ValueError("String must be of type string or bytes, not %s" % type(st))
+ return etree.fromstring(st)
diff --git a/owslib/feature/wfs100.py b/owslib/feature/wfs100.py
index 13ebedb..851c414 100644
--- a/owslib/feature/wfs100.py
+++ b/owslib/feature/wfs100.py
@@ -8,7 +8,6 @@
from __future__ import (absolute_import, division, print_function)
-import cgi
from six import PY2
from six.moves import cStringIO as StringIO
try:
@@ -23,6 +22,7 @@ from owslib.crs import Crs
from owslib.namespaces import Namespaces
from owslib.util import log
from owslib.feature.schema import get_schema
+from owslib.feature.common import WFSCapabilitiesReader
import pyproj
@@ -35,7 +35,7 @@ OGC_NAMESPACE = n.get_namespace("ogc")
def nspath(path, ns=WFS_NAMESPACE):
"""
Prefix the given path with the given namespace identifier.
-
+
Parameters
----------
path : string
@@ -57,9 +57,10 @@ class WebFeatureService_1_0_0(object):
Implements IWebFeatureService.
"""
- def __new__(self,url, version, xml, parse_remote_metadata=False, timeout=30):
- """ overridden __new__ method
-
+ def __new__(self,url, version, xml, parse_remote_metadata=False, timeout=30,
+ username=None, password=None):
+ """ overridden __new__ method
+
@type url: string
@param url: url of WFS capabilities document
@type xml: string
@@ -67,69 +68,77 @@ class WebFeatureService_1_0_0(object):
@type parse_remote_metadata: boolean
@param parse_remote_metadata: whether to fully process MetadataURL elements
@param timeout: time (in seconds) after which requests should timeout
+ @param username: service authentication username
+ @param password: service authentication password
@return: initialized WebFeatureService_1_0_0 object
"""
obj=object.__new__(self)
- obj.__init__(url, version, xml, parse_remote_metadata, timeout)
+ obj.__init__(url, version, xml, parse_remote_metadata, timeout,
+ username=username, password=password)
return obj
-
+
def __getitem__(self,name):
''' check contents dictionary to allow dict like access to service layers'''
if name in self.__getattribute__('contents').keys():
return self.__getattribute__('contents')[name]
else:
raise KeyError("No content named %s" % name)
-
-
- def __init__(self, url, version, xml=None, parse_remote_metadata=False, timeout=30):
+
+
+ def __init__(self, url, version, xml=None, parse_remote_metadata=False, timeout=30,
+ username=None, password=None):
"""Initialize."""
self.url = url
self.version = version
self.timeout = timeout
+ self.username = username
+ self.password = password
self._capabilities = None
- reader = WFSCapabilitiesReader(self.version)
+ reader = WFSCapabilitiesReader(self.version, self.username, self.password)
if xml:
self._capabilities = reader.readString(xml)
else:
self._capabilities = reader.read(self.url)
self._buildMetadata(parse_remote_metadata)
-
+
+
def _buildMetadata(self, parse_remote_metadata=False):
'''set up capabilities metadata objects: '''
-
+
#serviceIdentification metadata
serviceelem=self._capabilities.find(nspath('Service'))
- self.identification=ServiceIdentification(serviceelem, self.version)
-
+ self.identification=ServiceIdentification(serviceelem, self.version)
+
#serviceProvider metadata
- self.provider=ServiceProvider(serviceelem)
-
- #serviceOperations metadata
+ self.provider=ServiceProvider(serviceelem)
+
+ #serviceOperations metadata
self.operations=[]
for elem in self._capabilities.find(nspath('Capability/Request'))[:]:
self.operations.append(OperationMetadata(elem))
-
- #serviceContents metadata: our assumption is that services use a top-level
- #layer as a metadata organizer, nothing more.
-
- self.contents={}
+
+ #serviceContents metadata: our assumption is that services use a top-level
+ #layer as a metadata organizer, nothing more.
+
+ self.contents={}
featuretypelist=self._capabilities.find(nspath('FeatureTypeList'))
features = self._capabilities.findall(nspath('FeatureTypeList/FeatureType'))
for feature in features:
cm=ContentMetadata(feature, featuretypelist, parse_remote_metadata)
- self.contents[cm.id]=cm
-
+ self.contents[cm.id]=cm
+
#exceptions
self.exceptions = [f.text for f \
in self._capabilities.findall('Capability/Exception/Format')]
-
+
def getcapabilities(self):
- """Request and return capabilities document from the WFS as a
+ """Request and return capabilities document from the WFS as a
file-like object.
NOTE: this is effectively redundant now"""
reader = WFSCapabilitiesReader(self.version)
- return openURL(reader.capabilities_url(self.url), timeout=self.timeout)
-
+ return openURL(reader.capabilities_url(self.url), timeout=self.timeout,
+ username=self.username, password=self.password)
+
def items(self):
'''supports dict-like items() access'''
items=[]
@@ -153,12 +162,12 @@ class WebFeatureService_1_0_0(object):
srsname=None, outputFormat=None, method='{http://www.opengis.net/wfs}Get',
startindex=None):
"""Request and return feature data as a file-like object.
-
+
Parameters
----------
typename : list
List of typenames (string)
- filter : string
+ filter : string
XML-encoded OGC filter expression.
bbox : tuple
(left, bottom, right, top) in the feature type's coordinates.
@@ -179,7 +188,7 @@ class WebFeatureService_1_0_0(object):
startindex: int (optional)
Start position to return feature set (paging in combination with maxfeatures)
-
+
There are 3 different modes of use
1) typename and bbox (simple spatial query)
@@ -199,13 +208,13 @@ class WebFeatureService_1_0_0(object):
request['bbox'] = ','.join([repr(x) for x in bbox])
elif filter and typename:
request['filter'] = str(filter)
-
+
if srsname:
request['srsname'] = str(srsname)
-
+
assert len(typename) > 0
request['typename'] = ','.join(typename)
-
+
if propertyname is not None:
if not isinstance(propertyname, list):
propertyname = [propertyname]
@@ -220,9 +229,10 @@ class WebFeatureService_1_0_0(object):
data = urlencode(request)
log.debug("Making request: %s?%s" % (base_url, data))
- u = openURL(base_url, data, method, timeout=self.timeout)
-
-
+ u = openURL(base_url, data, method, timeout=self.timeout,
+ username=self.username, password=self.password)
+
+
# check for service exceptions, rewrap, and return
# We're going to assume that anything with a content-length > 32k
# is data. We'll check anything smaller.
@@ -268,12 +278,12 @@ class WebFeatureService_1_0_0(object):
"""
return get_schema(self.url, typename, self.version)
-
+
class ServiceIdentification(object):
''' Implements IServiceIdentificationMetadata '''
-
+
def __init__(self, infoset, version):
self._root=infoset
self.type = testXMLValue(self._root.find(nspath('Name')))
@@ -294,7 +304,7 @@ class ServiceProvider(object):
class ContentMetadata:
"""Abstraction for WFS metadata.
-
+
Implements IMetadata.
"""
@@ -314,7 +324,7 @@ class ContentMetadata:
self.boundingBox = (float(b.attrib['minx']),float(b.attrib['miny']),
float(b.attrib['maxx']), float(b.attrib['maxy']), Crs(srs.text))
- # transform wgs84 bbox from given default bboxt
+ # transform wgs84 bbox from given default bboxt
self.boundingBoxWGS84 = None
if b is not None and srs is not None:
@@ -340,7 +350,7 @@ class ContentMetadata:
self.verbOptions + [op.tag for op \
in elem.findall(nspath('Operations/*')) \
if op.tag not in self.verbOptions]
-
+
#others not used but needed for iContentMetadata harmonisation
self.styles=None
self.timepositions=None
@@ -372,7 +382,7 @@ class ContentMetadata:
class OperationMetadata:
"""Abstraction for WFS metadata.
-
+
Implements IMetadata.
"""
def __init__(self, elem):
@@ -384,57 +394,3 @@ class OperationMetadata:
for verb in elem.findall(nspath('DCPType/HTTP/*')):
url = verb.attrib['onlineResource']
self.methods.append({'type' : xmltag_split(verb.tag), 'url': url})
-
-
-class WFSCapabilitiesReader(object):
- """Read and parse capabilities document into a lxml.etree infoset
- """
-
- def __init__(self, version='1.0'):
- """Initialize"""
- self.version = version
- self._infoset = None
-
- def capabilities_url(self, service_url):
- """Return a capabilities url
- """
- qs = []
- if service_url.find('?') != -1:
- qs = cgi.parse_qsl(service_url.split('?')[1])
-
- params = [x[0] for x in qs]
-
- if 'service' not in params:
- qs.append(('service', 'WFS'))
- if 'request' not in params:
- qs.append(('request', 'GetCapabilities'))
- if 'version' not in params:
- qs.append(('version', self.version))
-
- urlqs = urlencode(tuple(qs))
- return service_url.split('?')[0] + '?' + urlqs
-
- def read(self, url, timeout=30):
- """Get and parse a WFS capabilities document, returning an
- instance of WFSCapabilitiesInfoset
-
- Parameters
- ----------
- url : string
- The URL to the WFS capabilities document.
- timeout : number
- A timeout value (in seconds) for the request.
- """
- request = self.capabilities_url(url)
- u = openURL(request, timeout=timeout)
- return etree.fromstring(u.read())
-
- def readString(self, st):
- """Parse a WFS capabilities document, returning an
- instance of WFSCapabilitiesInfoset
-
- string should be an XML capabilities document
- """
- if not isinstance(st, str) and not isinstance(st, bytes):
- raise ValueError("String must be of type string or bytes, not %s" % type(st))
- return etree.fromstring(st)
diff --git a/owslib/feature/wfs110.py b/owslib/feature/wfs110.py
index 5dd9e4e..963ce11 100644
--- a/owslib/feature/wfs110.py
+++ b/owslib/feature/wfs110.py
@@ -1,4 +1,4 @@
-# -*- coding: ISO-8859-15 -*-
+# -*- coding: utf-8 -*-
# =============================================================================
# Copyright (c) 2011 Tom Kralidis
#
@@ -9,7 +9,6 @@
from __future__ import (absolute_import, division, print_function)
-import cgi
from six import PY2
from six.moves import cStringIO as StringIO
try:
@@ -24,9 +23,11 @@ from owslib.ows import *
from owslib.fes import *
from owslib.crs import Crs
from owslib.feature import WebFeatureService_
+from owslib.feature.common import WFSCapabilitiesReader
from owslib.namespaces import Namespaces
from owslib.util import log
+
def get_namespaces():
n = Namespaces()
return n.get_namespaces(["gml","ogc","ows","wfs"])
@@ -37,7 +38,8 @@ class WebFeatureService_1_1_0(WebFeatureService_):
Implements IWebFeatureService.
"""
- def __new__(self,url, version, xml, parse_remote_metadata=False, timeout=30):
+ def __new__(self,url, version, xml, parse_remote_metadata=False, timeout=30,
+ username=None, password=None):
""" overridden __new__ method
@type url: string
@@ -47,10 +49,13 @@ class WebFeatureService_1_1_0(WebFeatureService_):
@type parse_remote_metadata: boolean
@param parse_remote_metadata: whether to fully process MetadataURL elements
@param timeout: time (in seconds) after which requests should timeout
+ @param username: service authentication username
+ @param password: service authentication password
@return: initialized WebFeatureService_1_1_0 object
"""
obj=object.__new__(self)
- obj.__init__(url, version, xml, parse_remote_metadata, timeout)
+ obj.__init__(url, version, xml, parse_remote_metadata, timeout,
+ username=username, password=password)
return obj
def __getitem__(self,name):
@@ -61,11 +66,14 @@ class WebFeatureService_1_1_0(WebFeatureService_):
raise KeyError("No content named %s" % name)
- def __init__(self, url, version, xml=None, parse_remote_metadata=False, timeout=30):
+ def __init__(self, url, version, xml=None, parse_remote_metadata=False, timeout=30,
+ username=None, password=None):
"""Initialize."""
self.url = url
self.version = version
self.timeout = timeout
+ self.username = username
+ self.password = password
self._capabilities = None
self.owscommon = OwsCommon('1.0.0')
reader = WFSCapabilitiesReader(self.version)
@@ -88,6 +96,12 @@ class WebFeatureService_1_1_0(WebFeatureService_):
self.operations=[]
for elem in self._capabilities.findall(util.nspath_eval('ows:OperationsMetadata/ows:Operation', namespaces)):
self.operations.append(OperationsMetadata(elem, self.owscommon.namespace))
+ self.constraints = {}
+ for elem in self._capabilities.findall(util.nspath_eval('ows:OperationsMetadata/ows:Constraint', namespaces)):
+ self.constraints[elem.attrib['name']] = Constraint(elem, self.owscommon.namespace)
+ self.parameters = {}
+ for elem in self._capabilities.findall(util.nspath_eval('ows:OperationsMetadata/ows:Parameter', namespaces)):
+ self.parameters[elem.attrib['name']] = Parameter(elem, self.owscommon.namespace)
# FilterCapabilities
val = self._capabilities.find(util.nspath_eval('ogc:Filter_Capabilities', namespaces))
@@ -111,7 +125,8 @@ class WebFeatureService_1_1_0(WebFeatureService_):
file-like object.
NOTE: this is effectively redundant now"""
reader = WFSCapabilitiesReader(self.version)
- return openURL(reader.capabilities_url(self.url), timeout=self.timeout)
+ return openURL(reader.capabilities_url(self.url), timeout=self.timeout,
+ username=self.username, password=self.password)
def items(self):
'''supports dict-like items() access'''
@@ -222,7 +237,8 @@ class WebFeatureService_1_1_0(WebFeatureService_):
data = urlencode(request)
log.debug("Making request: %s?%s" % (base_url, data))
- u = openURL(base_url, data, method, timeout=self.timeout)
+ u = openURL(base_url, data, method, timeout=self.timeout,
+ username=self.username, password=self.password)
# check for service exceptions, rewrap, and return
# We're going to assume that anything with a content-length > 32k
@@ -324,57 +340,3 @@ class ContentMetadata:
self.styles=None
self.timepositions=None
self.defaulttimeposition=None
-
-class WFSCapabilitiesReader(object):
- """Read and parse capabilities document into a lxml.etree infoset
- """
-
- def __init__(self, version='1.0'):
- """Initialize"""
- self.version = version
- self._infoset = None
-
- def capabilities_url(self, service_url):
- """Return a capabilities url
- """
- qs = []
- if service_url.find('?') != -1:
- qs = cgi.parse_qsl(service_url.split('?')[1])
-
- params = [x[0] for x in qs]
-
- if 'service' not in params:
- qs.append(('service', 'WFS'))
- if 'request' not in params:
- qs.append(('request', 'GetCapabilities'))
- if 'version' not in params:
- qs.append(('version', self.version))
-
- urlqs = urlencode(tuple(qs))
- return service_url.split('?')[0] + '?' + urlqs
-
- def read(self, url, timeout=30):
- """Get and parse a WFS capabilities document, returning an
- instance of WFSCapabilitiesInfoset
-
- Parameters
- ----------
- url : string
- The URL to the WFS capabilities document.
- timeout : number
- A timeout value (in seconds) for the request.
- """
- request = self.capabilities_url(url)
- u = openURL(request, timeout=timeout)
- return etree.fromstring(u.read())
-
- def readString(self, st):
- """Parse a WFS capabilities document, returning an
- instance of WFSCapabilitiesInfoset
-
- string should be an XML capabilities document
- """
- if not isinstance(st, str) and not isinstance(st, bytes):
- raise ValueError("String must be of type string or bytes, not %s" % type(st))
- return etree.fromstring(st)
-
diff --git a/owslib/feature/wfs200.py b/owslib/feature/wfs200.py
index afc0fef..9112355 100644
--- a/owslib/feature/wfs200.py
+++ b/owslib/feature/wfs200.py
@@ -14,10 +14,10 @@ from owslib.etree import etree
from owslib.util import nspath, testXMLValue, openURL
from owslib.crs import Crs
from owslib.feature import WebFeatureService_
+from owslib.feature.common import WFSCapabilitiesReader
from owslib.namespaces import Namespaces
#other imports
-import cgi
from six import PY2
from six.moves import cStringIO as StringIO
try:
@@ -45,9 +45,10 @@ class WebFeatureService_2_0_0(WebFeatureService_):
Implements IWebFeatureService.
"""
- def __new__(self,url, version, xml, parse_remote_metadata=False, timeout=30):
- """ overridden __new__ method
-
+ def __new__(self,url, version, xml, parse_remote_metadata=False, timeout=30,
+ username=None, password=None):
+ """ overridden __new__ method
+
@type url: string
@param url: url of WFS capabilities document
@type xml: string
@@ -55,27 +56,33 @@ class WebFeatureService_2_0_0(WebFeatureService_):
@type parse_remote_metadata: boolean
@param parse_remote_metadata: whether to fully process MetadataURL elements
@param timeout: time (in seconds) after which requests should timeout
+ @param username: service authentication username
+ @param password: service authentication password
@return: initialized WebFeatureService_2_0_0 object
"""
obj=object.__new__(self)
- obj.__init__(url, version, xml, parse_remote_metadata, timeout)
+ obj.__init__(url, version, xml, parse_remote_metadata, timeout,
+ username=username, password=password)
return obj
-
+
def __getitem__(self,name):
''' check contents dictionary to allow dict like access to service layers'''
if name in self.__getattribute__('contents').keys():
return self.__getattribute__('contents')[name]
else:
raise KeyError("No content named %s" % name)
-
-
- def __init__(self, url, version, xml=None, parse_remote_metadata=False, timeout=30):
+
+
+ def __init__(self, url, version, xml=None, parse_remote_metadata=False, timeout=30,
+ username=None, password=None):
"""Initialize."""
if log.isEnabledFor(logging.DEBUG):
log.debug('building WFS %s'%url)
self.url = url
self.version = version
self.timeout = timeout
+ self.username = username
+ self.password = password
self._capabilities = None
reader = WFSCapabilitiesReader(self.version)
if xml:
@@ -83,56 +90,63 @@ class WebFeatureService_2_0_0(WebFeatureService_):
else:
self._capabilities = reader.read(self.url)
self._buildMetadata(parse_remote_metadata)
-
+
def _buildMetadata(self, parse_remote_metadata=False):
'''set up capabilities metadata objects: '''
-
+
#serviceIdentification metadata
serviceidentelem=self._capabilities.find(nspath('ServiceIdentification'))
- self.identification=ServiceIdentification(serviceidentelem)
+ self.identification=ServiceIdentification(serviceidentelem)
#need to add to keywords list from featuretypelist information:
featuretypelistelem=self._capabilities.find(nspath('FeatureTypeList', ns=WFS_NAMESPACE))
featuretypeelems=featuretypelistelem.findall(nspath('FeatureType', ns=WFS_NAMESPACE))
- for f in featuretypeelems:
+ for f in featuretypeelems:
kwds=f.findall(nspath('Keywords/Keyword',ns=OWS_NAMESPACE))
if kwds is not None:
for kwd in kwds[:]:
if kwd.text not in self.identification.keywords:
self.identification.keywords.append(kwd.text)
-
-
+
+
#TODO: update serviceProvider metadata, miss it out for now
serviceproviderelem=self._capabilities.find(nspath('ServiceProvider'))
- self.provider=ServiceProvider(serviceproviderelem)
-
- #serviceOperations metadata
+ self.provider=ServiceProvider(serviceproviderelem)
+
+ #serviceOperations metadata
self.operations=[]
-
+
for elem in self._capabilities.find(nspath('OperationsMetadata'))[:]:
if elem.tag !=nspath('ExtendedCapabilities'):
self.operations.append(OperationsMetadata(elem))
-
- #serviceContents metadata: our assumption is that services use a top-level
- #layer as a metadata organizer, nothing more.
-
- self.contents={}
+ self.constraints = {}
+ for elem in self._capabilities.findall(nspath('OperationsMetadata/Constraint', ns=WFS_NAMESPACE)):
+ self.constraints[elem.attrib['name']] = Constraint(elem, self.owscommon.namespace)
+ self.parameters = {}
+ for elem in self._capabilities.findall(nspath('OperationsMetadata/Parameter', ns=WFS_NAMESPACE)):
+ self.parameters[elem.attrib['name']] = Parameter(elem, self.owscommon.namespace)
+
+ #serviceContents metadata: our assumption is that services use a top-level
+ #layer as a metadata organizer, nothing more.
+
+ self.contents={}
featuretypelist=self._capabilities.find(nspath('FeatureTypeList',ns=WFS_NAMESPACE))
features = self._capabilities.findall(nspath('FeatureTypeList/FeatureType', ns=WFS_NAMESPACE))
for feature in features:
cm=ContentMetadata(feature, featuretypelist, parse_remote_metadata)
- self.contents[cm.id]=cm
-
+ self.contents[cm.id]=cm
+
#exceptions
self.exceptions = [f.text for f \
in self._capabilities.findall('Capability/Exception/Format')]
-
+
def getcapabilities(self):
- """Request and return capabilities document from the WFS as a
+ """Request and return capabilities document from the WFS as a
file-like object.
NOTE: this is effectively redundant now"""
reader = WFSCapabilitiesReader(self.version)
- return openURL(reader.capabilities_url(self.url), timeout=self.timeout)
-
+ return openURL(reader.capabilities_url(self.url), timeout=self.timeout,
+ username=self.username, password=self.password)
+
def items(self):
'''supports dict-like items() access'''
items=[]
@@ -160,7 +174,7 @@ class WebFeatureService_2_0_0(WebFeatureService_):
----------
typename : list
List of typenames (string)
- filter : string
+ filter : string
XML-encoded OGC filter expression.
bbox : tuple
(left, bottom, right, top) in the feature type's coordinates == (minx, miny, maxx, maxy)
@@ -201,7 +215,8 @@ class WebFeatureService_2_0_0(WebFeatureService_):
# If method is 'Post', data will be None here
- u = openURL(url, data, method, timeout=self.timeout)
+ u = openURL(url, data, method, timeout=self.timeout,
+ username=self.username, password=self.password)
# check for service exceptions, rewrap, and return
# We're going to assume that anything with a content-length > 32k
@@ -244,9 +259,9 @@ class WebFeatureService_2_0_0(WebFeatureService_):
request = {'service': 'WFS', 'version': self.version, 'request': 'GetPropertyValue'}
if query:
request['query'] = str(query)
- if valuereference:
+ if valuereference:
request['valueReference'] = str(valuereference)
- if storedquery_id:
+ if storedquery_id:
request['storedQuery_id'] = str(storedquery_id)
if typename:
request['typename']=str(typename)
@@ -254,17 +269,18 @@ class WebFeatureService_2_0_0(WebFeatureService_):
for kw in kwargs.keys():
request[kw]=str(kwargs[kw])
encoded_request=urlencode(request)
- u = openURL(base_url + encoded_request)
+ u = openURL(base_url + encoded_request, timeout=self.timeout,
+ username=self.username, password=self.password)
return u.read()
-
-
+
+
def _getStoredQueries(self):
''' gets descriptions of the stored queries available on the server '''
sqs=[]
#This method makes two calls to the WFS - one ListStoredQueries, and one DescribeStoredQueries. The information is then
#aggregated in 'StoredQuery' objects
method=nspath('Get')
-
+
#first make the ListStoredQueries response and save the results in a dictionary if form {storedqueryid:(title, returnfeaturetype)}
try:
base_url = next((m.get('url') for m in self.getOperationByName('ListStoredQueries').methods if m.get('type').lower() == method.lower()))
@@ -273,9 +289,10 @@ class WebFeatureService_2_0_0(WebFeatureService_):
request = {'service': 'WFS', 'version': self.version, 'request': 'ListStoredQueries'}
encoded_request = urlencode(request)
- u = openURL(base_url, data=encoded_request, timeout=self.timeout)
+ u = openURL(base_url, data=encoded_request, timeout=self.timeout,
+ username=self.username, password=self.password)
tree=etree.fromstring(u.read())
- tempdict={}
+ tempdict={}
for sqelem in tree[:]:
title=rft=id=None
id=sqelem.get('id')
@@ -285,17 +302,18 @@ class WebFeatureService_2_0_0(WebFeatureService_):
elif elem.tag==nspath('ReturnFeatureType', WFS_NAMESPACE):
rft=elem.text
tempdict[id]=(title,rft) #store in temporary dictionary
-
- #then make the DescribeStoredQueries request and get the rest of the information about the stored queries
+
+ #then make the DescribeStoredQueries request and get the rest of the information about the stored queries
try:
base_url = next((m.get('url') for m in self.getOperationByName('DescribeStoredQueries').methods if m.get('type').lower() == method.lower()))
except StopIteration:
base_url = self.url
request = {'service': 'WFS', 'version': self.version, 'request': 'DescribeStoredQueries'}
encoded_request = urlencode(request)
- u = openURL(base_url, data=encoded_request, timeout=self.timeout)
+ u = openURL(base_url, data=encoded_request, timeout=self.timeout,
+ username=self.username, password=self.password)
tree=etree.fromstring(u.read())
- tempdict2={}
+ tempdict2={}
for sqelem in tree[:]:
params=[] #list to store parameters for the stored query description
id =sqelem.get('id')
@@ -307,7 +325,7 @@ class WebFeatureService_2_0_0(WebFeatureService_):
newparam=Parameter(elem.get('name'), elem.get('type'))
params.append(newparam)
tempdict2[id]=(abstract, params) #store in another temporary dictionary
-
+
#now group the results into StoredQuery objects:
for key in tempdict.keys():
sqs.append(StoredQuery(key, tempdict[key][0], tempdict[key][1], tempdict2[key][0], tempdict2[key][1]))
@@ -329,16 +347,16 @@ class StoredQuery(object):
self.returnfeaturetype=returntype
self.abstract=abstract
self.parameters=parameters
-
+
class Parameter(object):
def __init__(self, name, type):
self.name=name
self.type=type
-
-
+
+
class ContentMetadata:
"""Abstraction for WFS metadata.
-
+
Implements IMetadata.
"""
@@ -383,7 +401,7 @@ class ContentMetadata:
self.verbOptions + [op.tag for op \
in elem.findall(nspath('Operations/*',ns=WFS_NAMESPACE)) \
if op.tag not in self.verbOptions]
-
+
#others not used but needed for iContentMetadata harmonisation
self.styles=None
self.timepositions=None
@@ -410,57 +428,3 @@ class ContentMetadata:
metadataUrl['metadata'] = None
self.metadataUrls.append(metadataUrl)
-
-
-class WFSCapabilitiesReader(object):
- """Read and parse capabilities document into a lxml.etree infoset
- """
-
- def __init__(self, version='2.0.0'):
- """Initialize"""
- self.version = version
- self._infoset = None
-
- def capabilities_url(self, service_url):
- """Return a capabilities url
- """
- qs = []
- if service_url.find('?') != -1:
- qs = cgi.parse_qsl(service_url.split('?')[1])
-
- params = [x[0] for x in qs]
-
- if 'service' not in params:
- qs.append(('service', 'WFS'))
- if 'request' not in params:
- qs.append(('request', 'GetCapabilities'))
- if 'version' not in params:
- qs.append(('version', self.version))
-
- urlqs = urlencode(tuple(qs))
- return service_url.split('?')[0] + '?' + urlqs
-
- def read(self, url, timeout=30):
- """Get and parse a WFS capabilities document, returning an
- instance of WFSCapabilitiesInfoset
-
- Parameters
- ----------
- url : string
- The URL to the WFS capabilities document.
- timeout : number
- A timeout value (in seconds) for the request.
- """
- request = self.capabilities_url(url)
- u = openURL(request, timeout=timeout)
- return etree.fromstring(u.read())
-
- def readString(self, st):
- """Parse a WFS capabilities document, returning an
- instance of WFSCapabilitiesInfoset
-
- string should be an XML capabilities document
- """
- if not isinstance(st, str) and not isinstance(st, bytes):
- raise ValueError("String must be of type string or bytes, not %s" % type(st))
- return etree.fromstring(st)
diff --git a/owslib/namespaces.py b/owslib/namespaces.py
index 830f4fa..d87cd09 100644
--- a/owslib/namespaces.py
+++ b/owslib/namespaces.py
@@ -49,6 +49,7 @@ class Namespaces(object):
'swe20' : 'http://www.opengis.net/swe/2.0',
'swes' : 'http://www.opengis.net/swes/2.0',
'tml' : 'ttp://www.opengis.net/tml',
+ 'wml2' : 'http://www.opengis.net/waterml/2.0',
'wfs' : 'http://www.opengis.net/wfs',
'wfs20' : 'http://www.opengis.net/wfs/2.0',
'wcs' : 'http://www.opengis.net/wcs',
diff --git a/owslib/ows.py b/owslib/ows.py
index f92ffcb..eb4cf9d 100644
--- a/owslib/ows.py
+++ b/owslib/ows.py
@@ -161,6 +161,19 @@ class Constraint(object):
return "Constraint: %s" % self.name
+class Parameter(object):
+ def __init__(self, elem, namespace=DEFAULT_OWS_NAMESPACE):
+ self.name = elem.attrib.get('name')
+ self.values = [i.text for i in elem.findall(util.nspath('Value', namespace))]
+ self.values += [i.text for i in elem.findall(util.nspath('AllowedValues/Value', namespace))]
+
+ def __repr__(self):
+ if self.values:
+ return "Parameter: %s - %s" % (self.name, self.values)
+ else:
+ return "Parameter: %s" % self.name
+
+
class OperationsMetadata(object):
"""Initialize an OWS OperationMetadata construct"""
def __init__(self, elem, namespace=DEFAULT_OWS_NAMESPACE):
diff --git a/owslib/swe/observation/om.py b/owslib/swe/observation/om.py
new file mode 100644
index 0000000..1196bde
--- /dev/null
+++ b/owslib/swe/observation/om.py
@@ -0,0 +1,109 @@
+# -*- coding: ISO-8859-15 -*-
+# =============================================================================
+# Copyright (c) 2014 Pete Taylor
+#
+# Authors : Pete Taylor <peterataylor at gmail.com>
+#
+# Contact email: peterataylor at gmail.com
+# =============================================================================
+
+from owslib.util import nspath_eval, extract_time
+from owslib.namespaces import Namespaces
+from owslib.util import testXMLAttribute, testXMLValue
+
+def get_namespaces():
+ ns = Namespaces()
+ return ns.get_namespaces(["swe20", "xlink", "sos20", "om20", "gml32",
+ "xsi"])
+namespaces = get_namespaces()
+
+def nspv(path):
+ return nspath_eval(path, namespaces)
+
+class TimePeriod(object):
+ ''' Basic class for gml TimePeriod '''
+ def __init__(self, start, end):
+ self.start = start
+ self.end = end
+ def __str__(self):
+ return ("start: " + str(self.start) + " " +
+ "end: " + str(self.end))
+
+class OM_Observation(object):
+ ''' The base OM_Observation type, of which there may be many
+ specialisations, e.g. MesaurementObservation, SWE Observation, WML2 etc.
+ Currently assumes that many properties are xlink only (not inline).
+ '''
+ def __init__(self, element):
+ self.type = testXMLAttribute(element.find(nspv(
+ "om20:type")), nspv("xlink:href"))
+
+ self.featureOfInterest = testXMLAttribute(element.find(nspv(
+ "om20:featureOfInterest")), nspv("xlink:href"))
+
+ self.observedProperty = testXMLAttribute(element.find(nspv(
+ "om20:observedProperty")), nspv("xlink:href"))
+
+ self.procedure = testXMLAttribute(element.find(nspv(
+ "om20:procedure")), nspv("xlink:href"))
+
+ ''' Determine if phenom time is instant or a period. This
+ depend on the type of observation -- this could be split out '''
+ instant_element = element.find(nspv(
+ "om20:phenomenonTime/gml32:TimeInstant"))
+
+ if instant_element is not None:
+ self.phenomenonTime = extract_time(instant_element)
+ else:
+ start = extract_time(element.find(nspv(
+ "om20:phenomenonTime/gml32:TimePeriod/gml32:beginPosition")))
+ end = extract_time(element.find(nspv(
+ "om20:phenomenonTime/gml32:TimePeriod/gml32:endPosition")))
+ self.phenomenonTime = TimePeriod(start, end)
+
+ self.resultTime = extract_time(element.find(nspv(
+ "om20:resultTime/gml32:TimeInstant/gml32:timePosition")))
+
+ self.result = element.find(nspv("om20:result"))
+
+ def get_result(self):
+ ''' This will handle different result types using specialised
+ observation types '''
+ return self.result
+
+class MeasurementObservation(OM_Observation):
+ ''' Specialised observation type that has a measurement (value + uom)
+ as result type
+ '''
+ def __init__(self, element):
+ super(MeasurementObservation, self).__init__(element)
+ self._parse_result()
+
+ def _parse_result(self):
+ ''' Parse the result property, extracting the value
+ and unit of measure '''
+ if self.result is not None:
+ uom = testXMLAttribute(self.result, "uom")
+ value_str = testXMLValue(self.result)
+ try:
+ value = float(value_str)
+ except:
+ raise ValueError("Error parsing measurement value")
+ self.result = Measurement(value, uom)
+
+ def get_result(self):
+ return self.result
+
+class Result(object):
+ ''' Base class for different OM_Observation result types '''
+ def __init__(self, element):
+ pass
+
+class Measurement(Result):
+ ''' A single measurement (value + uom) '''
+ def __init__(self, value, uom):
+ super(Measurement, self).__init__(None)
+ self.value = value
+ self.uom = uom
+ def __str__(self):
+ return str(self.value) + "(" + self.uom + ")"
diff --git a/owslib/swe/observation/sos200.py b/owslib/swe/observation/sos200.py
index 4894908..6c86a03 100644
--- a/owslib/swe/observation/sos200.py
+++ b/owslib/swe/observation/sos200.py
@@ -2,20 +2,22 @@ from __future__ import (absolute_import, division, print_function)
import cgi
from owslib.etree import etree
-from datetime import datetime
-try: # Python 3
- from urllib.parse import urlencode
-except ImportError: # Python 2
- from urllib import urlencode
+try:
+ from urllib.parse import urlencode # Python 3
+except ImportError:
+ from urllib import urlencode # Python 2
from owslib import ows
from owslib.crs import Crs
from owslib.fes import FilterCapabilities200
-from owslib.util import openURL, testXMLValue, nspath_eval, nspath, extract_time
+from owslib.util import openURL, testXMLValue, testXMLAttribute, nspath_eval, extract_time
from owslib.namespaces import Namespaces
+from owslib.swe.observation.om import MeasurementObservation
+from owslib.swe.observation.waterml2 import MeasurementTimeseriesObservation
+
def get_namespaces():
n = Namespaces()
- ns = n.get_namespaces(["fes","ogc","om","gml32","sa","sml","swe20","swes","xlink"])
+ ns = n.get_namespaces(["fes", "ogc", "xsi", "om20", "gml32", "sa", "sml", "swe20", "swes", "xlink"])
ns["ows"] = n.get_namespace("ows110")
ns["sos"] = n.get_namespace("sos20")
return ns
@@ -29,13 +31,13 @@ class SensorObservationService_2_0_0(object):
Implements ISensorObservationService.
"""
- def __new__(self,url, version, xml=None, username=None, password=None):
+ def __new__(self, url, version, xml=None, username=None, password=None):
"""overridden __new__ method"""
- obj=object.__new__(self)
+ obj = object.__new__(self)
obj.__init__(url, version, xml, username, password)
return obj
- def __getitem__(self,id):
+ def __getitem__(self, id):
''' check contents dictionary to allow dict like access to service observational offerings'''
if id in self.__getattribute__('contents').keys():
return self.__getattribute__('contents')[id]
@@ -87,7 +89,7 @@ class SensorObservationService_2_0_0(object):
self.provider = ows.ServiceProvider(service_provider_element)
# ows:OperationsMetadata metadata
- self.operations= []
+ self.operations = []
for elem in self._capabilities.findall(nspath_eval('ows:OperationsMetadata/ows:Operation', namespaces)):
self.operations.append(ows.OperationsMetadata(elem))
@@ -106,10 +108,14 @@ class SensorObservationService_2_0_0(object):
self.contents[off.id] = off
self.offerings.append(off)
- def describe_sensor(self, outputFormat=None,
- procedure=None,
- method='Get',
- **kwargs):
+ self.observed_properties = []
+ for op in self._capabilities.findall(nspath_eval('sos:contents/sos:Contents/swes:observableProperty', namespaces)):
+ observed_prop = testXMLValue(op)
+ self.observed_properties.append(observed_prop)
+
+ def describe_sensor(self, outputFormat=None, procedure=None, method=None, **kwargs):
+
+ method = method or 'Get'
try:
base_url = next((m.get('url') for m in self.getOperationByName('DescribeSensor').methods if m.get('type').lower() == method.lower()))
@@ -126,16 +132,14 @@ class SensorObservationService_2_0_0(object):
url_kwargs = {}
if 'timeout' in kwargs:
- url_kwargs['timeout'] = kwargs.pop('timeout') # Client specified timeout value
+ url_kwargs['timeout'] = kwargs.pop('timeout') # Client specified timeout value
# Optional Fields
if kwargs:
for kw in kwargs:
- request[kw]=kwargs[kw]
-
- data = urlencode(request)
+ request[kw] = kwargs[kw]
- response = openURL(base_url, data, method, username=self.username, password=self.password, **url_kwargs).read()
+ response = openURL(base_url, request, method, username=self.username, password=self.password, **url_kwargs).read()
tr = etree.fromstring(response)
if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
@@ -143,12 +147,14 @@ class SensorObservationService_2_0_0(object):
return response
- def get_observation(self, responseFormat=None,
- offerings=None,
- observedProperties=None,
- eventTime=None,
- method='Get',
- **kwargs):
+ def get_observation(self,
+ responseFormat=None,
+ offerings=None,
+ observedProperties=None,
+ eventTime=None,
+ procedure=None,
+ method=None,
+ **kwargs):
"""
Parameters
----------
@@ -160,7 +166,11 @@ class SensorObservationService_2_0_0(object):
anything else e.g. vendor specific parameters
"""
- base_url = self.get_operation_by_name('GetObservation').methods[method]['url']
+ method = method or 'Get'
+ # Pluck out the get observation URL for HTTP method - methods is an
+ # array of dicts
+ methods = self.get_operation_by_name('GetObservation').methods
+ base_url = [ m['url'] for m in methods if m['type'] == method][0]
request = {'service': 'SOS', 'version': self.version, 'request': 'GetObservation'}
@@ -180,18 +190,16 @@ class SensorObservationService_2_0_0(object):
url_kwargs = {}
if 'timeout' in kwargs:
- url_kwargs['timeout'] = kwargs.pop('timeout') # Client specified timeout value
+ url_kwargs['timeout'] = kwargs.pop('timeout') # Client specified timeout value
if procedure is not None:
request['procedure'] = procedure
if kwargs:
for kw in kwargs:
- request[kw]=kwargs[kw]
+ request[kw] = kwargs[kw]
- data = urlencode(request)
-
- response = openURL(base_url, data, method, username=self.username, password=self.password, **url_kwargs).read()
+ response = openURL(base_url, request, method, username=self.username, password=self.password, **url_kwargs).read()
try:
tr = etree.fromstring(response)
if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
@@ -212,6 +220,7 @@ class SensorObservationService_2_0_0(object):
return item
raise KeyError("No Operation named %s" % name)
+
class SosObservationOffering(object):
def __init__(self, element):
self._root = element
@@ -270,10 +279,11 @@ class SosObservationOffering(object):
def __str__(self):
return 'Offering id: %s, name: %s' % (self.id, self.name)
-
+
def __repr__(self):
return "<SosObservationOffering '%s'>" % self.name
+
class SosCapabilitiesReader(object):
def __init__(self, version="2.0.0", url=None, username=None, password=None):
self.version = version
@@ -310,7 +320,7 @@ class SosCapabilitiesReader(object):
version, and request parameters
"""
getcaprequest = self.capabilities_url(service_url)
- spliturl=getcaprequest.split('?')
+ spliturl = getcaprequest.split('?')
u = openURL(spliturl[0], spliturl[1], method='Get', username=self.username, password=self.password)
return etree.fromstring(u.read())
@@ -323,3 +333,52 @@ class SosCapabilitiesReader(object):
if not isinstance(st, str) and not isinstance(st, bytes):
raise ValueError("String must be of type string or bytes, not %s" % type(st))
return etree.fromstring(st)
+
+
+class SOSGetObservationResponse(object):
+ """ The base response type from SOS2.0. Container for OM_Observation
+ objects.
+ """
+ def __init__(self, element):
+ obs_data = element.findall(
+ nspath_eval("sos:observationData/om20:OM_Observation", namespaces))
+ self.observations = []
+ decoder = ObservationDecoder()
+ for obs in obs_data:
+ parsed_obs = decoder.decode_observation(obs)
+ self.observations.append(parsed_obs)
+
+ def __iter__(self):
+ for obs in self.observations:
+ yield obs
+
+ def __getitem__(self, index):
+ return self.observations[index]
+
+
+class ObservationDecoder(object):
+ """ Class to handle decoding different Observation types.
+ The decode method inspects the type of om:result element and
+ returns the appropriate observation type, which handles parsing
+ of the result.
+ """
+ def decode_observation(self, element):
+ """ Returns a parsed observation of the appropriate type,
+ by inspecting the result element.
+
+ 'element' input is the XML tree of the OM_Observation object
+ """
+ result_element = element.find(nspath_eval("om20:result", namespaces))
+ if len(result_element) == 0:
+ result_type = testXMLAttribute(
+ result_element, nspath_eval("xsi:type", namespaces))
+ else:
+ result_type = list(result_element)[0].tag
+
+ if result_type.find('MeasureType') != -1:
+ return MeasurementObservation(element)
+ elif (result_type ==
+ '{http://www.opengis.net/waterml/2.0}MeasurementTimeseries'):
+ return MeasurementTimeseriesObservation(element)
+ else:
+ raise NotImplementedError('Result type {} not supported'.format(result_type))
diff --git a/owslib/swe/observation/waterml2.py b/owslib/swe/observation/waterml2.py
new file mode 100644
index 0000000..35bd6d0
--- /dev/null
+++ b/owslib/swe/observation/waterml2.py
@@ -0,0 +1,152 @@
+# -*- coding: ISO-8859-15 -*-
+# =============================================================================
+# Copyright (c) 2014 Pete Taylor
+#
+# Authors : Pete Taylor <peterataylor at gmail.com>
+#
+# Contact email: peterataylor at gmail.com
+# =============================================================================
+from owslib.util import nspath_eval
+from owslib.namespaces import Namespaces
+from owslib.util import testXMLAttribute, testXMLValue
+from owslib.swe.common import Quantity
+from dateutil import parser
+from owslib.swe.observation.om import OM_Observation, Result
+
+
+def get_namespaces():
+ ns = Namespaces()
+ return ns.get_namespaces(["swe20", "xlink", "sos20", "om20", "gml32",
+ "xsi", "wml2"])
+namespaces = get_namespaces()
+
+
+def nspv(path):
+ return nspath_eval(path, namespaces)
+
+
+class MeasurementTimeseriesObservation(OM_Observation):
+ ''' A timeseries observation that has a measurement timeseries as
+ result. An implementation of the WaterML2
+ MeasurementTimeseriesObservation. '''
+ def __init__(self, element):
+ super(MeasurementTimeseriesObservation, self).__init__(element)
+ self._parse_result()
+
+ def _parse_result(self):
+ ''' Parse the result element of the observation type '''
+ if self.result is not None:
+ result = self.result.find(nspv(
+ "wml2:MeasurementTimeseries"))
+ self.result = MeasurementTimeseries(result)
+
+ def get_result(self):
+ return self.result
+
+
+class Timeseries(Result):
+ ''' Generic time-series class '''
+ def __init__(self, element):
+ super(Timeseries, self).__init__(element)
+
+
+class MeasurementTimeseries(Timeseries):
+ ''' A WaterML2.0 timeseries of measurements, with per-value metadata. '''
+ def __init__(self, element):
+ super(MeasurementTimeseries, self).__init__(element)
+
+ self.defaultTVPMetadata = TVPMeasurementMetadata(element.find(
+ nspv("wml2:defaultPointMetadata/wml2:DefaultTVPMeasurementMetadata")))
+
+ elems = element.findall(nspv("wml2:point"))
+ self.points = []
+ for point in elems:
+ self.points.append(TimeValuePair(point))
+
+ def __iter__(self):
+ for point in self.points:
+ yield point
+
+ def __len__(self):
+ return len(self.points)
+
+ def _parse_metadata(self, element):
+ ''' Parse metadata elements relating to timeseries:
+ TS: baseTime, spacing, commentBlock, parameter
+ MTS: startAnchor, endAnchor, cumulative, accAnchor/Length, maxGap
+ '''
+ pass
+
+
+class TimeValuePair(object):
+ ''' A time-value pair as specified by WaterML2.0
+ Currently no support for tvp metadata.
+ '''
+ def __init__(self, element):
+ date_str = testXMLValue(
+ element.find(nspv("wml2:MeasurementTVP/wml2:time")))
+ try:
+ self.datetime = parser.parse(date_str)
+ except:
+ raise ValueError("Error parsing datetime string: %s" % date_str)
+
+ value_str = testXMLValue(element.find(nspv(
+ "wml2:MeasurementTVP/wml2:value")))
+ try:
+ self.value = float(value_str)
+ except:
+ self.value = float('nan')
+
+ def __str__(self):
+ return str(self.datetime) + "," + str(self.value)
+
+
+class TVPMetadata(object):
+ def __init__(self, element):
+ ''' Base time-value pair metadata. Still to do:
+ - relatedObservation
+ '''
+ self.quality = testXMLAttribute(element.find(nspv(
+ "wml2:quality")), nspv("xlink:href"))
+ self.nilReason = testXMLAttribute(element.find(nspv(
+ "wml2:nilReason")), nspv("xlink:href"))
+ self.comment = testXMLValue(element.find(nspv(
+ "wml2:comment")))
+ self.qualifier = testXMLAttribute(element.find(nspv(
+ "wml2:qualifier")), nspv("xlink:href"))
+ self.processing = testXMLValue(element.find(nspv(
+ "wml2:processing")), nspv("xlink:href"))
+ self.source = testXMLValue(element.find(nspv(
+ "wml2:source")), nspv("xlink:href"))
+
+
+class TVPMeasurementMetadata(TVPMetadata):
+ ''' Measurement specific metadata. Still to do:
+ - aggregationDuration
+ '''
+ def __init__(self, element):
+ super(TVPMeasurementMetadata, self).__init__(element)
+
+ self.uom = testXMLAttribute(element.find(nspv(
+ "wml2:uom")), "code")
+ self.interpolationType = testXMLAttribute(element.find(nspv(
+ "wml2:interpolationType")), nspv("xlink:href"))
+ self.censoredReason = testXMLAttribute(element.find(nspv(
+ "wml2:censoredReason")), "xlink:href")
+
+ accuracy = testXMLValue(element.find(nspv("wml2:accuracy")))
+ if accuracy is not None:
+ self.accuracy = Quantity(element)
+
+
+class MeasurementTimeseriesDomainRange(Timeseries):
+ ''' Class to implement domain range timeseries encoding '''
+ def __init__(self, element):
+ super(MeasurementTimeseriesDomainRange, self, element).__init__()
+
+
+class MonitoringPoint(object):
+ ''' A WaterML2.0 Monitoring Point, which is a specialised O&M SamplingPoint
+ '''
+ def __init__(self, element):
+ pass
diff --git a/owslib/util.py b/owslib/util.py
index b40ac2a..63e7d66 100644
--- a/owslib/util.py
+++ b/owslib/util.py
@@ -38,35 +38,46 @@ import requests
Utility functions and classes
"""
+
class ServiceException(Exception):
- #TODO: this should go in ows common module when refactored.
+ # TODO: this should go in ows common module when refactored.
pass
+
# http://stackoverflow.com/questions/6256183/combine-two-dictionaries-of-dictionaries-python
-dict_union = lambda d1,d2: dict((x,(dict_union(d1.get(x,{}),d2[x]) if
- isinstance(d2.get(x),dict) else d2.get(x,d1.get(x)))) for x in
- set(list(d1.keys())+list(d2.keys())))
+def dict_union(d1, d2):
+ return dict((x, (dict_union(d1.get(x, {}), d2[x]) if
+ isinstance(d2.get(x), dict) else d2.get(x, d1.get(x)))) for x in
+ set(list(d1.keys())+list(d2.keys())))
# Infinite DateTimes for Python. Used in SWE 2.0 and other OGC specs as "INF" and "-INF"
class InfiniteDateTime(object):
def __lt__(self, other):
return False
+
def __gt__(self, other):
return True
+
def timetuple(self):
return tuple()
+
+
class NegativeInfiniteDateTime(object):
def __lt__(self, other):
return True
+
def __gt__(self, other):
return False
+
def timetuple(self):
return tuple()
first_cap_re = re.compile('(.)([A-Z][a-z]+)')
all_cap_re = re.compile('([a-z0-9])([A-Z])')
+
+
def format_string(prop_string):
"""
Formats a property string to remove spaces and go from CamelCase to pep8
@@ -75,9 +86,10 @@ def format_string(prop_string):
if prop_string is None:
return ''
st_r = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', prop_string)
- st_r = st_r.replace(' ','')
+ st_r = st_r.replace(' ', '')
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', st_r).lower()
+
def xml_to_dict(root, prefix=None, depth=1, diction=None):
"""
Recursively iterates through an xml element to convert each element in the tree to a (key,val). Where key is the element
@@ -93,7 +105,7 @@ def xml_to_dict(root, prefix=None, depth=1, diction=None):
Return
=======
Dictionary of (key,value); where key is the element tag stripped of namespace and cleaned up to be pep8 and
- value is the inner-text of the element. Note that duplicate elements will be replaced by the last element of the
+ value is the inner-text of the element. Note that duplicate elements will be replaced by the last element of the
same tag in the tree.
"""
ret = diction if diction is not None else dict()
@@ -102,7 +114,7 @@ def xml_to_dict(root, prefix=None, depth=1, diction=None):
# skip values that are empty or None
if val is None or val == '':
if depth > 1:
- ret = xml_to_dict(child,prefix=prefix,depth=(depth-1),diction=ret)
+ ret = xml_to_dict(child, prefix=prefix, depth=(depth-1), diction=ret)
continue
key = format_string(child.tag.split('}')[-1])
@@ -112,10 +124,11 @@ def xml_to_dict(root, prefix=None, depth=1, diction=None):
ret[key] = val
if depth > 1:
- ret = xml_to_dict(child,prefix=prefix,depth=(depth-1),diction=ret)
+ ret = xml_to_dict(child, prefix=prefix, depth=(depth-1), diction=ret)
return ret
+
class ResponseWrapper(object):
"""
Return object type from openURL.
@@ -136,7 +149,8 @@ class ResponseWrapper(object):
# @TODO: __getattribute__ for poking at response
-def openURL(url_base, data=None, method='Get', cookies=None, username=None, password=None, timeout=30, headers=None):
+
+def openURL(url_base, data=None, method=None, cookies=None, username=None, password=None, timeout=30, headers=None):
"""
Function to open URLs.
@@ -144,6 +158,7 @@ def openURL(url_base, data=None, method='Get', cookies=None, username=None, pass
Also handles cookies and simple user password authentication.
"""
headers = headers if headers is not None else {}
+ method = method or 'Get'
rkwargs = {}
rkwargs['timeout'] = timeout
@@ -160,7 +175,7 @@ def openURL(url_base, data=None, method='Get', cookies=None, username=None, pass
if method.lower() == 'post':
try:
- xml = etree.fromstring(data)
+ etree.fromstring(data)
headers['Content-Type'] = 'text/xml'
except (ParseError, UnicodeEncodeError):
pass
@@ -169,7 +184,7 @@ def openURL(url_base, data=None, method='Get', cookies=None, username=None, pass
elif method.lower() == 'get':
rkwargs['params'] = data
-
+
else:
raise ValueError("Unknown method ('%s'), expected 'get' or 'post'" % method)
@@ -189,24 +204,27 @@ def openURL(url_base, data=None, method='Get', cookies=None, username=None, pass
# check for service exceptions without the http header set
if 'Content-Type' in req.headers and req.headers['Content-Type'] in ['text/xml', 'application/xml']:
- #just in case 400 headers were not set, going to have to read the xml to see if it's an exception report.
+ # just in case 400 headers were not set, going to have to read the xml to see if it's an exception report.
se_tree = etree.fromstring(req.content)
- serviceException=se_tree.find('{http://www.opengis.net/ows}Exception')
+ serviceException = se_tree.find('{http://www.opengis.net/ows}Exception')
if serviceException is None:
- serviceException=se_tree.find('ServiceException')
+ serviceException = se_tree.find('ServiceException')
if serviceException is not None:
raise ServiceException(str(serviceException.text).strip())
return ResponseWrapper(req)
-#default namespace for nspath is OWS common
+
+# default namespace for nspath is OWS common
OWS_NAMESPACE = 'http://www.opengis.net/ows/1.1'
+
+
def nspath(path, ns=OWS_NAMESPACE):
"""
Prefix the given path with the given namespace identifier.
-
+
Parameters
----------
@@ -225,6 +243,7 @@ def nspath(path, ns=OWS_NAMESPACE):
components.append(component)
return '/'.join(components)
+
def nspath_eval(xpath, namespaces):
''' Return an etree friendly xpath '''
out = []
@@ -233,6 +252,7 @@ def nspath_eval(xpath, namespaces):
out.append('{%s}%s' % (namespaces[namespace], element))
return '/'.join(out)
+
def cleanup_namespaces(element):
""" Remove unused namespaces from an element """
if etree.__name__ == 'lxml.etree':
@@ -316,13 +336,14 @@ def testXMLValue(val, attrib=False):
if val is not None:
if attrib:
return val.strip()
- elif val.text:
+ elif val.text:
return val.text.strip()
else:
- return None
+ return None
else:
return None
+
def testXMLAttribute(element, attribute):
"""
@@ -340,10 +361,11 @@ def testXMLAttribute(element, attribute):
return None
+
def http_post(url=None, request=None, lang='en-US', timeout=10, username=None, password=None):
"""
- Invoke an HTTP POST request
+ Invoke an HTTP POST request
Parameters
----------
@@ -377,6 +399,7 @@ def http_post(url=None, request=None, lang='en-US', timeout=10, username=None, p
up = requests.post(url, request, headers=headers, **rkwargs)
return up.content
+
def element_to_string(element, encoding=None, xml_declaration=False):
"""
Returns a string from a XML object
@@ -405,8 +428,10 @@ def element_to_string(element, encoding=None, xml_declaration=False):
output = etree.tostring(element)
else:
if xml_declaration:
- output = '<?xml version="1.0" encoding="%s" standalone="no"?>\n%s' % (encoding,
- etree.tostring(element, encoding=encoding))
+ output = '<?xml version="1.0" encoding="{}" standalone="no"?>\n{}'.format(
+ encoding,
+ etree.tostring(element, encoding=encoding)
+ )
else:
output = etree.tostring(element)
@@ -428,6 +453,7 @@ def xml2string(xml):
The 'xml2string' method will be removed in a future version of OWSLib.")
return '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>\n' + xml
+
def xmlvalid(xml, xsd):
"""
@@ -447,6 +473,7 @@ def xmlvalid(xml, xsd):
doc = etree.parse(StringIO(xml))
return xsd2.validate(doc)
+
def xmltag_split(tag):
''' Return XML element bare tag name (without prefix) '''
try:
@@ -454,34 +481,38 @@ def xmltag_split(tag):
except:
return tag
+
def getNamespace(element):
''' Utility method to extract the namespace from an XML element tag encoded as {namespace}localname. '''
- if element.tag[0]=='{':
+ if element.tag[0] == '{':
return element.tag[1:].split("}")[0]
else:
return ""
+
def build_get_url(base_url, params):
''' Utility function to build a full HTTP GET URL from the service base URL and a dictionary of HTTP parameters. '''
-
+
qs = []
if base_url.find('?') != -1:
qs = cgi.parse_qsl(base_url.split('?')[1])
pars = [x[0] for x in qs]
- for key,value in six.iteritems(params):
+ for key, value in six.iteritems(params):
if key not in pars:
- qs.append( (key,value) )
+ qs.append( (key, value) )
urlqs = urlencode(tuple(qs))
return base_url.split('?')[0] + '?' + urlqs
+
def dump(obj, prefix=''):
'''Utility function to print to standard output a generic object with all its attributes.'''
print("%s %s.%s : %s" % (prefix, obj.__module__, obj.__class__.__name__, obj.__dict__))
+
def getTypedValue(data_type, value):
'''Utility function to cast a string value to the appropriate XSD type. '''
@@ -494,7 +525,7 @@ def getTypedValue(data_type, value):
elif data_type == 'string':
return str(value)
else:
- return value # no type casting
+ return value # no type casting
def extract_time(element):
@@ -531,7 +562,7 @@ Some people don't have seperate tags for their keywords and seperate them with
a newline. This will extract out all of the keywords correctly.
"""
if elements:
- keywords = [re.split(r'[\n\r]+',f.text) for f in elements if f.text]
+ keywords = [re.split(r'[\n\r]+', f.text) for f in elements if f.text]
flattened = [item.strip() for sublist in keywords for item in sublist]
remove_blank = [_f for _f in flattened if _f]
return remove_blank
@@ -541,24 +572,25 @@ a newline. This will extract out all of the keywords correctly.
def bind_url(url):
"""binds an HTTP GET query string endpiont"""
- if url.find('?') == -1: # like http://host/wms
+ if url.find('?') == -1: # like http://host/wms
binder = '?'
# if like http://host/wms?foo=bar& or http://host/wms?foo=bar
if url.find('=') != -1:
- if url.find('&', -1) != -1: # like http://host/wms?foo=bar&
+ if url.find('&', -1) != -1: # like http://host/wms?foo=bar&
binder = ''
- else: # like http://host/wms?foo=bar
+ else: # like http://host/wms?foo=bar
binder = '&'
# if like http://host/wms?foo
if url.find('?') != -1:
- if url.find('?', -1) != -1: # like http://host/wms?
+ if url.find('?', -1) != -1: # like http://host/wms?
binder = ''
- elif url.find('&', -1) == -1: # like http://host/wms?foo=bar
+ elif url.find('&', -1) == -1: # like http://host/wms?foo=bar
binder = '&'
return '%s%s' % (url, binder)
+
import logging
# Null logging handler
try:
@@ -593,6 +625,7 @@ def which_etree():
return which_etree
+
def findall(root, xpath, attribute_name=None, attribute_value=None):
"""Find elements recursively from given root element based on
xpath and possibly given attribute
@@ -606,7 +639,6 @@ def findall(root, xpath, attribute_name=None, attribute_value=None):
found_elements = []
-
# python 2.6 < does not support complicated XPATH expressions used lower
if (2, 6) == sys.version_info[0:2] and which_etree() != 'lxml.etree':
diff --git a/owslib/wfs.py b/owslib/wfs.py
index cee4352..8550bbb 100644
--- a/owslib/wfs.py
+++ b/owslib/wfs.py
@@ -1,9 +1,9 @@
-# -*- coding: ISO-8859-15 -*-
+# -*- coding: utf-8 -*-
# =============================================================================
# Copyright (c) 2004, 2006 Sean C. Gillies
# Copyright (c) 2009 STFC <http://www.stfc.ac.uk>
#
-# Authors :
+# Authors :
# Dominic Lowe <dominic.lowe at stfc.ac.uk>
#
# Contact email: dominic.lowe at stfc.ac.uk
@@ -19,9 +19,9 @@ from .feature import wfs100, wfs110, wfs200
def WebFeatureService(url, version='1.0.0', xml=None, parse_remote_metadata=False,
- timeout=30):
+ timeout=30, username=None, password=None):
''' wfs factory function, returns a version specific WebFeatureService object
-
+
@type url: string
@param url: url of WFS capabilities document
@type xml: string
@@ -29,15 +29,22 @@ def WebFeatureService(url, version='1.0.0', xml=None, parse_remote_metadata=Fals
@type parse_remote_metadata: boolean
@param parse_remote_metadata: whether to fully process MetadataURL elements
@param timeout: time (in seconds) after which requests should timeout
+ @param username: service authentication username
+ @param password: service authentication password
@return: initialized WebFeatureService_2_0_0 object
'''
if version in ['1.0', '1.0.0']:
- return wfs100.WebFeatureService_1_0_0(url, version, xml, parse_remote_metadata,
- timeout=timeout)
+ return wfs100.WebFeatureService_1_0_0(url, version, xml, parse_remote_metadata,
+ timeout=timeout,
+ username=username,
+ password=password)
elif version in ['1.1', '1.1.0']:
return wfs110.WebFeatureService_1_1_0(url, version, xml, parse_remote_metadata,
- timeout=timeout)
+ timeout=timeout,
+ username=username,
+ password=password)
elif version in ['2.0', '2.0.0']:
return wfs200.WebFeatureService_2_0_0(url, version, xml, parse_remote_metadata,
- timeout=timeout)
-
+ timeout=timeout,
+ username=username,
+ password=password)
diff --git a/requirements-dev.txt b/requirements-dev.txt
index a7bde13..6f69e2a 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,3 +1,4 @@
+-r requirements.txt
pep8
pytest
pytest-cov
diff --git a/tests/doctests/csw_pycsw.txt b/tests/doctests/csw_pycsw.txt
index 1e5ea1c..2614fb4 100644
--- a/tests/doctests/csw_pycsw.txt
+++ b/tests/doctests/csw_pycsw.txt
@@ -13,6 +13,8 @@ Properties
>>> c.identification.title
'pycsw OGC CITE demo and Reference Implementation'
+ >>> c.constraints['MaxRecordDefault'].values[0]
+ '10'
GetRecords
diff --git a/tests/doctests/sos_20_52N_demo.txt b/tests/doctests/sos_20_52N_demo.txt
new file mode 100644
index 0000000..07a9f41
--- /dev/null
+++ b/tests/doctests/sos_20_52N_demo.txt
@@ -0,0 +1,67 @@
+# Tests using the 52North demo service
+
+>>> from owslib.sos import SensorObservationService
+>>> service = SensorObservationService('http://sensorweb.demo.52north.org/52n-sos-webapp/sos/kvp',version='2.0.0')
+>>> for content in sorted(service.contents):
+... print(content)
+...
+http://www.52north.org/test/offering/1
+http://www.52north.org/test/offering/2
+http://www.52north.org/test/offering/3
+http://www.52north.org/test/offering/4
+http://www.52north.org/test/offering/5
+http://www.52north.org/test/offering/6
+http://www.52north.org/test/offering/7
+http://www.52north.org/test/offering/8
+http://www.52north.org/test/offering/developer
+
+>>> id = service.identification
+
+# Check basic service metadata
+>>> id.service
+'OGC:SOS'
+
+>>> id.title
+'52N SOS'
+
+>>> provider=service.provider
+>>> provider.name
+'52North'
+
+>>> len(service.operations)
+16
+
+# Check allowed params for get FOI
+>>> get_foi=service.get_operation_by_name('GetFeatureOfInterest')
+>>> try:
+... x = unicode('test')
+... for x in sorted(get_foi.parameters['featureOfInterest']['values']):
+... print(x.encode('utf8'))
+... except:
+... for x in sorted(get_foi.parameters['featureOfInterest']['values']):
+... print(x)
+http://www.52north.org/test/featureOfInterest/1
+http://www.52north.org/test/featureOfInterest/2
+http://www.52north.org/test/featureOfInterest/3
+http://www.52north.org/test/featureOfInterest/4
+http://www.52north.org/test/featureOfInterest/5
+http://www.52north.org/test/featureOfInterest/6
+http://www.52north.org/test/featureOfInterest/7
+http://www.52north.org/test/featureOfInterest/8
+http://www.52north.org/test/featureOfInterest/Heiden
+http://www.52north.org/test/featureOfInterest/Münster/FE101
+http://www.52north.org/test/featureOfInterest/Portland
+http://www.52north.org/test/featureOfInterest/TODO
+http://www.52north.org/test/featureOfInterest/world
+
+# Check allowed params for get observation
+>>> get_obs=service.get_operation_by_name('GetObservation')
+
+get_obs.parameters['responseFormat']['values']
+['http://www.opengis.net/om/2.0']
+
+# Get observation call
+
+# Get latest value using O&M reponse format
+#'<?xml version="1.0" encoding="UTF-8"?>\n<sos:GetObservationResponse xmlns:sos="http://www.opengis.net/sos/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:om="http://www.opengis.net/om/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/sos/2.0 http://schemas.opengis.net/sos/2.0/sosGetObservation.xsd http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd http://www.ope [...]
+>>> latest_response = service.get_observation('http://www.opengis.net/om/2.0', ['http://www.52north.org/test/offering/1'], ['http://www.52north.org/test/observableProperty/1'], eventTime='om:phenomenonTime,latest', timeout=120)
diff --git a/tests/doctests/sos_20_bom_gov_au.txt b/tests/doctests/sos_20_bom_gov_au.txt
new file mode 100644
index 0000000..d1fba36
--- /dev/null
+++ b/tests/doctests/sos_20_bom_gov_au.txt
@@ -0,0 +1,46 @@
+# SOS version 2.0 tests on http://www.bom.gov.au/waterdata/services
+
+# Imports
+>>> from owslib.sos import SensorObservationService
+
+# Setup
+>>> service = SensorObservationService('http://www.bom.gov.au/waterdata/services', version='2.0.0')
+>>> id = service.identification
+
+# Check basic service metadata
+>>> id.service
+'SOS'
+
+>>> id.title
+'KISTERS KiWIS SOS2'
+
+>>> id.keywords
+[]
+
+>>> service.provider.name
+'Provider Name'
+
+>>> service.provider.contact.name
+'Name'
+
+>>> service.provider.contact.position
+
+>>> len(service.operations)
+5
+
+>>> service.get_operation_by_name('GetObservation').methods[0]['url'] = 'http://www.bom.gov.au/waterdata/services'
+>>> 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')
+
+# Process WaterML Response
+>>> from owslib.etree import etree
+>>> from owslib.swe.observation.sos200 import SOSGetObservationResponse
+>>> from owslib.swe.observation.waterml2 import MeasurementTimeseriesObservation
+
+>>> et = etree.fromstring(response)
+>>> parsed_response = SOSGetObservationResponse(et)
+>>> assert len(parsed_response.observations) > 0
+>>> for o in parsed_response.observations:
+... assert isinstance(o, MeasurementTimeseriesObservation)
diff --git a/tests/doctests/sos_20_timeseries_decoder_ioos.txt b/tests/doctests/sos_20_timeseries_decoder_ioos.txt
new file mode 100644
index 0000000..6d9a35a
--- /dev/null
+++ b/tests/doctests/sos_20_timeseries_decoder_ioos.txt
@@ -0,0 +1,57 @@
+# SOS version 2.0 tests using the 52North installation for IOOS: http://ioossos.axiomalaska.com/
+
+# Imports
+>>> from owslib.sos import SensorObservationService
+>>> from owslib.swe.observation.sos200 import SOSGetObservationResponse
+>>> from owslib.etree import etree
+
+# Setup
+#>>> service = SensorObservationService('http://geoviqua.dev.52north.org/SOS-Q/sos/kvp',version='2.0.0')
+>>> service = SensorObservationService('http://ioossos.axiomalaska.com/52n-sos-ioos-stable/sos/kvp',version='2.0.0')
+
+# http://ioossos.axiomalaska.com/52n-sos-ioos-stable/sos/kvp?service=SOS&request=GetObservation&namespaces=xmlns(om%2Chttp%3A%2F%2Fwww.opengis.net%2Fom%2F2.0)&temporalFilter=om%3AphenomenonTime%2Clatest&version=2.0.0
+
+# Check allowed params for get observation
+>>> get_obs=service.get_operation_by_name('GetObservation')
+
+>>> response = service.get_observation(responseFormat='http://www.opengis.net/om/2.0', offerings=['urn:ioos:station:test:8'], observedProperties=['http://mmisw.org/ont/cf/parameter/sea_water_temperature'], timeout=60)
+
+>>> xml_tree = etree.fromstring(response)
+
+>>> parsed_response = SOSGetObservationResponse(xml_tree)
+
+>>> type(parsed_response)
+<class 'owslib.swe.observation.sos200.SOSGetObservationResponse'>
+
+>>> o=parsed_response.observations[0]
+
+## Value changes each call so can't be tested
+## >>> o.get_result().value
+
+>>> o.get_result().uom
+'urn:ogc:def:uom:udunits:2:Cel'
+
+# This O&M structure of the results splits each point into an O&M object, resulting in 400 results
+>>> len(parsed_response.observations)
+400
+>>> type(parsed_response.observations[0])
+<class 'owslib.swe.observation.om.MeasurementObservation'>
+
+# Get observation for a specific offering (in this case corresponds to a station) and observed property (sea water temperature)
+>>> response = service.get_observation(responseFormat='http://www.opengis.net/waterml/2.0', offerings=['urn:ioos:station:test:8'], observedProperties=['http://mmisw.org/ont/cf/parameter/sea_water_temperature'], timeout=60)
+>>> xml_tree = etree.fromstring(response)
+>>> parsed_response = SOSGetObservationResponse(xml_tree)
+>>> type(parsed_response)
+<class 'owslib.swe.observation.sos200.SOSGetObservationResponse'>
+
+>>> len(parsed_response.observations)
+20
+>>> type(parsed_response.observations[0])
+<class 'owslib.swe.observation.waterml2.MeasurementTimeseriesObservation'>
+>>> type(parsed_response.observations[0].get_result())
+<class 'owslib.swe.observation.waterml2.MeasurementTimeseries'>
+
+>>> measurement_timeseries = parsed_response.observations[0].get_result()
+>>> len(measurement_timeseries)
+20
+
diff --git a/tests/resources/sos_52n_get_observation_ioos.xml b/tests/resources/sos_52n_get_observation_ioos.xml
new file mode 100644
index 0000000..1059fe3
--- /dev/null
+++ b/tests/resources/sos_52n_get_observation_ioos.xml
@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:GetObservationResponse xmlns:sos="http://www.opengis.net/sos/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:om="http://www.opengis.net/om/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/sos/2.0 http://schemas.opengis.net/sos/2.0/sosGetObservation.xsd http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd http://www.opengis.net/om/2.0 http://schemas.opengis.net [...]
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_A8C1BC58D6D4EAD0409FFF41C49726B8C65AC9C1">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1581">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1581"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-75.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">25.12</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_7A280CB9B3F3C9323CD90C0127720695A016E86D">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1521">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1521"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-60.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">16.37</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_844947E9478EC18A253D9B9F6B42449ACFF9DC46">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1561">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1561"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-70.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">16.49</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_892EFC8F32CAE841373AD2B59064A5D8D5F6A56E">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1281">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1281"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height0.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">20.49</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_22EA2EC80AE83B7C14305E89B33AEB37F1C57873">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1661">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1661"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-95.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">6.35</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_EC200BE05D635934ADA3D694F59F27DCD1A99F7F">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1441">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1441"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-40.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">12.05</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_A8A8853B9DB05CE2C71CB8E98472F09C912A37AD">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1481">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1481"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-50.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">8.82</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_DD07D0456CC863A055EBE092A9F555EBF6F9F425">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1381">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1381"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-25.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">11.5</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_AFB6503D41E3D0E7BF24FB7D4CA765D0F95796D5">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1401">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1401"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-30.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">24.76</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_551F96D71BFB485D0C06D6053B62CA7DC30EC8E4">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1461">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1461"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-45.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">17.74</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_4F9642997647ADF39DDE6F1EBF47A39F30F7BB61">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1261">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1261"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:air_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/air_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">6.03</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_73067292651E2F6EF0FC60E8CCB2FDD6147F75F5">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1301">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1301"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-5.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">20.86</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_BF8738F4C9542266B2E5D25FAC8A171F5643E83B">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1501">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1501"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-55.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">13.63</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_49A558E6DF45E490DFCE159823AF2FE66EABC180">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1621">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1621"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-85.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">8.47</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_25D5BDFFD596A0A3AD7BB53B1310E19D94414B7E">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1361">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1361"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-20.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">8.08</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_99E78EB5B525AA8D0D7823B2DB55B42835FC3CD3">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1321">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1321"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-10.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">30.38</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_25F20DE415EBB4A3983267DB9CAA48142301BDD3">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1421">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1421"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-35.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">13.18</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_9677ED62B69B869240F268FF2E475B574EC43249">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1641">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1641"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-90.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">6.82</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_39E48859E1374DEDC60DB5880638D729CDCC805D">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1541">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1541"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-65.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">18.35</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_EEB115B304F9370C8B95199C1BE4284845180C5C">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1341">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1341"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-15.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">19.34</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_782008D03AFCCEA45503F4A1DF3EAB3126198133">
+ <om:type xlink:href="http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"/>
+ <om:phenomenonTime>
+ <gml:TimeInstant gml:id="phenomenonTime_1601">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:phenomenonTime>
+ <om:resultTime xlink:href="#phenomenonTime_1601"/>
+ <om:procedure xlink:href="urn:ioos:sensor:test:3:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:3(height-80.0m)"/>
+ <om:result xmlns:ns="http://www.opengis.net/gml/3.2" uom="urn:ogc:def:uom:udunits:2:Cel" xsi:type="ns:MeasureType">11.58</om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+</sos:GetObservationResponse>
diff --git a/tests/resources/sos_52n_get_observation_ioos_wml2.xml b/tests/resources/sos_52n_get_observation_ioos_wml2.xml
new file mode 100644
index 0000000..02d6ab4
--- /dev/null
+++ b/tests/resources/sos_52n_get_observation_ioos_wml2.xml
@@ -0,0 +1,3216 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:GetObservationResponse xmlns:sos="http://www.opengis.net/sos/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:om="http://www.opengis.net/om/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:wml2="http://www.opengis.net/waterml/2.0" xsi:schemaLocation="http://www.opengis.net/waterml/2.0 http://schemas.opengis.net/waterml/2.0/waterml2.xsd http://www.opengis.net/sos/2.0 http://schemas.opengis.net/sos/2.0/sosGetObservation.x [...]
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_88D32CAEB4E72DA561497F9DA2703AA911194C12">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_1">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_472A0AAB51B0FD6E5633311E63CBBD67D1BFF945">
+ <gml:timePosition>2014-07-07T08:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-80.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.1">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_1"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>16.02</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>12.1</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>30.7</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>23.61</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>28.21</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>26.93</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>24.6</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>6.19</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>15.18</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>15.58</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>7.33</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>11.64</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>16.41</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>31.85</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>7.18</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>13.33</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>9.13</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>5.17</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>31.29</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>12.6</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_6318BCD8AD56666377988C10D9739AE06EF4B2AC">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3551">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_8D0836CC69774CDC09AD46E92BC812C6972D7C1F">
+ <gml:timePosition>2014-07-07T09:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-40.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3551">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3551"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>17.29</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>21.07</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>14.85</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>5.87</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>6.71</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>20.69</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>23.59</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>20.53</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>17.84</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>10.11</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>17.43</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>11.97</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>13.8</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>21.56</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>26.72</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>10.73</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>23.63</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>29.27</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>21.93</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>13.19</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_AAAEAC5973C2D30A73DABB88E957CA6D8DE890FB">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3748">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_BFD04918FAE95119B52F701A017AEBB4FF3AA2D9">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-90.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3748">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3748"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>19.21</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>27.72</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>6.77</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>14.93</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>7.7</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>16.77</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>12.88</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>11.9</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>16.92</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>21.88</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>14.66</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>27.46</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>21.68</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>22.62</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>16.59</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>30.91</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>31.27</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>17.6</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>18.61</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>7.83</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_64B88BDF29AF652B2F79A434B55F47AB1D3C3839">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3387">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_5C595A31EFA575D1C27431C8E937CDD099426666">
+ <gml:timePosition>2014-07-07T20:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height0.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3387">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3387"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>27.83</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>19.45</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>23.65</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>25.66</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>28.93</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>17.23</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>13.27</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>27.39</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>20.37</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>19.72</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>31.6</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>11.44</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>10.9</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>9.89</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>20.37</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>12.04</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>10.34</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>28.26</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>16.02</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>29.9</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_226E6299B8513D67AADBF1FC49FF6DCE4DC7FD5C">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3689">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_F065A41ECB73F1C7E187AB9BAE245E1730284007">
+ <gml:timePosition>2014-07-07T15:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-75.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3689">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3689"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>28.98</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>28.57</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>18.68</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>9.2</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>18.53</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>27.17</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>7.84</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>20.1</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>26.82</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>11.9</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>17.86</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>19.04</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>10.73</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>25.74</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>25.47</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>19.13</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>15.55</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>20.51</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>31.11</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>9.9</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_53B62B3D2FB33A78A38915BAF8A1579E9D2CD7A1">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3626">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_53676FA1ECE9284BABDE45E65C7E9D8C7DE19559">
+ <gml:timePosition>2014-07-07T16:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-60.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3626">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3626"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>24.69</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>19.84</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>9.28</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>31.31</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>21.24</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>27.43</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>13.33</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>21.53</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>9.77</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>19.13</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>6.43</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>27.81</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>15.89</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>31.14</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>26.5</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>27.83</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>28.75</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>18.53</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>11.78</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>8.32</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_1E8091C0096CC74FE1AE184ACE4FFDB2874D0D7A">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3598">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_1DF40E16F682FC9894421889AE295626AC20190A">
+ <gml:timePosition>2014-07-07T17:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-50.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3598">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3598"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>18.5</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>31.23</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>23.38</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>26.73</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>12.25</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>26.52</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>19.07</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>9.6</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>31.53</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>10.02</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>18.97</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>19.22</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>10.02</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>12.91</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>18.78</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>5.16</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>6.64</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>26.07</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>13.51</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>24.85</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_61D5A59CCDF69D24A678A619372D0FE5B21AF63C">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3562">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_7875E472DDCFE285F1704BB58105E437AE622E26">
+ <gml:timePosition>2014-07-07T03:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-45.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3562">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3562"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>22.1</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>23.03</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>25.29</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>19.8</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>6.16</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>30.26</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>18.62</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>22.15</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>5.21</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>27.8</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>11.12</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>15.33</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>8.56</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>6.2</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>14.12</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>17.22</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>19.38</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>11.82</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>28.2</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>5.37</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_36C02E874B52DB51542B42519A0A4698D8937836">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3502">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_6EE424A18F2F1552A8AF2AC5A3C3888EC8B3ED0D">
+ <gml:timePosition>2014-07-07T10:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-30.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3502">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3502"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>8.42</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>29.5</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>25.59</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>25.67</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>7.33</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>22.03</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>17.81</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>9.57</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>23.75</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>15.99</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>30.87</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>8.51</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>21.36</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>10.3</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>19.65</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>23.82</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>19.1</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>11.35</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>15.89</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>23.61</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_80E4EAE4B348411846060BDE55A55BB281C5EE09">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3734">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_A62974AD4DB48587F77E55203DCCEE3467AF69A6">
+ <gml:timePosition>2014-07-07T05:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-85.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3734">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3734"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>21.57</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>18.44</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>18.51</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>25.67</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>21.28</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>10.18</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>19.54</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>30.95</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>31.93</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>20.07</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>30.61</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>17.44</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>21.51</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>15.05</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>27.24</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>18.05</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>17.87</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>21.47</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>7.11</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>24.13</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_7BC6DA478C32DA64E47D0CECE67146467F63858E">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3663">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_B6527927DB2C1ECB887523B398E242EA162F5414">
+ <gml:timePosition>2014-07-07T08:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-70.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3663">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3663"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>23.49</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>23.9</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>29.34</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>31.41</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>6.78</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>13.3</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>30.09</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>26.95</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>8.05</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>11.48</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>10.08</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>16.21</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>14.11</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>8.33</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>23.32</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>9.01</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>17.02</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>11.4</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>19.17</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>11.62</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_045A3FA5C50D8F18F208B676BE4F36A8D402466D">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3658">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_0E775A2144BBE031B4FF16F6629D5B2D8274FDDD">
+ <gml:timePosition>2014-07-07T08:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-65.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3658">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3658"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>24.01</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>27.08</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>13.63</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>9.36</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>19.41</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>18.93</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>30.37</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>17.17</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>23.97</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>14.91</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>20.07</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>15.28</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>8.84</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>28.72</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>24.88</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>16.35</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>14.72</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>23.2</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>18.53</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>25.08</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_978281924755A3138572409F394CECEB098C06EE">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3405">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_A575E248A26FFFFC018118A60B790295C44429D9">
+ <gml:timePosition>2014-07-07T22:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-5.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3405">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3405"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>23.57</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>22.05</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>7.66</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>30.06</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>18.5</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>25.37</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>12.31</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>12.56</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>15.15</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>24.46</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>13.1</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>9.94</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>30.43</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>14.84</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>14.28</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>16.52</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>10.54</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>9.6</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>12.85</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>12.85</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_9C47F06953BD9FA60EA33B34D4AA08736E999F1D">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3603">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_BEBAD9E7D059FE5493C4E9DB34B19B3EA7F6043C">
+ <gml:timePosition>2014-07-07T16:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-55.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3603">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3603"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>24.86</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>5.66</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>14.37</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>6.63</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>28.4</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>15.26</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>22.82</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>16.72</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>20.94</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>31.97</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>24.83</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>17.77</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>28.44</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>17.97</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>12.75</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>27.94</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>22.06</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>19.03</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>24.45</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>30.68</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_841A1E5ABD392B0E7B1B20312AA16D6BF034D333">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3366">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_F1D75BE33CDB55885EB3674AB7917D7888A67705">
+ <gml:timePosition>2014-07-07T09:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:air_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/air_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3366">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3366"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>24.11</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>6.78</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>25.14</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>18.24</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>9.66</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>14.95</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>26.63</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>11.3</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>13.38</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>27.72</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>24.73</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>28.05</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>22.69</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>20.35</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>29.89</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>17.99</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>14.12</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>17.9</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>8.07</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>23.12</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_40AD0957F66C85C29CA1424999A6A54174A226C6">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3467">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_78F963F80BAD6C720293E0BDEF7F4EA2E4912F93">
+ <gml:timePosition>2014-07-07T11:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-20.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3467">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3467"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>9.51</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>25.8</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>8.94</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>28.45</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>5.63</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>27.63</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>5.66</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>26.87</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>13.58</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>23.86</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>8.17</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>17.62</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>24.65</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>31.44</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>11.75</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>14.89</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>6.75</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>29.57</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>31.56</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>23.48</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_500D79CDB3625211F6B1CF44AF17AD208F4D49C8">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3539">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_C9A08CD4398679B397147F823F709E032C2D1518">
+ <gml:timePosition>2014-07-07T21:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-35.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3539">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3539"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>8.27</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>31.19</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>29.1</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>25.76</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>26.27</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>16.13</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>6.6</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>31.49</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>12.88</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>27.45</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>18.49</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>23.2</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>23.6</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>22.95</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>10.4</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>23.77</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>18.44</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>31.04</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>15.04</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>9.17</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_71CCED7C930B08B661EBAA07E1E46D04151FF640">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3450">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_20954FCD69EA2E842D046A69CD17E0FBD3F5BC83">
+ <gml:timePosition>2014-07-07T19:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-15.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3450">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3450"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>25.59</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>16.33</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>19.27</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>18.93</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>19.69</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>8.89</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>19.63</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>14.75</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>28.14</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>5.51</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>20.53</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>17.34</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>17.74</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>6.22</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>12.68</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>9.69</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>26.4</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>14.55</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>24.41</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>15.51</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_4C57E7F6D2651125FF8BE36224471ECDBE7C42B4">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3429">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_BCED443D7869929D81CC9390F9E28738FF1DE8DB">
+ <gml:timePosition>2014-07-07T12:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-10.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3429">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3429"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>29.92</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>26.48</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>6.49</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>19.43</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>15.16</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>31.95</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>5.42</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>29.29</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>18.57</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>8.46</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>30.95</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>25.0</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>11.16</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>18.52</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>10.48</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>27.07</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>20.67</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>22.8</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>19.01</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>8.63</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_6115A3A79FA908416CCCF0A4C2C48CF4F941B29D">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3493">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_1122F1108A9B16D867C856B2015FDD36FD3E7469">
+ <gml:timePosition>2014-07-07T17:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-25.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3493">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3493"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>25.34</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>19.0</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>12.5</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>12.2</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>5.18</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>27.62</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>16.82</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>26.73</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>26.58</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>16.83</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>19.48</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>28.34</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>11.9</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>14.12</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>27.6</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>24.27</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>26.15</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>30.48</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>8.24</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>21.34</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_1BAA713B3A7A66CE45B3B1D50F433EB368137434">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_3772">
+ <gml:beginPosition>2014-07-07T03:00:00.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-07T22:00:00.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_0994CD75264BCCC0B8E9DEADFD5A4C2BABACF975">
+ <gml:timePosition>2014-07-07T03:00:00.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="urn:ioos:sensor:test:8:sea_water_temperature"/>
+ <om:observedProperty xlink:href="http://mmisw.org/ont/cf/parameter/sea_water_temperature"/>
+ <om:featureOfInterest xlink:href="urn:ioos:station:test:8(height-95.0m)"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.3772">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_3772"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="urn:ogc:def:uom:udunits:2:Cel"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T03:00:00.000Z</wml2:time>
+ <wml2:value>20.22</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T04:00:00.000Z</wml2:time>
+ <wml2:value>27.24</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T05:00:00.000Z</wml2:time>
+ <wml2:value>17.9</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T06:00:00.000Z</wml2:time>
+ <wml2:value>21.85</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T07:00:00.000Z</wml2:time>
+ <wml2:value>8.65</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T08:00:00.000Z</wml2:time>
+ <wml2:value>18.29</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T09:00:00.000Z</wml2:time>
+ <wml2:value>21.38</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T10:00:00.000Z</wml2:time>
+ <wml2:value>13.54</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T11:00:00.000Z</wml2:time>
+ <wml2:value>16.48</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T12:00:00.000Z</wml2:time>
+ <wml2:value>23.36</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T13:00:00.000Z</wml2:time>
+ <wml2:value>25.78</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T14:00:00.000Z</wml2:time>
+ <wml2:value>21.41</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T15:00:00.000Z</wml2:time>
+ <wml2:value>6.63</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T16:00:00.000Z</wml2:time>
+ <wml2:value>26.72</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T17:00:00.000Z</wml2:time>
+ <wml2:value>17.85</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T18:00:00.000Z</wml2:time>
+ <wml2:value>30.51</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T19:00:00.000Z</wml2:time>
+ <wml2:value>16.42</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T20:00:00.000Z</wml2:time>
+ <wml2:value>26.14</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T21:00:00.000Z</wml2:time>
+ <wml2:value>15.22</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-07T22:00:00.000Z</wml2:time>
+ <wml2:value>26.41</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+</sos:GetObservationResponse>
diff --git a/tests/resources/sos_52n_getobservation_wml2_response.xml b/tests/resources/sos_52n_getobservation_wml2_response.xml
new file mode 100644
index 0000000..44decbf
--- /dev/null
+++ b/tests/resources/sos_52n_getobservation_wml2_response.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:GetObservationResponse xmlns:sos="http://www.opengis.net/sos/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:om="http://www.opengis.net/om/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:wml2="http://www.opengis.net/waterml/2.0" xsi:schemaLocation="http://www.opengis.net/waterml/2.0 http://schemas.opengis.net/waterml/2.0/waterml2.xsd http://www.opengis.net/sos/2.0 http://schemas.opengis.net/sos/2.0/sosGetObservation.x [...]
+ <sos:observationData>
+ <om:OM_Observation gml:id="o_9556E2084893FEC9C6F407458B91F194C86359D6">
+ <om:phenomenonTime>
+ <gml:TimePeriod gml:id="phenomenonTime_1">
+ <gml:beginPosition>2014-07-01T00:01:42.000Z</gml:beginPosition>
+ <gml:endPosition>2014-07-01T01:16:41.000Z</gml:endPosition>
+ </gml:TimePeriod>
+ </om:phenomenonTime>
+ <om:resultTime>
+ <gml:TimeInstant gml:id="ti_C597E726F2C23BD5C20800061BCDFD0442EF6E44">
+ <gml:timePosition>2014-07-01T00:01:42.000Z</gml:timePosition>
+ </gml:TimeInstant>
+ </om:resultTime>
+ <om:procedure xlink:href="http://geoviqua.dev.52north.org/procedures/WXT520"/>
+ <om:observedProperty xlink:href="http://geoviqua.dev.52north.org/properties/AirTemperature"/>
+ <om:featureOfInterest xlink:href="http://geoviqua.dev.52north.org/stations/Vaisala-WXT520" xlink:title="Vaisala_WXT520"/>
+ <om:result>
+ <wml2:MeasurementTimeseries gml:id="timeseries.1">
+ <wml2:metadata>
+ <wml2:TimeseriesMetadata>
+ <wml2:temporalExtent xlink:href="#phenomenonTime_1"/>
+ </wml2:TimeseriesMetadata>
+ </wml2:metadata>
+ <wml2:defaultPointMetadata>
+ <wml2:DefaultTVPMeasurementMetadata>
+ <wml2:uom code="degC"/>
+ <wml2:interpolationType xlink:href="http://www.opengis.net/def/timeseriesType/WaterML/2.0/continuous" xlink:title="Instantaneous"/>
+ </wml2:DefaultTVPMeasurementMetadata>
+ </wml2:defaultPointMetadata>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-01T00:01:42.000Z</wml2:time>
+ <wml2:value>12.2</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-01T00:16:42.000Z</wml2:time>
+ <wml2:value>12.3</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-01T00:31:42.000Z</wml2:time>
+ <wml2:value>12.0</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-01T00:46:42.000Z</wml2:time>
+ <wml2:value>11.9</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-01T01:01:42.000Z</wml2:time>
+ <wml2:value>12.1</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ <wml2:point>
+ <wml2:MeasurementTVP>
+ <wml2:time>2014-07-01T01:16:41.000Z</wml2:time>
+ <wml2:value>12.5</wml2:value>
+ </wml2:MeasurementTVP>
+ </wml2:point>
+ </wml2:MeasurementTimeseries>
+ </om:result>
+ </om:OM_Observation>
+ </sos:observationData>
+</sos:GetObservationResponse>
diff --git a/tox.ini b/tox.ini
index 295c229..8dd4d27 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
[pytest]
-addopts = -vs --color=yes --tb=native --ignore=setup.py --doctest-modules --doctest-glob 'tests/**/*.txt' --cov-report term-missing --cov owslib
+addopts = -v -rxs -s --color=yes --tb=native --ignore=setup.py --doctest-modules --doctest-glob 'tests/**/*.txt' --cov-report term-missing --cov owslib
norecursedirs = .git docs examples etc cov* *.egg* pytest* .tox
python_files=check_*.py
python_functions=check
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/owslib.git
More information about the Pkg-grass-devel
mailing list