diff -Nru owslib-0.16.0/AUTHORS.rst owslib-0.18.0/AUTHORS.rst --- owslib-0.16.0/AUTHORS.rst 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/AUTHORS.rst 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,13 @@ + * Sean Gillies + * Julien Anguenot + * Kai Lautaportti + * Dominic Lowe + * Jo Walsh + * Tom Kralidis + * Jachym Cepicky + * Luca Cinquini + * Brad Hards + * Christian Ledermann + * Sean Cowan + * Kyle Wilcox + * Angelos Tzotsos diff -Nru owslib-0.16.0/CHANGES.rst owslib-0.18.0/CHANGES.rst --- owslib-0.16.0/CHANGES.rst 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/CHANGES.rst 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,97 @@ +Changes +======= + +0.17.0 (2018-09-04) +------------------- + +- Fixed test-suite and converted doctests to unit-tests (#339). +- Support for OWS Context (#483 thanks @allixender) +- Support for WCS 2.0.0 and 2.0.1 (#430, thanks @doclements) +- numerous bug-fixes, especially for WPS. + +0.7 (2013-02-18) +--------------- + +- Support for SOS 1.0.0, SOS 2.0.0, SensorML (thanks @kwilcox) +- Support for TMS (thanks @cleder) +- numerous bug fixes + +0.6 (2012-12-22) +---------------- + +- Support for WMTS (thanks @bradh) +- packaging support (thanks @kalxas) for: + - openSUSE + - Debian +- addition of owslib.__version__ +- ISO support: + - multiple gmd:identificationInfo elements + - gmd:distributorInfo elements +- WMS + - read additional Layer attributes (thanks @elemoine) +- numerous bug fixes + +0.5 (2012-06-15) +---------------- + +- Support for the following parsers: + - WPS 1.0.0 + - WFS 1.1.0 + - CRS handling + - URNs + - URIs + - EPSG:xxxx style +- etree.py looks for lxml.etree first now +- catch WMS service exceptions on GetCapabilities +- CSW exceptions are now Pythonic + +0.4 (2011-10-02) +---------------- +- Support for the following parsers: + - CSW 2.0.2 + - OWS Common 1.0.0, 1.1.0, 2.0.0 + - Filter Encoding 1.1.0 + - ISO 19115:2003 + - FGDC CSDGM + - NASA DIF + - Dublin Core + - WFS 2.0 + - WCS 1.1 +- New SCM/bug/mailing list infrastructure +- Sphinx documentation + +0.3 (2008-05-08) +---------------- +- WCS support. +- Support for basic authorization in WMS requests (#107). + +0.2.1 (2007-08-06) +------------------ +- Added support for Python 2.5. +- Fixed ticket #105: Don't depend on Content-length in the http headers for + getfeature. + +0.2.0 (2007-02-01) +------------------ +- Change license to BSD. +- Added service contact metadata. + +0.1.0 (2006-10-19) +------------------ +- New and improved metadata API. +- Wrappers for GetCapabilities, WMS GetMap, and WFS GetFeature requests. +- Doctests. + +0.0.1 (2006-07-30) +------------------ +- Brought OWSLib up out of the PCL trunk into its own space. +- Updated the testing frameworm. +- Initial test coverage: + + Name Stmts Exec Cover Missing +====== ======= ====== ======= ========= +wms 105 68 64% 36, 41-48, 61-63, 114-118, 125-155, 172, 203-205 +wfs 74 69 93% 146, 166, 199-201 +wmc 111 0 0% 33-220 +TOTAL 290 137 47% +====== ======= ====== ======= ========= diff -Nru owslib-0.16.0/CHANGES.txt owslib-0.18.0/CHANGES.txt --- owslib-0.16.0/CHANGES.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/CHANGES.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -Changes -======= - -0.7 (2013-02-18) ---------------- - -- Support for SOS 1.0.0, SOS 2.0.0, SensorML (thanks @kwilcox) -- Support for TMS (thanks @cleder) -- numerous bug fixes - -0.6 (2012-12-22) ----------------- - -- Support for WMTS (thanks @bradh) -- packaging support (thanks @kalxas) for: - - openSUSE - - Debian -- addition of owslib.__version__ -- ISO support: - - multiple gmd:identificationInfo elements - - gmd:distributorInfo elements -- WMS - - read additional Layer attributes (thanks @elemoine) -- numerous bug fixes - -0.5 (2012-06-15) ----------------- - -- Support for the following parsers: - - WPS 1.0.0 - - WFS 1.1.0 - - CRS handling - - URNs - - URIs - - EPSG:xxxx style -- etree.py looks for lxml.etree first now -- catch WMS service exceptions on GetCapabilities -- CSW exceptions are now Pythonic - -0.4 (2011-10-02) ----------------- -- Support for the following parsers: - - CSW 2.0.2 - - OWS Common 1.0.0, 1.1.0, 2.0.0 - - Filter Encoding 1.1.0 - - ISO 19115:2003 - - FGDC CSDGM - - NASA DIF - - Dublin Core - - WFS 2.0 - - WCS 1.1 -- New SCM/bug/mailing list infrastructure -- Sphinx documentation - -0.3 (2008-05-08) ----------------- -- WCS support. -- Support for basic authorization in WMS requests (#107). - -0.2.1 (2007-08-06) ------------------- -- Added support for Python 2.5. -- Fixed ticket #105: Don't depend on Content-length in the http headers for - getfeature. - -0.2.0 (2007-02-01) ------------------- -- Change license to BSD. -- Added service contact metadata. diff -Nru owslib-0.16.0/.codacy.yml owslib-0.18.0/.codacy.yml --- owslib-0.16.0/.codacy.yml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/.codacy.yml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,4 @@ +--- +exclude_paths: + - 'tests/**' + - 'docs/conf.py' diff -Nru owslib-0.16.0/CREDITS.txt owslib-0.18.0/CREDITS.txt --- owslib-0.16.0/CREDITS.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/CREDITS.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - * Sean Gillies - * Julien Anguenot - * Kai Lautaportti - * Dominic Lowe - * Jo Walsh - * Tom Kralidis - * Jachym Cepicky - * Luca Cinquini - * Brad Hards - * Christian Ledermann - * Sean Cowan - * Kyle Wilcox - * Angelos Tzotsos diff -Nru owslib-0.16.0/debian/changelog owslib-0.18.0/debian/changelog --- owslib-0.16.0/debian/changelog 2017-12-22 11:58:43.000000000 +0000 +++ owslib-0.18.0/debian/changelog 2019-07-14 14:00:00.000000000 +0000 @@ -1,3 +1,65 @@ +owslib (0.18.0-1~bionic0) bionic; urgency=medium + + * No change rebuild for Bionic. + + -- Angelos Tzotsos Sun, 14 Jul 2019 16:00:00 +0200 + +owslib (0.18.0-1) unstable; urgency=medium + + * Team upload. + * Update gbp.conf to use --source-only-changes by default. + * Move from experimental to unstable. + + -- Bas Couwenberg Sun, 07 Jul 2019 12:23:20 +0200 + +owslib (0.18.0-1~exp1) experimental; urgency=medium + + * Team upload. + * New upstream release. + * Add upstream metadata. + + -- Bas Couwenberg Tue, 25 Jun 2019 05:48:02 +0200 + +owslib (0.17.1-1) unstable; urgency=medium + + * Team upload. + * New upstream release. + * Bump Standards-Version to 4.3.0, no changes. + * Update copyright holders. + + -- Bas Couwenberg Sun, 13 Jan 2019 09:30:10 +0100 + +owslib (0.17.0-1) unstable; urgency=medium + + * Team upload. + * New upstream release. + * Bump Standards-Version to 4.2.1, no changes. + * Refresh patches. + + -- Bas Couwenberg Thu, 20 Sep 2018 07:38:39 +0200 + +owslib (0.16.0-3) unstable; urgency=medium + + * Team upload. + * Bump Standards-Version to 4.2.0, no changes. + * Drop autopkgtests to test installability & module import. + * Add lintian override for testsuite-autopkgtest-missing. + * Update watch file to use releases instead of tags. + * Update watch file to limit matches to archive path. + + -- Bas Couwenberg Sat, 18 Aug 2018 17:42:43 +0200 + +owslib (0.16.0-2) unstable; urgency=medium + + * Team upload. + * Update Vcs-* URLs for Salsa. + * Bump Standards Version to 4.1.5, no changes. + * Add module import tests to autopkgtest configuration. + * Drop ancient X-Python-Version field. + * Change Source URL to GitHub repository. + + -- Bas Couwenberg Fri, 03 Aug 2018 08:14:38 +0200 + owslib (0.16.0-1) unstable; urgency=medium [ Bas Couwenberg ] diff -Nru owslib-0.16.0/debian/control owslib-0.18.0/debian/control --- owslib-0.16.0/debian/control 2017-12-22 11:54:05.000000000 +0000 +++ owslib-0.18.0/debian/control 2018-12-25 21:52:56.000000000 +0000 @@ -19,11 +19,10 @@ python3-all, python3-requests, python3-sphinx -Standards-Version: 4.1.2 -Vcs-Browser: https://anonscm.debian.org/cgit/pkg-grass/owslib.git -Vcs-Git: https://anonscm.debian.org/git/pkg-grass/owslib.git +Standards-Version: 4.3.0 +Vcs-Browser: https://salsa.debian.org/debian-gis-team/owslib +Vcs-Git: https://salsa.debian.org/debian-gis-team/owslib.git Homepage: https://geopython.github.com/OWSLib/ -X-Python-Version: >= 2.5 Package: python-owslib Architecture: all diff -Nru owslib-0.16.0/debian/copyright owslib-0.18.0/debian/copyright --- owslib-0.16.0/debian/copyright 2017-12-22 10:56:20.000000000 +0000 +++ owslib-0.18.0/debian/copyright 2019-01-13 08:29:08.000000000 +0000 @@ -1,44 +1,26 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Contact: Tom Kralidis Upstream-Name: OWSLib -Source: https://pypi.python.org/pypi/OWSLib +Source: https://github.com/geopython/owslib Files: * -Copyright: 2006-2016 OWSLib Contributors - * Sean Gillies - * Julien Anguenot - * Kai Lautaportti - * Dominic Lowe - * Jo Walsh - * Tom Kralidis - * Jachym Cepicky - * Luca Cinquini - * Brad Hards - * Christian Ledermann - * Sean Cowan - * Kyle Wilcox - * Angelos Tzotsos - * Brian Miles - * Eliott Sales de Andrade - * David Blodgett - * Thomas Kluyver - * Kai Lautaportti - * Richard Hattersley - * Christian Ledermann - * Luke Campbell - * Luís de Sousa - * Julien Enselme - * Dave Foster - * Nuxeo SARL - * STFC - * Pete Taylor +Copyright: 2005, Nuxeo SARL + 2004-2006, Sean C. Gillies + 2006, Ancient World Mapping Center + 2007, 2009, STFC + 2012, Brad Hards + 2013, Christian Ledermann + 2014, Pete Taylor + 2012, 2015, Jachym Cepicky + 2015, Luís de Sousa + 2008-2011, 2013, 2015, 2018, Tom Kralidis + 2018, Luca Cinquini License: BSD-3-Clause Files: debian/* -Copyright: 2014-2016 - * Angelos Tzotsos - * Johan Van de Wauw - * Bas Couwenberg +Copyright: 2014-2016, Angelos Tzotsos + 2014-2016, Johan Van de Wauw + 2014-2016, Bas Couwenberg License: BSD-3-Clause License: BSD-3-Clause @@ -65,4 +47,3 @@ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff -Nru owslib-0.16.0/debian/gbp.conf owslib-0.18.0/debian/gbp.conf --- owslib-0.16.0/debian/gbp.conf 2017-12-22 10:56:20.000000000 +0000 +++ owslib-0.18.0/debian/gbp.conf 2019-07-07 07:28:39.000000000 +0000 @@ -14,3 +14,6 @@ # Always use pristine-tar. pristine-tar = True + +[buildpackage] +pbuilder-options = --source-only-changes diff -Nru owslib-0.16.0/debian/patches/fixprivacybreaches owslib-0.18.0/debian/patches/fixprivacybreaches --- owslib-0.16.0/debian/patches/fixprivacybreaches 2017-12-22 10:56:20.000000000 +0000 +++ owslib-0.18.0/debian/patches/fixprivacybreaches 2018-09-20 05:37:58.000000000 +0000 @@ -3,7 +3,7 @@ --- a/docs/en/index.rst +++ b/docs/en/index.rst -@@ -5,11 +5,7 @@ +@@ -5,11 +5,7 @@ OWSLib |release| documentation .. toctree:: :maxdepth: 2 diff -Nru owslib-0.16.0/debian/source/lintian-overrides owslib-0.18.0/debian/source/lintian-overrides --- owslib-0.16.0/debian/source/lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/debian/source/lintian-overrides 2018-08-06 08:55:08.000000000 +0000 @@ -0,0 +1,3 @@ +# Not worth the effort +testsuite-autopkgtest-missing + diff -Nru owslib-0.16.0/debian/tests/control owslib-0.18.0/debian/tests/control --- owslib-0.16.0/debian/tests/control 2017-12-22 11:48:05.000000000 +0000 +++ owslib-0.18.0/debian/tests/control 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -# Test installability -Depends: @ -Test-Command: /bin/true diff -Nru owslib-0.16.0/debian/upstream/metadata owslib-0.18.0/debian/upstream/metadata --- owslib-0.16.0/debian/upstream/metadata 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/debian/upstream/metadata 2019-06-25 03:57:26.000000000 +0000 @@ -0,0 +1,6 @@ +--- +Bug-Database: https://github.com/geopython/OWSLib/issues +Bug-Submit: https://github.com/geopython/OWSLib/issues/new +Name: OWSLib +Repository: https://github.com/geopython/OWSLib.git +Repository-Browse: https://github.com/geopython/OWSLib diff -Nru owslib-0.16.0/debian/watch owslib-0.18.0/debian/watch --- owslib-0.16.0/debian/watch 2017-12-22 10:56:20.000000000 +0000 +++ owslib-0.18.0/debian/watch 2018-08-15 17:02:44.000000000 +0000 @@ -3,5 +3,5 @@ dversionmangle=s/\+(debian|dfsg|ds|deb)\d*$//,\ uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\d*)$/$1~$2/,\ filenamemangle=s/(?:.*?)?[vr]?(\d[\d\.\-\w]*)\.(tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz)))/owslib-$1.$2/ \ -https://github.com/geopython/owslib/tags \ -(?:.*/)?(?:rel|r|v|owslib)?[\-\_]?(\d[\d\-\.]+)\.(?:tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz))) +https://github.com/geopython/owslib/releases \ +(?:.*?/archive/)?(?:rel|r|v|owslib)?[\-\_]?(\d[\d\-\.]+)\.(?:tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz))) diff -Nru owslib-0.16.0/DEPENDENCIES.txt owslib-0.18.0/DEPENDENCIES.txt --- owslib-0.16.0/DEPENDENCIES.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/DEPENDENCIES.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -- elementtree or lxml diff -Nru owslib-0.16.0/docs/en/index.rst owslib-0.18.0/docs/en/index.rst --- owslib-0.16.0/docs/en/index.rst 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/docs/en/index.rst 2019-06-25 00:00:28.000000000 +0000 @@ -34,7 +34,7 @@ +===================+=====================+ | `OGC WMS`_ | 1.1.1 | +-------------------+---------------------+ -| `OGC WFS`_ | 1.0.0, 1.1.0, 2.0.0 | +| `OGC WFS`_ | 1.0.0, 1.1.0, 2.0.0, 3.0 | +-------------------+---------------------+ | `OGC WCS`_ | 1.0.0, 1.1.0 | +-------------------+---------------------+ @@ -52,6 +52,8 @@ +-------------------+---------------------+ | `OGC OWS Common`_ | 1.0.0, 1.1.0, 2.0 | +-------------------+---------------------+ +| `OGC OWS Context`_ | 1.0.0 (alpha/under-review) | ++-------------------+---------------------+ | `NASA DIF`_ | 9.7 | +-------------------+---------------------+ | `FGDC CSDGM`_ | 1998 | @@ -97,9 +99,9 @@ .. note:: - The OWSLib conda packages are provided by the community, not OSGEO, and therefore there may be + 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. + However usually conda-forge will be the most up-to-date. .. code-block:: bash @@ -134,6 +136,7 @@ As of Fedora 20, OWSLib is part of the Fedora core package collection .. code-block:: bash + $ yum install OWSLib Usage @@ -282,6 +285,36 @@ >>> response = wfs20.getfeature(storedQueryID='urn:ogc:def:query:OGC-WFS::GetFeatureById', storedQueryParams={'ID':'gmd_ex.1'}) +WFS 3.0 +------- + +WFS 3.0 is a clean break from the traditional OGC service architecture +(RESTful, JSON, OpenAPI) and as such OWSLib the code follows the same pattern. + +.. code-block:: python + + >>> from owslib.wfs import WebFeatureService + >>> w = WebFeatureService('https://geo.kralidis.ca/pygeoapi', version='3.0') + >>> w.url + 'http://geo.kralidis.ca/pygeoapi/' + >>> w.version + '3.0' + >>> conformance = w.conformance() + {u'conformsTo': [u'http://www.opengis.net/spec/wfs-1/3.0/req/core', u'http://www.opengis.net/spec/wfs-1/3.0/req/oas30', u'http://www.opengis.net/spec/wfs-1/3.0/req/html', u'http://www.opengis.net/spec/wfs-1/3.0/req/geojson']} + >>> api = w.api() # OpenAPI definition + >>> collections = w.collections() + >>> len(collections) + 3 + >>> lakes = w.collection('lakes') + >>> lakes['name'] + 'lakes' + >>> lakes['title'] + 'Large Lakes' + >>> lakes['description'] + 'lakes of the world, public domain' + >>> lakes_query = w.collection_items('lakes') + >>> lakes_query['features'][0]['properties'] + {u'scalerank': 0, u'name_alt': None, u'admin': None, u'featureclass': u'Lake', u'id': 0, u'name': u'Lake Baikal'} WCS --- @@ -320,7 +353,7 @@ {'matches': 101, 'nextrecord': 21, 'returned': 20} >>> for rec in csw.records: ... print(csw.records[rec].title) - ... + ... ALLSPECIES NatureServe Canada References Bird Studies Canada - BirdMap WMS @@ -420,186 +453,7 @@ WPS --- -Inspect a remote WPS and retrieve the supported processes: - -.. code-block:: python - - >>> from owslib.wps import WebProcessingService - >>> wps = WebProcessingService('http://cida.usgs.gov/climate/gdp/process/WebProcessingService', verbose=False, skip_caps=True) - >>> wps.getcapabilities() - >>> wps.identification.type - 'WPS' - >>> wps.identification.title - 'Geo Data Portal WPS Processing' - >>> wps.identification.abstract - 'Geo Data Portal WPS Processing' - >>> for operation in wps.operations: - ... operation.name - ... - 'GetCapabilities' - 'DescribeProcess' - 'Execute' - >>> for process in wps.processes: - ... process.identifier, process.title - ... - ('gov.usgs.cida.gdp.wps.algorithm.FeatureCoverageIntersectionAlgorithm', 'Feature Coverage WCS Intersection') - ('gov.usgs.cida.gdp.wps.algorithm.FeatureCoverageOPeNDAPIntersectionAlgorithm', 'Feature Coverage OPeNDAP Intersection') - ('gov.usgs.cida.gdp.wps.algorithm.FeatureCategoricalGridCoverageAlgorithm', 'Feature Categorical Grid Coverage') - ('gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm', 'Feature Weighted Grid Statistics') - ('gov.usgs.cida.gdp.wps.algorithm.FeatureGridStatisticsAlgorithm', 'Feature Grid Statistics') - ('gov.usgs.cida.gdp.wps.algorithm.PRMSParameterGeneratorAlgorithm', 'PRMS Parameter Generator') - >>> - - -Determine how a specific process needs to be invoked - i.e. what are its input parameters, and output result: - -.. code-block:: python - - >>> from owslib.wps import printInputOutput - >>> process = wps.describeprocess('gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm') - >>> process.identifier - 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' - >>> process.title - 'Feature Weighted Grid Statistics' - >>> process.abstract - 'This algorithm generates area weighted statistics of a gridded dataset for a set of vector polygon features. Using the bounding-box that encloses ... - >>> for input in process.dataInputs: - ... printInputOutput(input) - ... - identifier=FEATURE_COLLECTION, title=Feature Collection, abstract=A feature collection encoded as a WFS request or one of the supported GML profiles.,... - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.0.0/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.1/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.2/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.2.1/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.0.0/base/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.0.1/base/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.1.0/base/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.1.1/base/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.2.1/base/feature.xsd - Default Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.0.0/feature.xsd - minOccurs=1, maxOccurs=1 - identifier=DATASET_URI, title=Dataset URI, abstract=The base data web service URI for the dataset of interest., data type=anyURI - Allowed Value: AnyValue - Default Value: None - minOccurs=1, maxOccurs=1 - identifier=DATASET_ID, title=Dataset Identifier, abstract=The unique identifier for the data type or variable of interest., data type=string - Allowed Value: AnyValue - Default Value: None - minOccurs=1, maxOccurs=2147483647 - identifier=REQUIRE_FULL_COVERAGE, title=Require Full Coverage, abstract=If turned on, the service will require that the dataset of interest .... - Allowed Value: True - Default Value: True - minOccurs=1, maxOccurs=1 - identifier=TIME_START, title=Time Start, abstract=The date to begin analysis., data type=dateTime - Allowed Value: AnyValue - Default Value: None - minOccurs=0, maxOccurs=1 - identifier=TIME_END, title=Time End, abstract=The date to end analysis., data type=dateTime - Allowed Value: AnyValue - Default Value: None - minOccurs=0, maxOccurs=1 - identifier=FEATURE_ATTRIBUTE_NAME, title=Feature Attribute Name, abstract=The attribute that will be used to label column headers in processing output., ... - Allowed Value: AnyValue - Default Value: None - minOccurs=1, maxOccurs=1 - identifier=DELIMITER, title=Delimiter, abstract=The delimiter that will be used to separate columns in the processing output., data type=string - Allowed Value: COMMA - Allowed Value: TAB - Allowed Value: SPACE - Default Value: COMMA - minOccurs=1, maxOccurs=1 - identifier=STATISTICS, title=Statistics, abstract=Statistics that will be returned for each feature in the processing output., data type=string - Allowed Value: MEAN - Allowed Value: MINIMUM - Allowed Value: MAXIMUM - Allowed Value: VARIANCE - Allowed Value: STD_DEV - Allowed Value: SUM - Allowed Value: COUNT - Default Value: None - minOccurs=1, maxOccurs=7 - identifier=GROUP_BY, title=Group By, abstract=If multiple features and statistics are selected, this will change whether the processing output ... - Allowed Value: STATISTIC - Allowed Value: FEATURE_ATTRIBUTE - Default Value: None - minOccurs=1, maxOccurs=1 - identifier=SUMMARIZE_TIMESTEP, title=Summarize Timestep, abstract=If selected, processing output will include columns with summarized statistics ... - Allowed Value: True - Default Value: True - minOccurs=0, maxOccurs=1 - identifier=SUMMARIZE_FEATURE_ATTRIBUTE, title=Summarize Feature Attribute, abstract=If selected, processing output will include a final row of ... - Allowed Value: True - Default Value: True - minOccurs=0, maxOccurs=1 - >>> for output in process.processOutputs: - ... printInputOutput(output) - ... - identifier=OUTPUT, title=Output File, abstract=A delimited text file containing requested process output., data type=ComplexData - Supported Value: mimeType=text/csv, encoding=UTF-8, schema=None - Default Value: mimeType=text/csv, encoding=UTF-8, schema=None - reference=None, mimeType=None - >>> - -Submit a processing request (extraction of a climate index variable over a specific GML polygon, for a given period of time), monitor the execution until complete: - -.. code-block:: python - - >>> from owslib.wps import GMLMultiPolygonFeatureCollection - >>> polygon = [(-102.8184, 39.5273), (-102.8184, 37.418), (-101.2363, 37.418), (-101.2363, 39.5273), (-102.8184, 39.5273)] - >>> featureCollection = GMLMultiPolygonFeatureCollection( [polygon] ) - >>> processid = 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' - >>> inputs = [ ("FEATURE_ATTRIBUTE_NAME","the_geom"), - ... ("DATASET_URI", "dods://cida.usgs.gov/qa/thredds/dodsC/derivatives/derivative-days_above_threshold.pr.ncml"), - ... ("DATASET_ID", "ensemble_b1_pr-days_above_threshold"), - ... ("TIME_START","2010-01-01T00:00:00.000Z"), - ... ("TIME_END","2011-01-01T00:00:00.000Z"), - ... ("REQUIRE_FULL_COVERAGE","false"), - ... ("DELIMITER","COMMA"), - ... ("STATISTICS","MEAN"), - ... ("GROUP_BY","STATISTIC"), - ... ("SUMMARIZE_TIMESTEP","false"), - ... ("SUMMARIZE_FEATURE_ATTRIBUTE","false"), - ... ("FEATURE_COLLECTION", featureCollection) - ... ] - >>> output = "OUTPUT" - >>> execution = wps.execute(processid, inputs, output = "OUTPUT") - Executing WPS request... - Execution status=ProcessStarted - >>> from owslib.wps import monitorExecution - >>> monitorExecution(execution) - - Checking execution status... (location=http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=6809217153012787208) - Execution status=ProcessSucceeded - Execution status: ProcessSucceeded - Output URL=http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=6809217153012787208OUTPUT.3cbcd666-a912-456f-84a3-6ede450aca95 - >>> - -Alternatively, define the feature through an embedded query to a WFS server: - -.. code-block:: python - - >>> from owslib.wps import WFSQuery, WFSFeatureCollection - >>> wfsUrl = "http://cida.usgs.gov/climate/gdp/proxy/http://igsarm-cida-gdp2.er.usgs.gov:8082/geoserver/wfs" - >>> query = WFSQuery("sample:CONUS_States", propertyNames=['the_geom',"STATE"], filters=["CONUS_States.508","CONUS_States.469"]) - >>> featureCollection = WFSFeatureCollection(wfsUrl, query) - >>> # same process submission as above - ... - -You can also submit a pre-made request encoded as WPS XML: - -.. code-block:: python - - >>> request = open('/Users/cinquini/Documents/workspace-cog/wps/tests/resources/wps_USGSExecuteRequest1.xml','rb').read() - >>> execution = wps.execute(None, [], request=request) - Executing WPS request... - Execution status=ProcessStarted - >>> monitorExecution(execution) - - Checking execution status... (location=http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=5103866488472745994) - Execution status=ProcessSucceeded - Execution status: ProcessSucceeded - Output URL=http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=5103866488472745994OUTPUT.f80e2a78-96a9-4343-9777-be60fac5b256 - +.. include:: ../../tests/_broken/doctests_sphinx/wps_example_usgs.txt SOS 1.0 ------- @@ -614,13 +468,16 @@ SOS 2.0 ------- + Examples of service metadata and GetObservation ++++++++++++++++++++++++++++++++++++++++++++++++ -.. include:: ../../tests/doctests/sos_20_52n_geoviqua.txt +.. include:: ../../tests/_broken/doctests_sphinx/sos_20_52N_demo.txt Using the GetObservation response decoder for O&M and WaterML2.0 results +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -.. include:: ../../tests/doctests/sos_20_timeseries_decoder_ioos.txt +.. include:: ../../tests/_broken/doctests_sphinx/sos_20_timeseries_decoder_ioos.txt SensorML -------- @@ -663,7 +520,7 @@ WMTS ---- -.. include:: ../../tests/doctests/wmts.txt +.. include:: ../../tests/_broken/doctests_sphinx/wmts_demo.txt Result: @@ -677,6 +534,41 @@ .. include:: ../../tests/doctests/wml11_cuahsi.txt +OGC OWS Context 1.0.0 Atom CML and GeoJSON Encoding (alpha/under-review) +------------------------------------------------------------------------ + +The OGC OWS Context implementation in OWSlib is currently in alpha and under review, and will still be improved. +Please get in touch if you (want to) use it and provide feedback on how more comfortable it should be +(especially handling geometries and dates in different encodings) and if it doesn't treat your "standards-compliant" OWS Context document right. +Greatly appreciated :-) + +Basic reading/parsing of OGC Web Services Context Documents (OWS Context) in OWC Atom 1.0.0 Encoding and OWC GeoJSON 1.0.0 Encoding Standards: + +.. include:: ../../tests/doctests/owscontext.txt + +additionally, possibility to construct OWS Context documents from scratch, and then write/serialise into OWC Atom 1.0.0 Encoding or OWC GeoJSON 1.0.0 Encoding Standards: + +.. code-block:: python + + >>> from owslib.owscontext.core import OwcResource, OwcContext + >>> myContext=OwcContext(id='http://my.url.com/context/id/1', + update_date='2017-11-02T15:24:24.446+12:00', + title='Awesome new Context doc') + >>> myContext.rights='Creative Commons 4.0 BY' + >>> myEntry=OwcResource(id='http://my.url.com/resource/demo-feature-1', + update_date='2017-11-02T15:24:24.446+12:00', + title='This is a feature') + >>> contributor={'name': 'Alex K', + 'email': None, + 'uri': 'https://allixender.blogspot.com'} + >>> myEntry.authors.append(contributor) + + >>> # ... here also continue to build your OGC data offerings, e.g. WMS GetMap etc. + + >>> myContext.resources.append(myEntry) + >>> myContext.to_json() + >>> myContext.to_atomxml() + Development =========== @@ -684,7 +576,7 @@ The OWSLib source code is available at https://github.com/geopython/OWSLib -You can find out about software metrics at the OWSLib ohloh page at http://www.ohloh.net/p/OWSLib. +You can find out about software metrics at the OWSLib OpenHub page at https://www.openhub.net/p/OWSLib. Testing ------- @@ -713,7 +605,7 @@ Mailing Lists ------------- -OWSLib provides users and developers mailing lists. Subscription options and archives are available at http://lists.osgeo.org/mailman/listinfo/owslib-users and http://lists.osgeo.org/mailman/listinfo/owslib-devel. +OWSLib provides users and developers mailing lists. Subscription options and archives are available at https://lists.osgeo.org/mailman/listinfo/owslib-users and https://lists.osgeo.org/mailman/listinfo/owslib-devel. Submitting Questions to Community --------------------------------- @@ -723,12 +615,12 @@ Searching the Archives ---------------------- -All Community archives are located in http://lists.osgeo.org/pipermail/owslib-users/ http://lists.osgeo.org/pipermail/owslib-devel/ +All Community archives are located in https://lists.osgeo.org/pipermail/owslib-users/ https://lists.osgeo.org/pipermail/owslib-devel/ Metrics ------- -You can find out about software metrics at the OWSLib `ohloh`_ page. +You can find out about software metrics at the OWSLib `OpenHub`_ page. IRC --- @@ -783,29 +675,30 @@ Credits ======= -.. include:: ../../CREDITS.txt +.. include:: ../../AUTHORS.rst -.. _`Open Geospatial Consortium`: http://www.opengeospatial.org/ -.. _`OGC WMS`: http://www.opengeospatial.org/standards/wms -.. _`OGC WFS`: http://www.opengeospatial.org/standards/wfs -.. _`OGC WCS`: http://www.opengeospatial.org/standards/wcs -.. _`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 -.. _`OGC Filter`: http://www.opengeospatial.org/standards/filter -.. _`OGC OWS Common`: http://www.opengeospatial.org/standards/common -.. _`NASA DIF`: http://gcmd.nasa.gov/User/difguide/ -.. _`FGDC CSDGM`: http://www.fgdc.gov/metadata/csdgm -.. _`ISO 19115`: http://www.iso.org/iso/catalogue_detail.htm?csnumber=26020 -.. _`ISO 19139`: http://www.iso.org/iso/catalogue_detail.htm?csnumber=32557 -.. _`Dublin Core`: http://www.dublincore.org/ -.. _`freenode`: http://freenode.net/ -.. _`ohloh`: http://www.ohloh.net/p/OWSLib +.. _`Open Geospatial Consortium`: https://www.opengeospatial.org/ +.. _`OGC WMS`: https://www.opengeospatial.org/standards/wms +.. _`OGC WFS`: https://www.opengeospatial.org/standards/wfs +.. _`OGC WCS`: https://www.opengeospatial.org/standards/wcs +.. _`OGC WMC`: https://www.opengeospatial.org/standards/wmc +.. _`OGC WPS`: https://www.opengeospatial.org/standards/wps +.. _`OGC SOS`: https://www.opengeospatial.org/standards/sos +.. _`OGC O&M`: https://www.opengeospatial.org/standards/om +.. _`OGC WaterML2.0`: https://www.opengeospatial.org/standards/waterml +.. _`OGC SensorML`: https://www.opengeospatial.org/standards/sensorml +.. _`OGC CSW`: https://www.opengeospatial.org/standards/cat +.. _`OGC WMTS`: https://www.opengeospatial.org/standards/wmts +.. _`OGC Filter`: https://www.opengeospatial.org/standards/filter +.. _`OGC OWS Common`: https://www.opengeospatial.org/standards/common +.. _`OGC OWS Context`: https://www.opengeospatial.org/standards/owc +.. _`NASA DIF`: https://earthdata.nasa.gov/esdis/eso/standards-and-references/directory-interchange-format-dif-standard +.. _`FGDC CSDGM`: https://www.fgdc.gov/metadata/csdgm-standard +.. _`ISO 19115`: https://www.iso.org/standard/26020.html +.. _`ISO 19139`: https://www.iso.org/standard/32557.html +.. _`Dublin Core`: https://www.dublincore.org/ +.. _`freenode`: https://freenode.net/ +.. _`OpenHub`: https://www.openhub.net/p/OWSLib .. _`CIA.vc`: http://cia.vc/stats/project/OWSLib .. _`WaterML`: http://his.cuahsi.org/wofws.html#waterml -.. _`Swiss GM03`: http://www.geocat.ch/internet/geocat/en/home/documentation/gm03.html +.. _`Swiss GM03`: https://www.geocat.admin.ch/en/dokumentation/gm03.html diff -Nru owslib-0.16.0/examples/wps-birdhouse.py owslib-0.18.0/examples/wps-birdhouse.py --- owslib-0.16.0/examples/wps-birdhouse.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/examples/wps-birdhouse.py 2019-06-25 00:00:28.000000000 +0000 @@ -16,8 +16,9 @@ processid = 'dummyprocess' inputs = [("input1", '1'), ("input2", '2')] - # list of tuple (output identifier, asReference attribute) - outputs = [("output1",True), ("output2",False)] + # list of tuple (output identifier, asReference attribute, mimeType attribute) + # when asReference or mimeType is None - the wps service will use its default option + outputs = [("output1",True,'some/mime-type'), ("output2",False,None)] execution = wps.execute(processid, inputs, output=outputs) monitorExecution(execution) @@ -47,8 +48,9 @@ processid = 'wordcount' textdoc = ComplexDataInput("http://www.gutenberg.org/files/28885/28885-h/28885-h.htm") # alice in wonderland inputs = [("text", textdoc)] - # list of tuple (output identifier, asReference attribute) - outputs = [("output",True)] + # list of tuple (output identifier, asReference attribute, mimeType attribute) + # when asReference or mimeType is None - the wps service will use its default option + outputs = [("output",True,'some/mime-type')] execution = wps.execute(processid, inputs, output=outputs) monitorExecution(execution) @@ -72,8 +74,9 @@ processid = 'wordcount' textdoc = ComplexDataInput("ALICE was beginning to get very tired ...") # alice in wonderland inputs = [("text", textdoc)] - # list of tuple (output identifier, asReference attribute) - outputs = [("output",True)] + # list of tuple (output identifier, asReference attribute, mimeType attribute) + # when asReference or mimeType is None - the wps service will use its default option + outputs = [("output",True,'some/mime-type')] execution = wps.execute(processid, inputs, output=outputs) monitorExecution(execution) diff -Nru owslib-0.16.0/HISTORY.txt owslib-0.18.0/HISTORY.txt --- owslib-0.16.0/HISTORY.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/HISTORY.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -HISTORY -======= - -OWSLib 0.1: 19 October 2006 ---------------------------- -- New and improved metadata API. -- Wrappers for GetCapabilities, WMS GetMap, and WFS GetFeature requests. -- Doctests. - -OWSLib 0.0: 30 July 2006 ------------------------- -- Brought OWSLib up out of the PCL trunk into its own space. -- Updated the testing frameworm. -- Initial test coverage: - -Name Stmts Exec Cover Missing -------------------------------------- -wms 105 68 64% 36, 41-48, 61-63, 114-118, 125-155, 172, 203-205 -wfs 74 69 93% 146, 166, 199-201 -wmc 111 0 0% 33-220 -------------------------------------- -TOTAL 290 137 47% - diff -Nru owslib-0.16.0/INSTALL.txt owslib-0.18.0/INSTALL.txt --- owslib-0.16.0/INSTALL.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/INSTALL.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -See http://geopython.github.io/OWSLib/#installation diff -Nru owslib-0.16.0/LICENSE owslib-0.18.0/LICENSE --- owslib-0.16.0/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/LICENSE 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2006, Ancient World Mapping Center +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru owslib-0.16.0/LICENSE.txt owslib-0.18.0/LICENSE.txt --- owslib-0.16.0/LICENSE.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/LICENSE.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ - -Copyright (c) 2006, Ancient World Mapping Center -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the Ancient World Mapping Center nor the names of - its contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - diff -Nru owslib-0.16.0/MANIFEST.in owslib-0.18.0/MANIFEST.in --- owslib-0.16.0/MANIFEST.in 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/MANIFEST.in 2019-06-25 00:00:28.000000000 +0000 @@ -1 +1,4 @@ -include *.txt \ No newline at end of file +include *.txt +include LICENSE +include *.rst +recursive-include owslib diff -Nru owslib-0.16.0/owslib/coverage/wcs100.py owslib-0.18.0/owslib/coverage/wcs100.py --- owslib-0.16.0/owslib/coverage/wcs100.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/coverage/wcs100.py 2019-06-25 00:00:28.000000000 +0000 @@ -32,6 +32,7 @@ """Abstraction for OGC Web Coverage Service (WCS), version 1.0.0 Implements IWebCoverageService. """ + def __getitem__(self,name): ''' check contents dictionary to allow dict like access to service layers''' if name in self.__getattribute__('contents').keys(): @@ -39,12 +40,13 @@ else: raise KeyError("No content named %s" % name) - def __init__(self,url,xml, cookies): + def __init__(self,url,xml, cookies, auth=None): + super(WebCoverageService_1_0_0, self).__init__(auth) self.version='1.0.0' self.url = url self.cookies=cookies # initialize from saved capability document or access the server - reader = WCSCapabilitiesReader(self.version, self.cookies) + reader = WCSCapabilitiesReader(self.version, self.cookies, self.auth) if xml: self._capabilities = reader.readString(xml) else: @@ -87,8 +89,7 @@ #exceptions self.exceptions = [f.text for f \ in self._capabilities.findall('Capability/Exception/Format')] - - + def items(self): '''supports dict-like items() access''' items=[] @@ -161,12 +162,8 @@ if log.isEnabledFor(logging.DEBUG): log.debug('WCS 1.0.0 DEBUG: Second part of URL: %s'%data) - - u=openURL(base_url, data, method, self.cookies) - + u = openURL(base_url, data, method, self.cookies, auth=self.auth) return u - - def getOperationByName(self, name): """Return a named operation item.""" diff -Nru owslib-0.16.0/owslib/coverage/wcs110.py owslib-0.18.0/owslib/coverage/wcs110.py --- owslib-0.16.0/owslib/coverage/wcs110.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/coverage/wcs110.py 2019-06-25 00:00:28.000000000 +0000 @@ -54,12 +54,13 @@ else: raise KeyError("No content named %s" % name) - def __init__(self,url,xml, cookies): + def __init__(self,url,xml, cookies, auth=None): + super(WebCoverageService_1_1_0, self).__init__(auth=auth) self.url = url self.cookies=cookies # initialize from saved capability document or access the server - reader = WCSCapabilitiesReader(self.version) + reader = WCSCapabilitiesReader(self.version, self.cookies, self.auth) if xml: self._capabilities = reader.readString(xml) else: @@ -192,7 +193,7 @@ if gridoffsets: request['gridoffsets']=gridoffsets - #anything else e.g. vendor specific parameters must go through kwargs + #anything else e.g. vendor specific parameters must go through kwargs if kwargs: for kw in kwargs: request[kw]=kwargs[kw] @@ -200,7 +201,7 @@ #encode and request data = urlencode(request) - u=openURL(base_url, data, method, self.cookies) + u = openURL(base_url, data, method, self.cookies, auth=self.auth) return u diff -Nru owslib-0.16.0/owslib/coverage/wcs200.py owslib-0.18.0/owslib/coverage/wcs200.py --- owslib-0.16.0/owslib/coverage/wcs200.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/owslib/coverage/wcs200.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,415 @@ +# -*- coding: ISO-8859-15 -*- +# ============================================================================= +# Copyright (c) 2004, 2006 Sean C. Gillies +# Copyright (c) 2007 STFC +# +# Authors : +# Oliver Clements +# +# Contact email: olcl@pml.ac.uk +# ============================================================================= + +##########NOTE: Does not conform to new interfaces yet ################# + + +from __future__ import (absolute_import, division, print_function) + +from owslib.coverage.wcsBase import WCSBase, WCSCapabilitiesReader, ServiceException +from owslib.ows import OwsCommon, ServiceIdentification, ServiceProvider, OperationsMetadata + +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode +from owslib.util import openURL, testXMLValue +from owslib.etree import etree +from owslib.crs import Crs +import os, errno +import dateutil.parser as parser +from datetime import timedelta +import logging +from owslib.util import log, datetime_from_ansi, datetime_from_iso + +# function to save writing out WCS namespace in full each time +def ns(tag): + return '{http://www.opengis.net/ows/2.0}'+tag + +def nsWCS2(tag): + return '{http://www.opengis.net/wcs/2.0}'+tag + +class WebCoverageService_2_0_0(WCSBase): + """Abstraction for OGC Web Coverage Service (WCS), version 2.0.0 + Implements IWebCoverageService. + """ + 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,xml, cookies, auth=None): + super(WebCoverageService_2_0_0, self).__init__(auth=auth) + self.version='2.0.0' + self.url = url + self.cookies=cookies + self.ows_common = OwsCommon(version='2.0.0') + # initialize from saved capability document or access the server + reader = WCSCapabilitiesReader(self.version, self.cookies, self.auth) + if xml: + self._capabilities = reader.readString(xml) + else: + self._capabilities = reader.read(self.url) + + # check for exceptions + se = self._capabilities.find('ServiceException') + + if se is not None: + err_message = str(se.text).strip() + raise ServiceException(err_message, xml) + + #serviceIdentification metadata + subelem=self._capabilities.find(ns('ServiceIdentification')) + self.identification=ServiceIdentification(subelem, namespace=self.ows_common.namespace) + + #serviceProvider metadata + serviceproviderelem=self._capabilities.find(ns('ServiceProvider')) + self.provider=ServiceProvider(serviceproviderelem, namespace=self.ows_common.namespace) + + #serviceOperations metadata + self.operations=[] + for elem in self._capabilities.find(ns('OperationsMetadata'))[:]: + if elem.tag !=ns('ExtendedCapabilities'): + self.operations.append(OperationsMetadata(elem, namespace=self.ows_common.namespace)) + + #serviceContents metadata + self.contents={} + for elem in self._capabilities.findall(nsWCS2('Contents/')+nsWCS2('CoverageSummary')): + cm=ContentMetadata(elem, self) + self.contents[cm.id]=cm + + + + #exceptions + self.exceptions = [f.text for f \ + in self._capabilities.findall('Capability/Exception/Format')] + + + def items(self): + '''supports dict-like items() access''' + items=[] + for item in self.contents: + items.append((item,self.contents[item])) + return items + + def __makeString(self,value): + #using repr unconditionally breaks things in some circumstances if a value is already a string + if type(value) is not str: + sval=repr(value) + else: + sval = value + return sval + + def getCoverage(self, identifier=None, bbox=None, time=None, format = None, subsets=None,crs=None, width=None, height=None, resx=None, resy=None, resz=None,parameter=None,method='Get',**kwargs): + """Request and return a coverage from the WCS as a file-like object + note: additional **kwargs helps with multi-version implementation + core keyword arguments should be supported cross version + example: + cvg=wcs.getCoverage(identifier=['TuMYrRQ4'], timeSequence=['2792-06-01T00:00:00.0'], bbox=(-112,36,-106,41),format='cf-netcdf') + + is equivalent to: + http://myhost/mywcs?SERVICE=WCS&REQUEST=GetCoverage&IDENTIFIER=TuMYrRQ4&VERSION=1.1.0&BOUNDINGBOX=-180,-90,180,90&TIME=2792-06-01T00:00:00.0&FORMAT=cf-netcdf + + example 2.0.1 URL + http://earthserver.pml.ac.uk/rasdaman/ows?&SERVICE=WCS&VERSION=2.0.1&REQUEST=GetCoverage + &COVERAGEID=V2_monthly_CCI_chlor_a_insitu_test&SUBSET=Lat(40,50)&SUBSET=Long(-10,0)&SUBSET=ansi(144883,145000)&FORMAT=application/netcdf + + cvg=wcs.getCoverage(identifier=['myID'], format='application/netcdf', subsets=[('axisName',min,max),('axisName',min,max),('axisName',min,max)]) + + + """ + if log.isEnabledFor(logging.DEBUG): + log.debug('WCS 2.0.0 DEBUG: Parameters passed to GetCoverage: identifier=%s, bbox=%s, time=%s, format=%s, crs=%s, width=%s, height=%s, resx=%s, resy=%s, resz=%s, parameter=%s, method=%s, other_arguments=%s'%(identifier, bbox, time, format, crs, width, height, resx, resy, resz, parameter, method, str(kwargs))) + + try: + base_url = next((m.get('url') for m in self.getOperationByName('GetCoverage').methods if m.get('type').lower() == method.lower())) + except StopIteration: + base_url = self.url + + if log.isEnabledFor(logging.DEBUG): + log.debug('WCS 2.0.0 DEBUG: base url of server: %s'%base_url) + + request = {'version': self.version, 'request': 'GetCoverage', 'service':'WCS'} + assert len(identifier) > 0 + request['CoverageID']=identifier[0] + + + if crs: + request['crs']=crs + request['format']=format + if width: + request['width']=width + if height: + request['height']=height + + #anything else e.g. vendor specific parameters must go through kwargs + if kwargs: + for kw in kwargs: + request[kw]=kwargs[kw] + + #encode and request + data = urlencode(request) + if subsets: + for subset in subsets: + if len(subset) > 2: + if not self.is_number(subset[1]): + data = data + "&"+ urlencode({"subset":subset[0]+'("'+self.__makeString(subset[1])+'","'+self.__makeString(subset[2])+'")'}) + else: + data = data + "&"+ urlencode({"subset":subset[0]+'('+self.__makeString(subset[1])+','+self.__makeString(subset[2])+')'}) + else: + if not self.is_number(subset[1]): + data = data + "&"+ urlencode({"subset":subset[0]+'("'+self.__makeString(subset[1])+'")'}) + else: + data = data + "&"+ urlencode({"subset":subset[0]+'('+self.__makeString(subset[1])+')'}) + + + if log.isEnabledFor(logging.DEBUG): + log.debug('WCS 2.0.0 DEBUG: Second part of URL: %s'%data) + + u = openURL(base_url, data, method, self.cookies, auth=self.auth) + return u + + def is_number(self,s): + """simple helper to test if value is number as requests with numbers dont + need quote marks + """ + try: + float(s) + return True + except ValueError: + return False + + def getOperationByName(self, name): + """Return a named operation item.""" + for item in self.operations: + if item.name == name: + return item + raise KeyError("No operation named %s" % name) + + + +class ContentMetadata(object): + """ + Implements IContentMetadata + """ + def __init__(self, elem, service): + """Initialize. service is required so that describeCoverage requests may be made""" + #TODO - examine the parent for bounding box info. + self._elem=elem + self._service=service + self.id=elem.find(nsWCS2('CoverageId')).text + self.title = testXMLValue(elem.find(ns('label'))) + self.abstract= testXMLValue(elem.find(ns('description'))) + self.keywords = [f.text for f in elem.findall(ns('keywords')+'/'+ns('keyword'))] + self.boundingBox=None #needed for iContentMetadata harmonisation + self.boundingBoxWGS84 = None + b = elem.find(ns('lonLatEnvelope')) + if b is not None: + gmlpositions=b.findall('{http://www.opengis.net/gml}pos') + lc=gmlpositions[0].text + uc=gmlpositions[1].text + self.boundingBoxWGS84 = ( + float(lc.split()[0]),float(lc.split()[1]), + float(uc.split()[0]), float(uc.split()[1]), + ) + #others not used but needed for iContentMetadata harmonisation + self.styles=None + self.crsOptions=None + self.defaulttimeposition=None + + #grid is either a gml:Grid or a gml:RectifiedGrid if supplied as part of the DescribeCoverage response. + def _getGrid(self): + if not hasattr(self, 'descCov'): + self.descCov=self._service.getDescribeCoverage(self.id) + gridelem= self.descCov.find(nsWCS2('CoverageDescription/')+'{http://www.opengis.net/gml/3.2}domainSet/'+'{http://www.opengis.net/gml/3.3/rgrid}ReferenceableGridByVectors') + if gridelem is not None: + grid=ReferenceableGridByVectors(gridelem) + else: + # HERE I LOOK FOR RECTIFIEDGRID + gridelem=self.descCov.find(nsWCS2('CoverageDescription/')+'{http://www.opengis.net/gml/3.2}domainSet/'+'{http://www.opengis.net/gml/3.2}RectifiedGrid') + grid=RectifiedGrid(gridelem) + return grid + grid=property(_getGrid, None) + + #timelimits are the start/end times, timepositions are all timepoints. WCS servers can declare one or both or neither of these. + # in wcs 2.0 this can be gathered from the Envelope tag + def _getTimeLimits(self): + # timepoints, timelimits=[],[] + # b=self._elem.find(ns('lonLatEnvelope')) + # if b is not None: + # timepoints=b.findall('{http://www.opengis.net/gml}timePosition') + # else: + # #have to make a describeCoverage request... + # if not hasattr(self, 'descCov'): + # self.descCov=self._service.getDescribeCoverage(self.id) + # for pos in self.descCov.findall(ns('CoverageOffering/')+ns('domainSet/')+ns('temporalDomain/')+'{http://www.opengis.net/gml}timePosition'): + # timepoints.append(pos) + # if timepoints: + # timelimits=[timepoints[0].text,timepoints[1].text] + return [self.timepositions[0],self.timepositions[-1]] + timelimits=property(_getTimeLimits, None) + + def _getTimePositions(self): + + timepositions=[] + if not hasattr(self, 'descCov'): + self.descCov=self._service.getDescribeCoverage(self.id) + + gridelem= self.descCov.find(nsWCS2('CoverageDescription/')+'{http://www.opengis.net/gml/3.2}domainSet/'+'{http://www.opengis.net/gml/3.3/rgrid}ReferenceableGridByVectors') + if gridelem is not None: + # irregular time axis + cooeficients = [] + + grid_axes = gridelem.findall('{http://www.opengis.net/gml/3.3/rgrid}generalGridAxis') + for elem in grid_axes: + if elem.find('{http://www.opengis.net/gml/3.3/rgrid}GeneralGridAxis/{http://www.opengis.net/gml/3.3/rgrid}gridAxesSpanned').text in ["ansi", "unix"]: + cooeficients = elem.find('{http://www.opengis.net/gml/3.3/rgrid}GeneralGridAxis/{http://www.opengis.net/gml/3.3/rgrid}coefficients').text.split(' ') + for x in cooeficients: + x = x.replace('"', '') + t_date = datetime_from_iso(x) + timepositions.append(t_date) + else: + # regular time + if(len(self.grid.origin)>2): + t_grid = self.grid + t_date = t_grid.origin[2] + start_pos = parser.parse(t_date, fuzzy=True) + step = float(t_grid.offsetvectors[2][2]) + + start_pos = start_pos + timedelta(days=(step/2)) + no_steps = int(t_grid.highlimits[2]) + for x in range(no_steps): + t_pos = start_pos + timedelta(days=(step * x)) + #t_date = datetime_from_ansi(t_pos) + #t_date = t_pos.isoformat() + timepositions.append(t_pos) + else: + # no time axis + timepositions = None + + return timepositions + timepositions=property(_getTimePositions, None) + + + def _getOtherBoundingBoxes(self): + ''' incomplete, should return other bounding boxes not in WGS84 + #TODO: find any other bounding boxes. Need to check for gml:EnvelopeWithTimePeriod.''' + + bboxes=[] + + if not hasattr(self, 'descCov'): + self.descCov=self._service.getDescribeCoverage(self.id) + + for envelope in self.descCov.findall(nsWCS2('CoverageDescription/')+'{http://www.opengis.net/gml/3.2}boundedBy/'+'{http://www.opengis.net/gml/3.2}Envelope'): + bbox = {} + bbox['nativeSrs'] = envelope.attrib['srsName'] + lc = envelope.find('{http://www.opengis.net/gml/3.2}lowerCorner') + lc =lc.text.split() + uc = envelope.find('{http://www.opengis.net/gml/3.2}upperCorner') + uc =uc.text.split() + bbox['bbox'] = ( + float(lc[0]),float(lc[1]), + float(uc[0]), float(uc[1]) + ) + bboxes.append(bbox) + + return bboxes + boundingboxes=property(_getOtherBoundingBoxes,None) + + def _getSupportedCRSProperty(self): + # gets supported crs info + crss=[] + for elem in self._service.getDescribeCoverage(self.id).findall(ns('CoverageOffering/')+ns('supportedCRSs/')+ns('responseCRSs')): + for crs in elem.text.split(' '): + crss.append(Crs(crs)) + for elem in self._service.getDescribeCoverage(self.id).findall(ns('CoverageOffering/')+ns('supportedCRSs/')+ns('requestResponseCRSs')): + for crs in elem.text.split(' '): + crss.append(Crs(crs)) + for elem in self._service.getDescribeCoverage(self.id).findall(ns('CoverageOffering/')+ns('supportedCRSs/')+ns('nativeCRSs')): + for crs in elem.text.split(' '): + crss.append(Crs(crs)) + return crss + supportedCRS=property(_getSupportedCRSProperty, None) + + + def _getSupportedFormatsProperty(self): + # gets supported formats info + frmts =[] + for elem in self._service._capabilities.findall(nsWCS2('ServiceMetadata/')+nsWCS2('formatSupported')): + frmts.append(elem.text) + return frmts + supportedFormats=property(_getSupportedFormatsProperty, None) + + def _getAxisDescriptionsProperty(self): + #gets any axis descriptions contained in the rangeset (requires a DescribeCoverage call to server). + axisDescs =[] + for elem in self._service.getDescribeCoverage(self.id).findall(ns('CoverageOffering/')+ns('rangeSet/')+ns('RangeSet/')+ns('axisDescription/')+ns('AxisDescription')): + axisDescs.append(AxisDescription(elem)) #create a 'AxisDescription' object. + return axisDescs + axisDescriptions=property(_getAxisDescriptionsProperty, None) + + + +#Adding classes to represent gml:grid and gml:rectifiedgrid. One of these is used for the cvg.grid property +#(where cvg is a member of the contents dictionary) +#There is no simple way to convert the offset values in a rectifiedgrid grid to real values without CRS understanding, therefore this is beyond the current scope of owslib, so the representation here is purely to provide access to the information in the GML. + +class Grid(object): + ''' Simple grid class to provide axis and value information for a gml grid ''' + def __init__(self, grid): + self.axislabels = [] + self.dimension=None + self.lowlimits=[] + self.highlimits=[] + + if grid is not None: + self.dimension=int(grid.get('dimension')) + self.lowlimits= grid.find('{http://www.opengis.net/gml/3.2}limits/{http://www.opengis.net/gml/3.2}GridEnvelope/{http://www.opengis.net/gml/3.2}low').text.split(' ') + self.highlimits = grid.find('{http://www.opengis.net/gml/3.2}limits/{http://www.opengis.net/gml/3.2}GridEnvelope/{http://www.opengis.net/gml/3.2}high').text.split(' ') + for axis in grid.findall('{http://www.opengis.net/gml/3.2}axisLabels')[0].text.split(' '): + self.axislabels.append(axis) + + +class RectifiedGrid(Grid): + ''' RectifiedGrid class, extends Grid with additional offset vector information ''' + def __init__(self, rectifiedgrid): + super(RectifiedGrid,self).__init__(rectifiedgrid) + self.origin=rectifiedgrid.find('{http://www.opengis.net/gml/3.2}origin/{http://www.opengis.net/gml/3.2}Point/{http://www.opengis.net/gml/3.2}pos').text.split() + self.offsetvectors=[] + for offset in rectifiedgrid.findall('{http://www.opengis.net/gml/3.2}offsetVector'): + self.offsetvectors.append(offset.text.split()) + + +class ReferenceableGridByVectors(Grid): + ''' ReferenceableGridByVectors class, extends Grid with additional vector information ''' + def __init__(self, refereceablegridbyvectors): + super(ReferenceableGridByVectors,self).__init__(refereceablegridbyvectors) + self.origin=refereceablegridbyvectors.find('{http://www.opengis.net/gml/3.3/rgrid}origin/{http://www.opengis.net/gml/3.2}Point/{http://www.opengis.net/gml/3.2}pos').text.split() + self.offsetvectors=[] + for offset in refereceablegridbyvectors.findall('{http://www.opengis.net/gml/3.3/rgrid}generalGridAxis/{http://www.opengis.net/gml/3.3/rgrid}GeneralGridAxis/{http://www.opengis.net/gml/3.3/rgrid}offsetVector'): + self.offsetvectors.append(offset.text.split()) + +class AxisDescription(object): + ''' Class to represent the AxisDescription element optionally found as part of the RangeSet and used to + define ordinates of additional dimensions such as wavelength bands or pressure levels''' + def __init__(self, axisdescElem): + self.name=self.label=None + self.values=[] + for elem in axisdescElem.getchildren(): + if elem.tag == ns('name'): + self.name = elem.text + elif elem.tag == ns('label'): + self.label = elem.text + elif elem.tag == ns('values'): + for child in elem.getchildren(): + self.values.append(child.text) diff -Nru owslib-0.16.0/owslib/coverage/wcs201.py owslib-0.18.0/owslib/coverage/wcs201.py --- owslib-0.16.0/owslib/coverage/wcs201.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/owslib/coverage/wcs201.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,415 @@ +# -*- coding: ISO-8859-15 -*- +# ============================================================================= +# Copyright (c) 2004, 2006 Sean C. Gillies +# Copyright (c) 2007 STFC +# +# Authors : +# Oliver Clements +# +# Contact email: olcl@pml.ac.uk +# ============================================================================= + +##########NOTE: Does not conform to new interfaces yet ################# + + +from __future__ import (absolute_import, division, print_function) + +from owslib.coverage.wcsBase import WCSBase, WCSCapabilitiesReader, ServiceException +from owslib.ows import OwsCommon, ServiceIdentification, ServiceProvider, OperationsMetadata + +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode +from owslib.util import openURL, testXMLValue +from owslib.etree import etree +from owslib.crs import Crs +import os, errno +import dateutil.parser as parser +from datetime import timedelta +import logging +from owslib.util import log, datetime_from_ansi, datetime_from_iso + +# function to save writing out WCS namespace in full each time +def ns(tag): + return '{http://www.opengis.net/ows/2.0}'+tag + +def nsWCS2(tag): + return '{http://www.opengis.net/wcs/2.0}'+tag + +class WebCoverageService_2_0_1(WCSBase): + """Abstraction for OGC Web Coverage Service (WCS), version 2.0.1 + Implements IWebCoverageService. + """ + 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,xml, cookies, auth=None): + super(WebCoverageService_2_0_1, self).__init__(auth=auth) + self.version='2.0.1' + self.url = url + self.cookies=cookies + self.ows_common = OwsCommon(version='2.0.1') + # initialize from saved capability document or access the server + reader = WCSCapabilitiesReader(self.version, self.cookies, self.auth) + if xml: + self._capabilities = reader.readString(xml) + else: + self._capabilities = reader.read(self.url) + + # check for exceptions + se = self._capabilities.find('ServiceException') + + if se is not None: + err_message = str(se.text).strip() + raise ServiceException(err_message, xml) + + #serviceIdentification metadata + subelem=self._capabilities.find(ns('ServiceIdentification')) + self.identification=ServiceIdentification(subelem, namespace=self.ows_common.namespace) + + #serviceProvider metadata + serviceproviderelem=self._capabilities.find(ns('ServiceProvider')) + self.provider=ServiceProvider(serviceproviderelem, namespace=self.ows_common.namespace) + + #serviceOperations metadata + self.operations=[] + for elem in self._capabilities.find(ns('OperationsMetadata'))[:]: + if elem.tag !=ns('ExtendedCapabilities'): + self.operations.append(OperationsMetadata(elem, namespace=self.ows_common.namespace)) + + #serviceContents metadata + self.contents={} + for elem in self._capabilities.findall(nsWCS2('Contents/')+nsWCS2('CoverageSummary')): + cm=ContentMetadata(elem, self) + self.contents[cm.id]=cm + + + + #exceptions + self.exceptions = [f.text for f \ + in self._capabilities.findall('Capability/Exception/Format')] + + + def items(self): + '''supports dict-like items() access''' + items=[] + for item in self.contents: + items.append((item,self.contents[item])) + return items + + def __makeString(self,value): + #using repr unconditionally breaks things in some circumstances if a value is already a string + if type(value) is not str: + sval=repr(value) + else: + sval = value + return sval + + def getCoverage(self, identifier=None, bbox=None, time=None, format = None, subsets=None,crs=None, width=None, height=None, resx=None, resy=None, resz=None,parameter=None,method='Get',**kwargs): + """Request and return a coverage from the WCS as a file-like object + note: additional **kwargs helps with multi-version implementation + core keyword arguments should be supported cross version + example: + cvg=wcs.getCoverage(identifier=['TuMYrRQ4'], timeSequence=['2792-06-01T00:00:00.0'], bbox=(-112,36,-106,41),format='cf-netcdf') + + is equivalent to: + http://myhost/mywcs?SERVICE=WCS&REQUEST=GetCoverage&IDENTIFIER=TuMYrRQ4&VERSION=1.1.0&BOUNDINGBOX=-180,-90,180,90&TIME=2792-06-01T00:00:00.0&FORMAT=cf-netcdf + + example 2.0.1 URL + http://earthserver.pml.ac.uk/rasdaman/ows?&SERVICE=WCS&VERSION=2.0.1&REQUEST=GetCoverage + &COVERAGEID=V2_monthly_CCI_chlor_a_insitu_test&SUBSET=Lat(40,50)&SUBSET=Long(-10,0)&SUBSET=ansi(144883,145000)&FORMAT=application/netcdf + + cvg=wcs.getCoverage(identifier=['myID'], format='application/netcdf', subsets=[('axisName',min,max),('axisName',min,max),('axisName',min,max)]) + + + """ + if log.isEnabledFor(logging.DEBUG): + log.debug('WCS 2.0.1 DEBUG: Parameters passed to GetCoverage: identifier=%s, bbox=%s, time=%s, format=%s, crs=%s, width=%s, height=%s, resx=%s, resy=%s, resz=%s, parameter=%s, method=%s, other_arguments=%s'%(identifier, bbox, time, format, crs, width, height, resx, resy, resz, parameter, method, str(kwargs))) + + try: + base_url = next((m.get('url') for m in self.getOperationByName('GetCoverage').methods if m.get('type').lower() == method.lower())) + except StopIteration: + base_url = self.url + + if log.isEnabledFor(logging.DEBUG): + log.debug('WCS 2.0.1 DEBUG: base url of server: %s'%base_url) + + request = {'version': self.version, 'request': 'GetCoverage', 'service':'WCS'} + assert len(identifier) > 0 + request['CoverageID']=identifier[0] + + + if crs: + request['crs']=crs + request['format']=format + if width: + request['width']=width + if height: + request['height']=height + + #anything else e.g. vendor specific parameters must go through kwargs + if kwargs: + for kw in kwargs: + request[kw]=kwargs[kw] + + #encode and request + data = urlencode(request) + if subsets: + for subset in subsets: + if len(subset) > 2: + if not self.is_number(subset[1]): + data = data + "&"+ urlencode({"subset":subset[0]+'("'+self.__makeString(subset[1])+'","'+self.__makeString(subset[2])+'")'}) + else: + data = data + "&"+ urlencode({"subset":subset[0]+'('+self.__makeString(subset[1])+','+self.__makeString(subset[2])+')'}) + else: + if not self.is_number(subset[1]): + data = data + "&"+ urlencode({"subset":subset[0]+'("'+self.__makeString(subset[1])+'")'}) + else: + data = data + "&"+ urlencode({"subset":subset[0]+'('+self.__makeString(subset[1])+')'}) + + + if log.isEnabledFor(logging.DEBUG): + log.debug('WCS 2.0.1 DEBUG: Second part of URL: %s'%data) + + u = openURL(base_url, data, method, self.cookies, auth=self.auth) + return u + + def is_number(self,s): + """simple helper to test if value is number as requests with numbers dont + need quote marks + """ + try: + float(s) + return True + except ValueError: + return False + + def getOperationByName(self, name): + """Return a named operation item.""" + for item in self.operations: + if item.name == name: + return item + raise KeyError("No operation named %s" % name) + + + +class ContentMetadata(object): + """ + Implements IContentMetadata + """ + def __init__(self, elem, service): + """Initialize. service is required so that describeCoverage requests may be made""" + #TODO - examine the parent for bounding box info. + self._elem=elem + self._service=service + self.id=elem.find(nsWCS2('CoverageId')).text + self.title = testXMLValue(elem.find(ns('label'))) + self.abstract= testXMLValue(elem.find(ns('description'))) + self.keywords = [f.text for f in elem.findall(ns('keywords')+'/'+ns('keyword'))] + self.boundingBox=None #needed for iContentMetadata harmonisation + self.boundingBoxWGS84 = None + b = elem.find(ns('lonLatEnvelope')) + if b is not None: + gmlpositions=b.findall('{http://www.opengis.net/gml}pos') + lc=gmlpositions[0].text + uc=gmlpositions[1].text + self.boundingBoxWGS84 = ( + float(lc.split()[0]),float(lc.split()[1]), + float(uc.split()[0]), float(uc.split()[1]), + ) + #others not used but needed for iContentMetadata harmonisation + self.styles=None + self.crsOptions=None + self.defaulttimeposition=None + + #grid is either a gml:Grid or a gml:RectifiedGrid if supplied as part of the DescribeCoverage response. + def _getGrid(self): + if not hasattr(self, 'descCov'): + self.descCov=self._service.getDescribeCoverage(self.id) + gridelem= self.descCov.find(nsWCS2('CoverageDescription/')+'{http://www.opengis.net/gml/3.2}domainSet/'+'{http://www.opengis.net/gml/3.3/rgrid}ReferenceableGridByVectors') + if gridelem is not None: + grid=ReferenceableGridByVectors(gridelem) + else: + # HERE I LOOK FOR RECTIFIEDGRID + gridelem=self.descCov.find(nsWCS2('CoverageDescription/')+'{http://www.opengis.net/gml/3.2}domainSet/'+'{http://www.opengis.net/gml/3.2}RectifiedGrid') + grid=RectifiedGrid(gridelem) + return grid + grid=property(_getGrid, None) + + #timelimits are the start/end times, timepositions are all timepoints. WCS servers can declare one or both or neither of these. + # in wcs 2.0 this can be gathered from the Envelope tag + def _getTimeLimits(self): + # timepoints, timelimits=[],[] + # b=self._elem.find(ns('lonLatEnvelope')) + # if b is not None: + # timepoints=b.findall('{http://www.opengis.net/gml}timePosition') + # else: + # #have to make a describeCoverage request... + # if not hasattr(self, 'descCov'): + # self.descCov=self._service.getDescribeCoverage(self.id) + # for pos in self.descCov.findall(ns('CoverageOffering/')+ns('domainSet/')+ns('temporalDomain/')+'{http://www.opengis.net/gml}timePosition'): + # timepoints.append(pos) + # if timepoints: + # timelimits=[timepoints[0].text,timepoints[1].text] + return [self.timepositions[0],self.timepositions[-1]] + timelimits=property(_getTimeLimits, None) + + def _getTimePositions(self): + + timepositions=[] + if not hasattr(self, 'descCov'): + self.descCov=self._service.getDescribeCoverage(self.id) + + gridelem= self.descCov.find(nsWCS2('CoverageDescription/')+'{http://www.opengis.net/gml/3.2}domainSet/'+'{http://www.opengis.net/gml/3.3/rgrid}ReferenceableGridByVectors') + if gridelem is not None: + # irregular time axis + cooeficients = [] + + grid_axes = gridelem.findall('{http://www.opengis.net/gml/3.3/rgrid}generalGridAxis') + for elem in grid_axes: + if elem.find('{http://www.opengis.net/gml/3.3/rgrid}GeneralGridAxis/{http://www.opengis.net/gml/3.3/rgrid}gridAxesSpanned').text in ["ansi", "unix"]: + cooeficients = elem.find('{http://www.opengis.net/gml/3.3/rgrid}GeneralGridAxis/{http://www.opengis.net/gml/3.3/rgrid}coefficients').text.split(' ') + for x in cooeficients: + x = x.replace('"', '') + t_date = datetime_from_iso(x) + timepositions.append(t_date) + else: + # regular time + if(len(self.grid.origin)>2): + t_grid = self.grid + t_date = t_grid.origin[2] + start_pos = parser.parse(t_date, fuzzy=True) + step = float(t_grid.offsetvectors[2][2]) + + start_pos = start_pos + timedelta(days=(step/2)) + no_steps = int(t_grid.highlimits[2]) + for x in range(no_steps): + t_pos = start_pos + timedelta(days=(step * x)) + #t_date = datetime_from_ansi(t_pos) + #t_date = t_pos.isoformat() + timepositions.append(t_pos) + else: + # no time axis + timepositions = None + + return timepositions + timepositions=property(_getTimePositions, None) + + + def _getOtherBoundingBoxes(self): + ''' incomplete, should return other bounding boxes not in WGS84 + #TODO: find any other bounding boxes. Need to check for gml:EnvelopeWithTimePeriod.''' + + bboxes=[] + + if not hasattr(self, 'descCov'): + self.descCov=self._service.getDescribeCoverage(self.id) + + for envelope in self.descCov.findall(nsWCS2('CoverageDescription/')+'{http://www.opengis.net/gml/3.2}boundedBy/'+'{http://www.opengis.net/gml/3.2}Envelope'): + bbox = {} + bbox['nativeSrs'] = envelope.attrib['srsName'] + lc = envelope.find('{http://www.opengis.net/gml/3.2}lowerCorner') + lc =lc.text.split() + uc = envelope.find('{http://www.opengis.net/gml/3.2}upperCorner') + uc =uc.text.split() + bbox['bbox'] = ( + float(lc[0]),float(lc[1]), + float(uc[0]), float(uc[1]) + ) + bboxes.append(bbox) + + return bboxes + boundingboxes=property(_getOtherBoundingBoxes,None) + + def _getSupportedCRSProperty(self): + # gets supported crs info + crss=[] + for elem in self._service.getDescribeCoverage(self.id).findall(ns('CoverageOffering/')+ns('supportedCRSs/')+ns('responseCRSs')): + for crs in elem.text.split(' '): + crss.append(Crs(crs)) + for elem in self._service.getDescribeCoverage(self.id).findall(ns('CoverageOffering/')+ns('supportedCRSs/')+ns('requestResponseCRSs')): + for crs in elem.text.split(' '): + crss.append(Crs(crs)) + for elem in self._service.getDescribeCoverage(self.id).findall(ns('CoverageOffering/')+ns('supportedCRSs/')+ns('nativeCRSs')): + for crs in elem.text.split(' '): + crss.append(Crs(crs)) + return crss + supportedCRS=property(_getSupportedCRSProperty, None) + + + def _getSupportedFormatsProperty(self): + # gets supported formats info + frmts =[] + for elem in self._service._capabilities.findall(nsWCS2('ServiceMetadata/')+nsWCS2('formatSupported')): + frmts.append(elem.text) + return frmts + supportedFormats=property(_getSupportedFormatsProperty, None) + + def _getAxisDescriptionsProperty(self): + #gets any axis descriptions contained in the rangeset (requires a DescribeCoverage call to server). + axisDescs =[] + for elem in self._service.getDescribeCoverage(self.id).findall(ns('CoverageOffering/')+ns('rangeSet/')+ns('RangeSet/')+ns('axisDescription/')+ns('AxisDescription')): + axisDescs.append(AxisDescription(elem)) #create a 'AxisDescription' object. + return axisDescs + axisDescriptions=property(_getAxisDescriptionsProperty, None) + + + +#Adding classes to represent gml:grid and gml:rectifiedgrid. One of these is used for the cvg.grid property +#(where cvg is a member of the contents dictionary) +#There is no simple way to convert the offset values in a rectifiedgrid grid to real values without CRS understanding, therefore this is beyond the current scope of owslib, so the representation here is purely to provide access to the information in the GML. + +class Grid(object): + ''' Simple grid class to provide axis and value information for a gml grid ''' + def __init__(self, grid): + self.axislabels = [] + self.dimension=None + self.lowlimits=[] + self.highlimits=[] + + if grid is not None: + self.dimension=int(grid.get('dimension')) + self.lowlimits= grid.find('{http://www.opengis.net/gml/3.2}limits/{http://www.opengis.net/gml/3.2}GridEnvelope/{http://www.opengis.net/gml/3.2}low').text.split(' ') + self.highlimits = grid.find('{http://www.opengis.net/gml/3.2}limits/{http://www.opengis.net/gml/3.2}GridEnvelope/{http://www.opengis.net/gml/3.2}high').text.split(' ') + for axis in grid.findall('{http://www.opengis.net/gml/3.2}axisLabels')[0].text.split(' '): + self.axislabels.append(axis) + + +class RectifiedGrid(Grid): + ''' RectifiedGrid class, extends Grid with additional offset vector information ''' + def __init__(self, rectifiedgrid): + super(RectifiedGrid,self).__init__(rectifiedgrid) + self.origin=rectifiedgrid.find('{http://www.opengis.net/gml/3.2}origin/{http://www.opengis.net/gml/3.2}Point/{http://www.opengis.net/gml/3.2}pos').text.split() + self.offsetvectors=[] + for offset in rectifiedgrid.findall('{http://www.opengis.net/gml/3.2}offsetVector'): + self.offsetvectors.append(offset.text.split()) + + +class ReferenceableGridByVectors(Grid): + ''' ReferenceableGridByVectors class, extends Grid with additional vector information ''' + def __init__(self, refereceablegridbyvectors): + super(ReferenceableGridByVectors,self).__init__(refereceablegridbyvectors) + self.origin=refereceablegridbyvectors.find('{http://www.opengis.net/gml/3.3/rgrid}origin/{http://www.opengis.net/gml/3.2}Point/{http://www.opengis.net/gml/3.2}pos').text.split() + self.offsetvectors=[] + for offset in refereceablegridbyvectors.findall('{http://www.opengis.net/gml/3.3/rgrid}generalGridAxis/{http://www.opengis.net/gml/3.3/rgrid}GeneralGridAxis/{http://www.opengis.net/gml/3.3/rgrid}offsetVector'): + self.offsetvectors.append(offset.text.split()) + +class AxisDescription(object): + ''' Class to represent the AxisDescription element optionally found as part of the RangeSet and used to + define ordinates of additional dimensions such as wavelength bands or pressure levels''' + def __init__(self, axisdescElem): + self.name=self.label=None + self.values=[] + for elem in axisdescElem.getchildren(): + if elem.tag == ns('name'): + self.name = elem.text + elif elem.tag == ns('label'): + self.label = elem.text + elif elem.tag == ns('values'): + for child in elem.getchildren(): + self.values.append(child.text) diff -Nru owslib-0.16.0/owslib/coverage/wcsBase.py owslib-0.18.0/owslib/coverage/wcsBase.py --- owslib-0.16.0/owslib/coverage/wcsBase.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/coverage/wcsBase.py 2019-06-25 00:00:28.000000000 +0000 @@ -19,7 +19,7 @@ import cgi from six.moves import cStringIO as StringIO import six -from owslib.util import openURL +from owslib.util import Authentication, openURL class ServiceException(Exception): @@ -39,28 +39,30 @@ class WCSBase(object): """Base class to be subclassed by version dependent WCS classes. Provides 'high-level' version independent methods""" - def __new__(self,url, xml, cookies): + def __new__(self,url, xml, cookies, auth=None): """ overridden __new__ method @type url: string @param url: url of WCS capabilities document @type xml: string @param xml: elementtree object + @param auth: instance of owslib.util.Authentication @return: inititalised WCSBase object """ obj=object.__new__(self) - obj.__init__(url, xml, cookies) + obj.__init__(url, xml, cookies, auth=auth) self.cookies=cookies self._describeCoverage = {} #cache for DescribeCoverage responses return obj - def __init__(self): - pass + def __init__(self, auth=None): + self.auth = auth or Authentication() def getDescribeCoverage(self, identifier): ''' returns a describe coverage document - checks the internal cache to see if it has been fetched before ''' if identifier not in self._describeCoverage.keys(): - reader = DescribeCoverageReader(self.version, identifier, self.cookies) + reader = DescribeCoverageReader( + self.version, identifier, self.cookies, self.auth) self._describeCoverage[identifier] = reader.read(self.url) return self._describeCoverage[identifier] @@ -69,7 +71,7 @@ """Read and parses WCS capabilities document into a lxml.etree infoset """ - def __init__(self, version=None, cookies = None): + def __init__(self, version=None, cookies=None, auth=None): """Initialize @type version: string @param version: WCS Version parameter e.g '1.0.0' @@ -77,6 +79,7 @@ self.version = version self._infoset = None self.cookies = cookies + self.auth = auth or Authentication() def capabilities_url(self, service_url): """Return a capabilities url @@ -112,7 +115,7 @@ @return: An elementtree tree representation of the capabilities document """ request = self.capabilities_url(service_url) - u = openURL(request, timeout=timeout, cookies=self.cookies) + u = openURL(request, timeout=timeout, cookies=self.cookies, auth=self.auth) return etree.fromstring(u.read()) def readString(self, st): @@ -126,7 +129,7 @@ """Read and parses WCS DescribeCoverage document into a lxml.etree infoset """ - def __init__(self, version, identifier, cookies): + def __init__(self, version, identifier, cookies, auth=None): """Initialize @type version: string @param version: WCS Version parameter e.g '1.0.0' @@ -135,6 +138,7 @@ self._infoset = None self.identifier=identifier self.cookies = cookies + self.auth = auth or Authentication() def descCov_url(self, service_url): """Return a describe coverage url @@ -158,6 +162,12 @@ if self.version == '1.0.0': if 'coverage' not in params: qs.append(('coverage', self.identifier)) + elif self.version == '2.0.0': + if 'CoverageID' not in params: + qs.append(('CoverageID', self.identifier)) + elif self.version == '2.0.1': + if 'CoverageID' not in params: + qs.append(('CoverageID', self.identifier)) elif self.version == '1.1.0' or self.version == '1.1.1': #NOTE: WCS 1.1.0 is ambigous about whether it should be identifier #or identifiers (see tables 9, 10 of specification) @@ -179,7 +189,8 @@ @rtype: elementtree tree @return: An elementtree tree representation of the capabilities document """ + request = self.descCov_url(service_url) - u = openURL(request, cookies=self.cookies, timeout=timeout) + u = openURL(request, cookies=self.cookies, timeout=timeout, auth=self.auth) return etree.fromstring(u.read()) diff -Nru owslib-0.16.0/owslib/csw.py owslib-0.18.0/owslib/csw.py --- owslib-0.16.0/owslib/csw.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/csw.py 2019-06-25 00:00:28.000000000 +0000 @@ -24,8 +24,6 @@ except ImportError: # Python 2 from urllib import urlencode -from owslib.util import OrderedDict - from owslib.etree import etree from owslib import fes from owslib import util @@ -35,7 +33,7 @@ from owslib.dif import DIF from owslib.gm03 import GM03 from owslib.namespaces import Namespaces -from owslib.util import cleanup_namespaces, bind_url, add_namespaces, openURL +from owslib.util import cleanup_namespaces, bind_url, add_namespaces, OrderedDict, Authentication, openURL, http_post # default variables outputformat = 'application/xml' @@ -50,7 +48,7 @@ class CatalogueServiceWeb(object): """ csw request class """ def __init__(self, url, lang='en-US', version='2.0.2', timeout=10, skip_caps=False, - username=None, password=None): + username=None, password=None, auth=None): """ Construct and process a GetCapabilities request @@ -65,15 +63,19 @@ - skip_caps: whether to skip GetCapabilities processing on init (default is False) - username: username for HTTP basic authentication - password: password for HTTP basic authentication + - auth: instance of owslib.util.Authentication """ - + if auth: + if username: + auth.username = username + if password: + auth.password = password self.url = util.clean_ows_url(url) self.lang = lang self.version = version self.timeout = timeout - self.username = username - self.password = password + self.auth = auth or Authentication(username, password) self.service = 'CSW' self.exceptionreport = None self.owscommon = ows.OwsCommon('1.0.0') @@ -93,15 +95,15 @@ # ServiceIdentification val = self._exml.find(util.nspath_eval('ows:ServiceIdentification', namespaces)) if val is not None: - self.identification = ows.ServiceIdentification(val,self.owscommon.namespace) + self.identification = ows.ServiceIdentification(val,self.owscommon.namespace) else: - self.identification = None + self.identification = None # ServiceProvider val = self._exml.find(util.nspath_eval('ows:ServiceProvider', namespaces)) if val is not None: self.provider = ows.ServiceProvider(val,self.owscommon.namespace) else: - self.provider = None + self.provider = None # ServiceOperations metadata self.operations = [] for elem in self._exml.findall(util.nspath_eval('ows:OperationsMetadata/ows:Operation', namespaces)): @@ -385,7 +387,7 @@ self.results['returned'] = int(util.testXMLValue(val, True)) val = self._exml.find(util.nspath_eval('csw:SearchResults', namespaces)).attrib.get('nextRecord') if val is not None: - self.results['nextrecord'] = int(util.testXMLValue(val, True)) + self.results['nextrecord'] = int(util.testXMLValue(val, True)) else: warnings.warn("""CSW Server did not supply a nextRecord value (it is optional), so the client should page through the results in another way.""") @@ -658,7 +660,9 @@ if isinstance(self.request, six.string_types): # GET KVP self.request = '%s%s' % (bind_url(request_url), self.request) - self.response = openURL(self.request, None, 'Get', username=self.username, password=self.password, timeout=self.timeout).read() + self.response = openURL( + self.request, None, 'Get', timeout=self.timeout, auth=self.auth + ).read() else: self.request = cleanup_namespaces(self.request) # Add any namespaces used in the "typeNames" attribute of the @@ -674,7 +678,7 @@ self.request = util.element_to_string(self.request, encoding='utf-8') - self.response = util.http_post(request_url, self.request, self.lang, self.timeout, self.username, self.password) + self.response = http_post(request_url, self.request, self.lang, self.timeout, auth=self.auth) # parse result see if it's XML self._exml = etree.parse(BytesIO(self.response)) diff -Nru owslib-0.16.0/owslib/feature/common.py owslib-0.18.0/owslib/feature/common.py --- owslib-0.16.0/owslib/feature/common.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/feature/common.py 2019-06-25 00:00:28.000000000 +0000 @@ -1,6 +1,6 @@ import cgi from owslib.etree import etree -from owslib.util import openURL +from owslib.util import Authentication, openURL try: from urllib import urlencode @@ -13,11 +13,15 @@ """Read and parse capabilities document into a lxml.etree infoset """ - def __init__(self, version='1.0', username=None, password=None): + def __init__(self, version='1.0', username=None, password=None, auth=None): """Initialize""" + if auth: + if username: + auth.username = username + if password: + auth.password = password + self.auth = auth or Authentication(username, password) self.version = version - self.username = username - self.password = password self._infoset = None def capabilities_url(self, service_url): @@ -51,8 +55,7 @@ A timeout value (in seconds) for the request. """ request = self.capabilities_url(url) - u = openURL(request, timeout=timeout, - username=self.username, password=self.password) + u = openURL(request, timeout=timeout, auth=self.auth) return etree.fromstring(u.read()) def readString(self, st): @@ -64,3 +67,12 @@ 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 AbstractContentMetadata(object): + + def __init__(self, auth=None): + self.auth = auth or Authentication() + + def get_metadata(self): + return [m['metadata'] for m in self.metadataUrls if m.get('metadata', None) is not None] diff -Nru owslib-0.16.0/owslib/feature/__init__.py owslib-0.18.0/owslib/feature/__init__.py --- owslib-0.16.0/owslib/feature/__init__.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/feature/__init__.py 2019-06-25 00:00:28.000000000 +0000 @@ -14,12 +14,15 @@ except ImportError: from urllib.parse import urlencode import logging -from owslib.util import log +from owslib.util import log, Authentication from owslib.feature.schema import get_schema class WebFeatureService_(object): """Base class for WebFeatureService implementations""" + def __init__(self, auth=None): + self.auth = auth or Authentication() + def getBBOXKVP (self,bbox,typename): """Formate bounding box for KVP request type (HTTP GET) @@ -34,7 +37,7 @@ # srs of the bbox is specified in the bbox as fifth paramter if len(bbox) == 5: - srs = self.getSRS(bbox[4],typename[0]) + srs = Crs(bbox[4]) # take default srs else: srs = self.contents[typename[0]].crsOptions[0] @@ -75,9 +78,11 @@ # GetCaps document (the 'id' attribute in the Crs object). return self.contents[typename].crsOptions[index] except ValueError: - options = ", ".join(map(lambda x: x.id, self.contents[typename].crsOptions)) - log.warning("Requested srsName '%s' not available for requested typename '%s'. \ - Options are: %s. " % (srs.getcode(), typename, options)) + options = ", ".join(map(lambda crs: crs.id, + self.contents[typename].crsOptions)) + log.warning("Requested srsName %r is not declared as being " + "allowed for requested typename %r. " + "Options are: %r.", srs.getcode(), typename, options) return None def getGETGetFeatureRequest(self, typename=None, filter=None, bbox=None, featureid=None, @@ -160,12 +165,8 @@ return base_url+data - def get_schema(self, typename): """ Get layer schema compatible with :class:`fiona` schema object """ - - return get_schema(self.url, typename, self.version) - - + return get_schema(self.url, typename, self.version, auth=self.auth) diff -Nru owslib-0.16.0/owslib/feature/schema.py owslib-0.18.0/owslib/feature/schema.py --- owslib-0.16.0/owslib/feature/schema.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/feature/schema.py 2019-06-25 00:00:28.000000000 +0000 @@ -10,14 +10,13 @@ """ import cgi, sys -from owslib.util import openURL try: from urllib import urlencode except ImportError: from urllib.parse import urlencode from owslib.etree import etree from owslib.namespaces import Namespaces -from owslib.util import which_etree, findall +from owslib.util import which_etree, findall, Authentication, openURL MYNS = Namespaces() XS_NAMESPACE = MYNS.get_namespace('xs') @@ -26,7 +25,8 @@ MYNS.get_namespace('gml32')) -def get_schema(url, typename, version='1.0.0', timeout=30, username=None, password=None): +def get_schema(url, typename, version='1.0.0', timeout=30, + username=None, password=None, auth=None): """Parses DescribeFeatureType response and creates schema compatible with :class:`fiona` @@ -34,10 +34,19 @@ :param str version: version of the service :param str typename: name of the layer :param int timeout: request timeout + :param str username: service authentication username + :param str password: service authentication password + :param Authentication auth: instance of owslib.util.Authentication """ - + if auth: + if username: + auth.username = username + if password: + auth.password = password + else: + auth = Authentication(username, password) url = _get_describefeaturetype_url(url, version, typename) - res = openURL(url, timeout=timeout, username=username, password=password) + res = openURL(url, timeout=timeout, auth=auth) root = etree.fromstring(res.read()) if ':' in typename: @@ -92,28 +101,26 @@ gml_key = 'gml' schema_key = 'xsd' + mappings = { + 'PointPropertyType': 'Point', + 'PolygonPropertyType': 'Polygon', + 'LineStringPropertyType': 'LineString', + 'MultiPointPropertyType': 'MultiPoint', + 'MultiLineStringPropertyType': 'MultiLineString', + 'MultiPolygonPropertyType': 'MultiPolygon', + 'MultiGeometryPropertyType': 'MultiGeometry', + 'GeometryPropertyType': 'GeometryCollection', + 'SurfacePropertyType': '3D Polygon', + 'MultiSurfacePropertyType': '3D MultiPolygon' + } + for element in elements: data_type = element.attrib['type'].replace(gml_key + ':', '') name = element.attrib['name'] - if data_type == 'PointPropertyType': - schema['geometry'] = 'Point' - elif data_type == 'PolygonPropertyType': - schema['geometry'] = 'Polygon' - elif data_type == 'LineStringPropertyType': - schema['geometry'] = 'LineString' - elif data_type == 'MultiPointPropertyType': - schema['geometry'] = 'MultiPoint' - elif data_type == 'MultiLineStringPropertyType': - schema['geometry'] = 'MultiLineString' - elif data_type == 'MultiPolygonPropertyType': - schema['geometry'] = 'MultiPolygon' - elif data_type == 'MultiGeometryPropertyType': - schema['geometry'] = 'MultiGeometry' - elif data_type == 'GeometryPropertyType': - schema['geometry'] = 'GeometryCollection' - elif data_type == 'SurfacePropertyType': - schema['geometry'] = '3D Polygon' + if data_type in mappings: + schema['geometry'] = mappings[data_type] + schema['geometry_column'] = name else: schema['properties'][name] = data_type.replace(schema_key+':', '') diff -Nru owslib-0.16.0/owslib/feature/wfs100.py owslib-0.18.0/owslib/feature/wfs100.py --- owslib-0.16.0/owslib/feature/wfs100.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/feature/wfs100.py 2019-06-25 00:00:28.000000000 +0000 @@ -10,19 +10,22 @@ from six import PY2 from six.moves import cStringIO as StringIO + +from owslib import util + try: from urllib import urlencode except ImportError: from urllib.parse import urlencode -from owslib.util import openURL, testXMLValue, extract_xml_list, ServiceException, xmltag_split +from owslib.util import testXMLValue, extract_xml_list, ServiceException, xmltag_split, Authentication, openURL, log from owslib.etree import etree from owslib.fgdc import Metadata from owslib.iso import MD_Metadata 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 +from owslib.feature.common import WFSCapabilitiesReader, \ + AbstractContentMetadata import pyproj @@ -58,7 +61,7 @@ Implements IWebFeatureService. """ def __new__(self,url, version, xml, parse_remote_metadata=False, timeout=30, - username=None, password=None): + username=None, password=None, auth=None): """ overridden __new__ method @type url: string @@ -70,11 +73,12 @@ @param timeout: time (in seconds) after which requests should timeout @param username: service authentication username @param password: service authentication password + @param auth: instance of owslib.util.Authentication @return: initialized WebFeatureService_1_0_0 object """ obj=object.__new__(self) obj.__init__(url, version, xml, parse_remote_metadata, timeout, - username=username, password=password) + username=username, password=password, auth=auth) return obj def __getitem__(self,name): @@ -84,17 +88,20 @@ else: raise KeyError("No content named %s" % name) - def __init__(self, url, version, xml=None, parse_remote_metadata=False, timeout=30, - username=None, password=None): + username=None, password=None, auth=None): """Initialize.""" + if auth: + if username: + auth.username = username + if password: + auth.password = password self.url = url self.version = version self.timeout = timeout - self.username = username - self.password = password + self.auth = auth or Authentication(username, password) self._capabilities = None - reader = WFSCapabilitiesReader(self.version, self.username, self.password) + reader = WFSCapabilitiesReader(self.version, auth=self.auth) if xml: self._capabilities = reader.readString(xml) else: @@ -126,7 +133,8 @@ featuretypelist=self._capabilities.find(nspath('FeatureTypeList')) features = self._capabilities.findall(nspath('FeatureTypeList/FeatureType')) for feature in features: - cm=ContentMetadata(feature, featuretypelist, parse_remote_metadata) + cm = ContentMetadata( + feature, featuretypelist, parse_remote_metadata, auth=self.auth) self.contents[cm.id]=cm #exceptions @@ -137,9 +145,9 @@ """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, - username=self.username, password=self.password) + reader = WFSCapabilitiesReader(self.version, auth=self.auth) + return openURL(reader.capabilities_url(self.url), + timeout=self.timeout, auth=self.auth) def items(self): '''supports dict-like items() access''' @@ -231,9 +239,7 @@ data = urlencode(request) log.debug("Making request: %s?%s" % (base_url, data)) - u = openURL(base_url, data, method, timeout=self.timeout, - username=self.username, password=self.password) - + u = openURL(base_url, data, method, timeout=self.timeout, auth=self.auth) # check for service exceptions, rewrap, and return # We're going to assume that anything with a content-length > 32k @@ -279,8 +285,7 @@ Get layer schema compatible with :class:`fiona` schema object """ - return get_schema(self.url, typename, self.version) - + return get_schema(self.url, typename, self.version, auth=self.auth) class ServiceIdentification(object): @@ -304,14 +309,15 @@ self.url = testXMLValue(self._root.find(nspath('OnlineResource'))) self.keywords = extract_xml_list(self._root.find(nspath('Keywords'))) -class ContentMetadata: +class ContentMetadata(AbstractContentMetadata): """Abstraction for WFS metadata. Implements IMetadata. """ - def __init__(self, elem, parent, parse_remote_metadata=False, timeout=30): + def __init__(self, elem, parent, parse_remote_metadata=False, timeout=30, auth=None): """.""" + super(ContentMetadata, self).__init__(auth) self.id = testXMLValue(elem.find(nspath('Name'))) self.title = testXMLValue(elem.find(nspath('Title'))) self.abstract = testXMLValue(elem.find(nspath('Abstract'))) @@ -363,24 +369,36 @@ for m in elem.findall(nspath('MetadataURL')): metadataUrl = { 'type': testXMLValue(m.attrib['type'], attrib=True), - 'format': testXMLValue(m.find('Format')), + 'format': testXMLValue(m.attrib['format'], attrib=True), 'url': testXMLValue(m) } + self.metadataUrls.append(metadataUrl) - if metadataUrl['url'] is not None and parse_remote_metadata: # download URL + def parse_remote_metadata(self, timeout=30): + """Parse remote metadata for MetadataURL of format 'XML' and add it as metadataUrl['metadata']""" + for metadataUrl in self.metadataUrls: + if metadataUrl['url'] is not None \ + and metadataUrl['format'].lower() == 'xml': try: - content = openURL(metadataUrl['url'], timeout=timeout) - doc = etree.parse(content) - if metadataUrl['type'] is not None: - if metadataUrl['type'] == 'FGDC': - metadataUrl['metadata'] = Metadata(doc) - if metadataUrl['type'] == 'TC211': - metadataUrl['metadata'] = MD_Metadata(doc) + content = openURL( + metadataUrl['url'], timeout=timeout, auth=self.auth) + doc = etree.fromstring(content.read()) + if metadataUrl['type'] == 'FGDC': + mdelem = doc.find('.//metadata') + if mdelem is not None: + metadataUrl['metadata'] = Metadata(mdelem) + else: + metadataUrl['metadata'] = None + elif metadataUrl['type'] == 'TC211': + mdelem = doc.find('.//' + util.nspath_eval('gmd:MD_Metadata', n.get_namespaces(['gmd']))) \ + or doc.find('.//' + util.nspath_eval('gmi:MI_Metadata', n.get_namespaces(['gmi']))) + if mdelem is not None: + metadataUrl['metadata'] = MD_Metadata(mdelem) + else: + metadataUrl['metadata'] = None except Exception: metadataUrl['metadata'] = None - self.metadataUrls.append(metadataUrl) - class OperationMetadata: """Abstraction for WFS metadata. diff -Nru owslib-0.16.0/owslib/feature/wfs110.py owslib-0.18.0/owslib/feature/wfs110.py --- owslib-0.16.0/owslib/feature/wfs110.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/feature/wfs110.py 2019-06-25 00:00:28.000000000 +0000 @@ -15,7 +15,8 @@ from urllib import urlencode except ImportError: from urllib.parse import urlencode -from owslib.util import openURL, testXMLValue, nspath_eval, ServiceException +from owslib.util import testXMLValue, nspath_eval, ServiceException, Authentication,\ + openURL from owslib.etree import etree from owslib.fgdc import Metadata from owslib.iso import MD_Metadata @@ -23,14 +24,15 @@ from owslib.fes import * from owslib.crs import Crs from owslib.feature import WebFeatureService_ -from owslib.feature.common import WFSCapabilitiesReader +from owslib.feature.common import WFSCapabilitiesReader, \ + AbstractContentMetadata from owslib.namespaces import Namespaces -from owslib.util import log +from owslib.util import log, openURL def get_namespaces(): n = Namespaces() - return n.get_namespaces(["gml","ogc","ows","wfs"]) + return n.get_namespaces(["gmd", "gml", "gmi", "ogc","ows","wfs"]) namespaces = get_namespaces() class WebFeatureService_1_1_0(WebFeatureService_): @@ -39,7 +41,7 @@ Implements IWebFeatureService. """ def __new__(self,url, version, xml, parse_remote_metadata=False, timeout=30, - username=None, password=None): + username=None, password=None, auth=None): """ overridden __new__ method @type url: string @@ -51,11 +53,12 @@ @param timeout: time (in seconds) after which requests should timeout @param username: service authentication username @param password: service authentication password + @param auth: instance of owslib.util.Authentication @return: initialized WebFeatureService_1_1_0 object """ obj=object.__new__(self) obj.__init__(url, version, xml, parse_remote_metadata, timeout, - username=username, password=password) + username=username, password=password, auth=auth) return obj def __getitem__(self,name): @@ -65,18 +68,23 @@ else: raise KeyError("No content named %s" % name) - def __init__(self, url, version, xml=None, parse_remote_metadata=False, timeout=30, - username=None, password=None): + username=None, password=None, auth=None): """Initialize.""" + if auth: + if username: + auth.username = username + if password: + auth.password = password + else: + auth = Authentication(username, password) + super(WebFeatureService_1_1_0, self).__init__(auth) 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, username=username, password=password) + reader = WFSCapabilitiesReader(self.version, auth=self.auth) if xml: self._capabilities = reader.readString(xml) else: @@ -90,10 +98,12 @@ # ServiceIdentification val = self._capabilities.find(util.nspath_eval('ows:ServiceIdentification', namespaces)) - self.identification=ServiceIdentification(val,self.owscommon.namespace) + if val is not None: + self.identification=ServiceIdentification(val,self.owscommon.namespace) # ServiceProvider val = self._capabilities.find(util.nspath_eval('ows:ServiceProvider', namespaces)) - self.provider=ServiceProvider(val,self.owscommon.namespace) + if val is not None: + self.provider=ServiceProvider(val,self.owscommon.namespace) # ServiceOperations metadata self.operations=[] for elem in self._capabilities.findall(util.nspath_eval('ows:OperationsMetadata/ows:Operation', namespaces)): @@ -115,7 +125,7 @@ self.contents={} features = self._capabilities.findall(nspath_eval('wfs:FeatureTypeList/wfs:FeatureType', namespaces)) for feature in features: - cm=ContentMetadata(feature, parse_remote_metadata) + cm=ContentMetadata(feature, parse_remote_metadata, auth=self.auth) self.contents[cm.id]=cm #exceptions @@ -126,9 +136,9 @@ """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, - username=self.username, password=self.password) + reader = WFSCapabilitiesReader(self.version, auth=self.auth) + return openURL(reader.capabilities_url(self.url), + timeout=self.timeout, auth=self.auth) def items(self): '''supports dict-like items() access''' @@ -200,17 +210,12 @@ typename = [typename] if srsname is not None: - # check, if desired SRS is supported by the service for this typename - if typename is not None: - # convert srsname string to Crs object found in GetCaps - srsnameobj = self.getSRS(srsname, typename[0]) - if srsnameobj is not None: - request['srsname'] = srsnameobj.id - else: - options = ", ".join(map(lambda x: x.id, self.contents[typename[0]].crsOptions)) - raise ServiceException("SRSNAME %s not supported. Options: %s" % (srsname, options)) - else: - request['srsname'] = str(srsname) + request['srsname'] = str(srsname) + + # Check, if desired SRS is supported by the service for each + # typename. Warning will be thrown if that SRS is not allowed." + for name in typename: + _ = self.getSRS(srsname, name) # check featureid if featureid: @@ -248,8 +253,7 @@ data = urlencode(request) log.debug("Making request: %s?%s" % (base_url, data)) - u = openURL(base_url, data, method, timeout=self.timeout, - username=self.username, password=self.password) + u = openURL(base_url, data, method, timeout=self.timeout, auth=self.auth) # check for service exceptions, rewrap, and return # We're going to assume that anything with a content-length > 32k @@ -291,14 +295,15 @@ -class ContentMetadata: +class ContentMetadata(AbstractContentMetadata): """Abstraction for WFS metadata. Implements IMetadata. """ - def __init__(self, elem, parse_remote_metadata=False, timeout=30): + def __init__(self, elem, parse_remote_metadata=False, timeout=30, auth=None): """.""" + super(ContentMetadata, self).__init__(auth) self.id = testXMLValue(elem.find(nspath_eval('wfs:Name', namespaces))) self.title = testXMLValue(elem.find(nspath_eval('wfs:Title', namespaces))) self.abstract = testXMLValue(elem.find(nspath_eval('wfs:Abstract', namespaces))) @@ -332,25 +337,40 @@ for m in elem.findall(nspath_eval('wfs:MetadataURL', namespaces)): metadataUrl = { 'type': testXMLValue(m.attrib['type'], attrib=True), - 'format': testXMLValue(m.find('Format')), + 'format': testXMLValue(m.attrib['format'], attrib=True), 'url': testXMLValue(m) } - - if metadataUrl['url'] is not None and parse_remote_metadata: # download URL - try: - content = openURL(metadataUrl['url'], timeout=timeout) - doc = etree.parse(content) - if metadataUrl['type'] is not None: - if metadataUrl['type'] == 'FGDC': - metadataUrl['metadata'] = Metadata(doc) - if metadataUrl['type'] in ['TC211', '19115', '19139']: - metadataUrl['metadata'] = MD_Metadata(doc) - except Exception: - metadataUrl['metadata'] = None - self.metadataUrls.append(metadataUrl) + if parse_remote_metadata: + self.parse_remote_metadata(timeout) + #others not used but needed for iContentMetadata harmonisation self.styles=None self.timepositions=None self.defaulttimeposition=None + + def parse_remote_metadata(self, timeout=30): + """Parse remote metadata for MetadataURL of format 'text/xml' and add it as metadataUrl['metadata']""" + for metadataUrl in self.metadataUrls: + if metadataUrl['url'] is not None \ + and metadataUrl['format'].lower() == 'text/xml': + try: + content = openURL( + metadataUrl['url'], timeout=timeout) + doc = etree.fromstring(content.read()) + + if metadataUrl['type'] == 'FGDC': + mdelem = doc.find('.//metadata') + if mdelem is not None: + metadataUrl['metadata'] = Metadata(mdelem) + else: + metadataUrl['metadata'] = None + elif metadataUrl['type'] in ['TC211', '19115', '19139']: + mdelem = doc.find('.//'+util.nspath_eval('gmd:MD_Metadata', namespaces)) or doc.find('.//'+util.nspath_eval('gmi:MI_Metadata', namespaces)) + if mdelem is not None: + metadataUrl['metadata'] = MD_Metadata(mdelem) + else: + metadataUrl['metadata'] = None + except: + metadataUrl['metadata'] = None diff -Nru owslib-0.16.0/owslib/feature/wfs200.py owslib-0.18.0/owslib/feature/wfs200.py --- owslib-0.16.0/owslib/feature/wfs200.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/feature/wfs200.py 2019-06-25 00:00:28.000000000 +0000 @@ -9,12 +9,16 @@ from __future__ import (absolute_import, division, print_function) #owslib imports: +from owslib import util +from owslib.fgdc import Metadata +from owslib.iso import MD_Metadata from owslib.ows import ServiceIdentification, ServiceProvider, OperationsMetadata from owslib.etree import etree -from owslib.util import nspath, testXMLValue, openURL +from owslib.util import nspath, testXMLValue, openURL, Authentication from owslib.crs import Crs from owslib.feature import WebFeatureService_ -from owslib.feature.common import WFSCapabilitiesReader +from owslib.feature.common import WFSCapabilitiesReader, \ + AbstractContentMetadata from owslib.namespaces import Namespaces #other imports @@ -46,7 +50,7 @@ Implements IWebFeatureService. """ def __new__(self,url, version, xml, parse_remote_metadata=False, timeout=30, - username=None, password=None): + username=None, password=None, auth=None): """ overridden __new__ method @type url: string @@ -58,11 +62,12 @@ @param timeout: time (in seconds) after which requests should timeout @param username: service authentication username @param password: service authentication password + @param auth: instance of owslib.util.Authentication @return: initialized WebFeatureService_2_0_0 object """ obj=object.__new__(self) obj.__init__(url, version, xml, parse_remote_metadata, timeout, - username=username, password=password) + username=username, password=password, auth=auth) return obj def __getitem__(self,name): @@ -72,19 +77,24 @@ else: raise KeyError("No content named %s" % name) - def __init__(self, url, version, xml=None, parse_remote_metadata=False, timeout=30, - username=None, password=None): + username=None, password=None, auth=None): """Initialize.""" + if auth: + if username: + auth.username = username + if password: + auth.password = password + else: + auth = Authentication() + super(WebFeatureService_2_0_0, self).__init__(auth) 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, username=username, password=password) + reader = WFSCapabilitiesReader(self.version, auth=self.auth) if xml: self._capabilities = reader.readString(xml) else: @@ -98,21 +108,23 @@ #serviceIdentification metadata serviceidentelem=self._capabilities.find(nspath('ServiceIdentification')) - self.identification=ServiceIdentification(serviceidentelem) + if serviceidentelem is not None: + 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: - 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) - + if serviceidentelem is not None: + 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) + if serviceproviderelem: + self.provider=ServiceProvider(serviceproviderelem) #serviceOperations metadata self.operations=[] @@ -134,7 +146,8 @@ 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) + cm = ContentMetadata( + feature, featuretypelist, parse_remote_metadata, auth=self.auth) self.contents[cm.id]=cm #exceptions @@ -145,9 +158,9 @@ """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, - username=self.username, password=self.password) + reader = WFSCapabilitiesReader(self.version, auth=self.auth) + return openURL(reader.capabilities_url(self.url), + timeout=self.timeout, auth=self.auth) def items(self): '''supports dict-like items() access''' @@ -222,8 +235,7 @@ # If method is 'Post', data will be None here - u = openURL(url, data, method, timeout=self.timeout, - username=self.username, password=self.password) + u = openURL(url, data, method, timeout=self.timeout, auth=self.auth) # check for service exceptions, rewrap, and return # We're going to assume that anything with a content-length > 32k @@ -256,7 +268,6 @@ return self._makeStringIO(data) return u - def getpropertyvalue(self, query=None, storedquery_id=None, valuereference=None, typename=None, method=nspath('Get'),**kwargs): ''' the WFS GetPropertyValue method''' try: @@ -276,11 +287,9 @@ for kw in kwargs.keys(): request[kw]=str(kwargs[kw]) encoded_request=urlencode(request) - u = openURL(base_url + encoded_request, timeout=self.timeout, - username=self.username, password=self.password) + u = openURL(base_url + encoded_request, timeout=self.timeout, auth=self.auth) return u.read() - def _getStoredQueries(self): ''' gets descriptions of the stored queries available on the server ''' sqs=[] @@ -296,8 +305,7 @@ request = {'service': 'WFS', 'version': self.version, 'request': 'ListStoredQueries'} encoded_request = urlencode(request) - u = openURL(base_url, data=encoded_request, timeout=self.timeout, - username=self.username, password=self.password) + u = openURL(base_url, data=encoded_request, timeout=self.timeout, auth=self.auth) tree=etree.fromstring(u.read()) tempdict={} for sqelem in tree[:]: @@ -317,8 +325,7 @@ 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, - username=self.username, password=self.password) + u = openURL(base_url, data=encoded_request, timeout=self.timeout, auth=self.auth) tree=etree.fromstring(u.read()) tempdict2={} for sqelem in tree[:]: @@ -361,14 +368,15 @@ self.type=type -class ContentMetadata: +class ContentMetadata(AbstractContentMetadata): """Abstraction for WFS metadata. Implements IMetadata. """ - def __init__(self, elem, parent, parse_remote_metadata=False, timeout=30): + def __init__(self, elem, parent, parse_remote_metadata=False, timeout=30, auth=None): """.""" + super(ContentMetadata, self).__init__(auth) self.id = elem.find(nspath('Name',ns=WFS_NAMESPACE)).text self.title = elem.find(nspath('Title',ns=WFS_NAMESPACE)).text abstract = elem.find(nspath('Abstract',ns=WFS_NAMESPACE)) @@ -419,22 +427,33 @@ # MetadataURLs self.metadataUrls = [] - for m in elem.findall('MetadataURL'): + for m in elem.findall(nspath('MetadataURL', ns=WFS_NAMESPACE)): metadataUrl = { - 'type': testXMLValue(m.attrib['type'], attrib=True), - 'format': m.find('Format').text.strip(), - 'url': testXMLValue(m.find('OnlineResource').attrib['{http://www.w3.org/1999/xlink}href'], attrib=True) + 'url': testXMLValue(m.attrib['{http://www.w3.org/1999/xlink}href'], attrib=True) } + self.metadataUrls.append(metadataUrl) + + if parse_remote_metadata: + self.parse_remote_metadata(timeout) - if metadataUrl['url'] is not None and parse_remote_metadata: # download URL + def parse_remote_metadata(self, timeout=30): + """Parse remote metadata for MetadataURL and add it as metadataUrl['metadata']""" + for metadataUrl in self.metadataUrls: + if metadataUrl['url'] is not None: try: - content = openURL(metadataUrl['url'], timeout=timeout) - doc = etree.parse(content) - try: # FGDC - metadataUrl['metadata'] = Metadata(doc) - except: # ISO - metadataUrl['metadata'] = MD_Metadata(doc) - except Exception: + content = openURL( + metadataUrl['url'], timeout=timeout) + doc = etree.fromstring(content.read()) + + mdelem = doc.find('.//metadata') + if mdelem is not None: + metadataUrl['metadata'] = Metadata(mdelem) + continue + + mdelem = doc.find('.//' + util.nspath_eval('gmd:MD_Metadata', n.get_namespaces(['gmd']))) \ + or doc.find('.//' + util.nspath_eval('gmi:MI_Metadata', n.get_namespaces(['gmi']))) + if mdelem is not None: + metadataUrl['metadata'] = MD_Metadata(mdelem) + continue + except: metadataUrl['metadata'] = None - - self.metadataUrls.append(metadataUrl) diff -Nru owslib-0.16.0/owslib/feature/wfs300.py owslib-0.18.0/owslib/feature/wfs300.py --- owslib-0.16.0/owslib/feature/wfs300.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/owslib/feature/wfs300.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,182 @@ +# ============================================================================= +# Copyright (c) 2018 Tom Kralidis +# +# Authors : Tom Kralidis +# +# Contact email: tomkralidis@gmail.com +# ============================================================================= + +import json +import logging + +from six.moves.urllib.parse import urljoin + +from owslib import __version__ +from owslib.util import Authentication, http_get + +LOGGER = logging.getLogger(__name__) + +REQUEST_HEADERS = { + 'User-Agent': 'OWSLib {} (https://geopython.github.io/OWSLib)'.format( + __version__) +} + + +class WebFeatureService_3_0_0(object): + """Abstraction for OGC Web Feature Service (WFS) version 3.0""" + def __init__(self, url, version, json_, timeout=30, username=None, + password=None, auth=None): + """ + initializer; implements Requirement 1 (/req/core/root-op) + + @type url: string + @param url: url of WFS root document + @type json_: string + @param json_: json object + @param timeout: time (in seconds) after which requests should timeout + @param username: service authentication username + @param password: service authentication password + @param auth: instance of owslib.util.Authentication + + @return: initialized WebFeatureService_3_0_0 object + """ + + if '?' in url: + self.url, self.url_query_string = url.split('?') + else: + self.url = url.rstrip('/') + '/' + self.url_query_string = None + + self.version = version + self.json_ = json_ + self.timeout = timeout + if auth: + if username: + auth.username = username + if password: + auth.password = password + self.auth = auth or Authentication(username, password) + + if json_ is not None: # static JSON string + self.links = json.loads(json_)['links'] + else: + response = http_get(url, headers=REQUEST_HEADERS, auth=self.auth).json() + self.links = response['links'] + + def api(self): + """ + implements Requirement 3 (/req/core/api-definition-op) + + @returns: OpenAPI definition object + """ + + url = self._build_url('api') + LOGGER.debug('Request: {}'.format(url)) + response = http_get(url, headers=REQUEST_HEADERS, auth=self.auth).json() + return response + + def conformance(self): + """ + implements Requirement 5 (/req/core/conformance-op) + + @returns: conformance object + """ + + url = self._build_url('conformance') + LOGGER.debug('Request: {}'.format(url)) + response = http_get(url, headers=REQUEST_HEADERS, auth=self.auth).json() + return response + + def collections(self): + """ + implements Requirement 9 (/req/core/collections-op) + + @returns: collections object + """ + + url = self._build_url('collections') + LOGGER.debug('Request: {}'.format(url)) + response = http_get(url, headers=REQUEST_HEADERS, auth=self.auth).json() + return response['collections'] + + def collection(self, collection_name): + """ + implements Requirement 15 (/req/core/sfc-md-op) + + @type collection_name: string + @param collection_name: name of collection + + @returns: feature collection metadata + """ + + path = 'collections/{}'.format(collection_name) + url = self._build_url(path) + LOGGER.debug('Request: {}'.format(url)) + response = http_get(url, headers=REQUEST_HEADERS, auth=self.auth).json() + return response + + def collection_items(self, collection_name, **kwargs): + """ + implements Requirement 17 (/req/core/fc-op) + + @type collection_name: string + @param collection_name: name of collection + @type bbox: list + @param bbox: list of minx,miny,maxx,maxy + @type time: string + @param time: time extent or time instant + @type limit: int + @param limit: limit number of features + @type startindex: int + @param startindex: start position of results + + @returns: feature results + """ + + if 'bbox' in kwargs: + kwargs['bbox'] = ','.join(kwargs['bbox']) + + path = 'collections/{}/items'.format(collection_name) + url = self._build_url(path) + LOGGER.debug('Request: {}'.format(url)) + response = http_get(url, headers=REQUEST_HEADERS, params=kwargs, auth=self.auth).json() + return response + + def collection_item(self, collection_name, identifier): + """ + implements Requirement 30 (/req/core/f-op) + + @type collection_name: string + @param collection_name: name of collection + @type identifier: string + @param identifier: feature identifier + + @returns: single feature result + """ + + path = 'collections/{}/items/{}'.format(collection_name, identifier) + url = self._build_url(path) + LOGGER.debug('Request: {}'.format(url)) + response = http_get(url, headers=REQUEST_HEADERS, auth=self.auth).json() + return response + + def _build_url(self, path=None): + """ + helper function to build a WFS 3.0 URL + + @type path: string + @param path: path of WFS URL + + @returns: fully constructed URL path + """ + + url = self.url + if self.url_query_string is not None: + LOGGER.debug('base URL has a query string') + url = urljoin(url, path) + url = '?'.join([url, self.url_query_string]) + else: + url = urljoin(url, path) + + LOGGER.debug('URL: {}'.format(url)) + return url diff -Nru owslib-0.16.0/owslib/__init__.py owslib-0.18.0/owslib/__init__.py --- owslib-0.16.0/owslib/__init__.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/__init__.py 2019-06-25 00:00:28.000000000 +0000 @@ -1,3 +1,3 @@ from __future__ import (absolute_import, division, print_function) -__version__ = '0.16.0' +__version__ = '0.18.0' diff -Nru owslib-0.16.0/owslib/iso.py owslib-0.18.0/owslib/iso.py --- owslib-0.16.0/owslib/iso.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/iso.py 2019-06-25 00:00:28.000000000 +0000 @@ -319,6 +319,7 @@ self.distance = [] self.uom = [] self.resourcelanguage = [] + self.resourcelanguagecode = [] self.creator = [] self.publisher = [] self.contributor = [] @@ -349,7 +350,8 @@ self.aggregationinfo = util.testXMLValue(val) self.uricode = [] - for i in md.findall(util.nspath_eval('gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:RS_Identifier/gmd:code/gco:CharacterString', namespaces)): + for i in md.findall(util.nspath_eval('gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:RS_Identifier/gmd:code/gco:CharacterString', namespaces)) + \ + md.findall(util.nspath_eval('gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:MD_Identifier/gmd:code/gco:CharacterString', namespaces)): val = util.testXMLValue(i) if val is not None: self.uricode.append(val) @@ -368,12 +370,16 @@ self.uselimitation = [] self.uselimitation_url = [] - for i in md.findall(util.nspath_eval('gmd:resourceConstraints/gmd:MD_Constraints/gmd:useLimitation/gco:CharacterString', namespaces)): + for i in \ + md.findall(util.nspath_eval('gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:useLimitation/gco:CharacterString', namespaces)) + \ + md.findall(util.nspath_eval('gmd:resourceConstraints/gmd:MD_Constraints/gmd:useLimitation/gco:CharacterString', namespaces)): val = util.testXMLValue(i) if val is not None: self.uselimitation.append(val) - for i in md.findall(util.nspath_eval('gmd:resourceConstraints/gmd:MD_Constraints/gmd:useLimitation/gmx:Anchor', namespaces)): + for i in \ + md.findall(util.nspath_eval('gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:useLimitation/gmx:Anchor', namespaces)) + \ + md.findall(util.nspath_eval('gmd:resourceConstraints/gmd:MD_Constraints/gmd:useLimitation/gmx:Anchor', namespaces)): val = util.testXMLValue(i) val1 = i.attrib.get(util.nspath_eval('xlink:href', namespaces)) @@ -401,7 +407,7 @@ self.securityconstraints = [] for i in md.findall(util.nspath_eval('gmd:resourceConstraints/gmd:MD_SecurityConstraints/gmd:classification/gmd:MD_ClassificationCode', namespaces)): - val = util.testXMLValue(i) + val = _testCodeListValue(i) if val is not None: self.securityconstraints.append(val) @@ -425,10 +431,16 @@ self.distance.append(val) self.uom.append(i.get("uom")) - self.resourcelanguage = [] + self.resourcelanguagecode = [] for i in md.findall(util.nspath_eval('gmd:language/gmd:LanguageCode', namespaces)): val = _testCodeListValue(i) if val is not None: + self.resourcelanguagecode.append(val) + + self.resourcelanguage = [] + for i in md.findall(util.nspath_eval('gmd:language/gco:CharacterString', namespaces)): + val = util.testXMLValue(i) + if val is not None: self.resourcelanguage.append(val) self.creator = [] @@ -454,6 +466,7 @@ val = md.find(util.nspath_eval('gmd:abstract/gmx:Anchor', namespaces)) + self.abstract_url = None if val is not None: self.abstract = util.testXMLValue(val) self.abstract_url = val.attrib.get(util.nspath_eval('xlink:href', namespaces)) @@ -496,7 +509,7 @@ mdkw['thesaurus']['date'] = util.testXMLValue(val) val = i.find(util.nspath_eval('gmd:MD_Keywords/gmd:thesaurusName/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode', namespaces)) - mdkw['thesaurus']['datetype'] = util.testXMLValue(val) + mdkw['thesaurus']['datetype'] = util.testXMLAttribute(val, 'codeListValue') mdkw['keywords'] = [] @@ -958,7 +971,7 @@ self.featurecatalogues = [] for i in fcd.findall(util.nspath_eval('gmd:featureCatalogueCitation', namespaces)): - val = i.attrib['uuidref'] + val = i.attrib.get('uuidref') val = util.testXMLValue(val, attrib=True) if val is not None: self.featurecatalogues.append(val) diff -Nru owslib-0.16.0/owslib/map/common.py owslib-0.18.0/owslib/map/common.py --- owslib-0.16.0/owslib/map/common.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/map/common.py 2019-06-25 00:00:28.000000000 +0000 @@ -7,22 +7,27 @@ from urllib import urlencode from owslib.etree import etree -from owslib.util import openURL, strip_bom +from owslib.util import strip_bom, Authentication, openURL + class WMSCapabilitiesReader(object): """Read and parse capabilities document into a lxml.etree infoset """ - def __init__(self, version='1.1.1', url=None, un=None, pw=None, headers=None): + def __init__(self, version='1.1.1', url=None, un=None, pw=None, headers=None, auth=None): """Initialize""" self.version = version self._infoset = None self.url = url - self.username = un - self.password = pw + if auth: + if un: + auth.username = un + if pw: + auth.password = pw self.headers = headers self.request = None + self.auth = auth or Authentication(un, pw) #if self.username and self.password: ## Provide login information in order to use the WMS server @@ -65,10 +70,7 @@ # now split it up again to use the generic openURL function... spliturl = self.request.split('?') u = openURL(spliturl[0], spliturl[1], method='Get', - username=self.username, - password=self.password, - timeout=timeout, - headers=self.headers) + timeout=timeout, headers=self.headers, auth=self.auth) raw_text = strip_bom(u.read()) return etree.fromstring(raw_text) @@ -82,3 +84,12 @@ raise ValueError("String must be of type string or bytes, not %s" % type(st)) raw_text = strip_bom(st) return etree.fromstring(raw_text) + + +class AbstractContentMetadata(object): + + def __init__(self, auth=None): + self.auth = auth or Authentication() + + def get_metadata(self): + return [m['metadata'] for m in self.metadataUrls if m.get('metadata', None) is not None] diff -Nru owslib-0.16.0/owslib/map/wms111.py owslib-0.18.0/owslib/map/wms111.py --- owslib-0.16.0/owslib/map/wms111.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/map/wms111.py 2019-06-25 00:00:28.000000000 +0000 @@ -30,11 +30,13 @@ from owslib.etree import etree from owslib.util import (openURL, testXMLValue, extract_xml_list, xmltag_split, OrderedDict, ServiceException, - bind_url) + bind_url, nspath_eval, Authentication) from owslib.fgdc import Metadata from owslib.iso import MD_Metadata -from owslib.map.common import WMSCapabilitiesReader +from owslib.map.common import WMSCapabilitiesReader, AbstractContentMetadata +from owslib.namespaces import Namespaces +n = Namespaces() class CapabilitiesError(Exception): pass @@ -55,25 +57,24 @@ else: raise KeyError("No content named %s" % name) - def __init__(self, url, version='1.1.1', xml=None, - username=None, - password=None, - parse_remote_metadata=False, - headers=None, - timeout=30): + def __init__(self, url, version='1.1.1', xml=None, username=None, password=None, + parse_remote_metadata=False, headers=None, timeout=30, auth=None): """Initialize.""" + if auth: + if username: + auth.username = username + if password: + auth.password = password self.url = url - self.username = username - self.password = password self.version = version self.timeout = timeout self.headers = headers self._capabilities = None + self.auth = auth or Authentication(username, password) # Authentication handled by Reader - reader = WMSCapabilitiesReader(self.version, url=self.url, - un=self.username, pw=self.password, - headers=headers) + reader = WMSCapabilitiesReader( + self.version, url=self.url, headers=headers, auth=self.auth) if xml: # read from stored xml self._capabilities = reader.readString(xml) else: # read from server @@ -147,8 +148,7 @@ NOTE: this is effectively redundant now""" reader = WMSCapabilitiesReader( - self.version, url=self.url, un=self.username, pw=self.password - ) + self.version, url=self.url, auth=self.auth) u = self._open(reader.capabilities_url(self.url)) # check for service exceptions, and return if u.info()['Content-Type'] == 'application/vnd.ogc.se_xml': @@ -264,10 +264,10 @@ self.request = bind_url(base_url) + data - u = openURL(base_url, data, method, username=self.username, password=self.password, timeout=timeout or self.timeout) + u = openURL(base_url, data, method, timeout=timeout or self.timeout, auth=self.auth) # check for service exceptions, and return - if u.info()['Content-Type'].split(';')[0] in ['application/vnd.ogc.se_xml']: + if u.info().get('Content-Type', '').split(';')[0] in ['application/vnd.ogc.se_xml']: se_xml = u.read() se_tree = etree.fromstring(se_xml) err_message = six.text_type(se_tree.find('ServiceException').text).strip() @@ -310,7 +310,7 @@ transparent=transparent, bgcolor=bgcolor, exceptions=exceptions, - kwargs=kwargs) + **kwargs) # extend to GetFeatureInfo-Request request['request'] = 'GetFeatureInfo' @@ -330,7 +330,7 @@ self.request = bind_url(base_url) + data - u = openURL(base_url, data, method, username=self.username, password=self.password, timeout=timeout or self.timeout) + u = openURL(base_url, data, method, timeout=timeout or self.timeout, auth=self.auth) # check for service exceptions, and return if u.info()['Content-Type'] == 'application/vnd.ogc.se_xml': @@ -375,7 +375,10 @@ self.name=name.text else: self.name=None - self.url=self._root.find('OnlineResource').attrib.get('{http://www.w3.org/1999/xlink}href', '') + self.url = None + online_resource = self._root.find('OnlineResource') + if online_resource is not None: + self.url = online_resource.attrib.get('{http://www.w3.org/1999/xlink}href', '') #contact metadata contact = self._root.find('ContactInformation') ## sometimes there is a contact block that is empty, so make @@ -399,13 +402,16 @@ return item raise KeyError("No operation named %s" % name) -class ContentMetadata: +class ContentMetadata(AbstractContentMetadata): """ Abstraction for WMS layer metadata. Implements IContentMetadata. """ - def __init__(self, elem, parent=None, children=None, index=0, parse_remote_metadata=False, timeout=30): + + def __init__(self, elem, parent=None, children=None, index=0, + parse_remote_metadata=False, timeout=30, auth=None): + super(ContentMetadata, self).__init__(auth) if elem.tag != 'Layer': raise ValueError('%s should be a Layer' % (elem,)) @@ -567,19 +573,6 @@ 'format': testXMLValue(m.find('Format')), 'url': testXMLValue(m.find('OnlineResource').attrib['{http://www.w3.org/1999/xlink}href'], attrib=True) } - - if metadataUrl['url'] is not None and parse_remote_metadata: # download URL - try: - content = openURL(metadataUrl['url'], timeout=timeout) - doc = etree.parse(content) - if metadataUrl['type'] is not None: - if metadataUrl['type'] == 'FGDC': - metadataUrl['metadata'] = Metadata(doc) - if metadataUrl['type'] == 'TC211': - metadataUrl['metadata'] = MD_Metadata(doc) - except Exception: - metadataUrl['metadata'] = None - self.metadataUrls.append(metadataUrl) # DataURLs @@ -595,6 +588,31 @@ for child in elem.findall('Layer'): self.layers.append(ContentMetadata(child, self)) + def parse_remote_metadata(self, timeout=30): + """Parse remote metadata for MetadataURL and add it as metadataUrl['metadata']""" + for metadataUrl in self.metadataUrls: + if metadataUrl['url'] is not None \ + and metadataUrl['format'].lower() in ['application/xml', 'text/xml']: # download URL + try: + content = openURL( + metadataUrl['url'], timeout=timeout, auth=self.auth) + doc = etree.fromstring(content.read()) + + if metadataUrl['type'] == 'FGDC': + mdelem = doc.find('.//metadata') + if mdelem is not None: + metadataUrl['metadata'] = Metadata(mdelem) + continue + + if metadataUrl['type'] == 'TC211': + mdelem = doc.find('.//' + nspath_eval('gmd:MD_Metadata', n.get_namespaces(['gmd']))) \ + or doc.find('.//' + nspath_eval('gmi:MI_Metadata', n.get_namespaces(['gmi']))) + if mdelem is not None: + metadataUrl['metadata'] = MD_Metadata(mdelem) + continue + except Exception: + metadataUrl['metadata'] = None + @property def children(self): return self._children diff -Nru owslib-0.16.0/owslib/map/wms130.py owslib-0.18.0/owslib/map/wms130.py --- owslib-0.16.0/owslib/map/wms130.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/map/wms130.py 2019-06-25 00:00:28.000000000 +0000 @@ -25,13 +25,12 @@ from owslib.etree import etree from owslib.util import (openURL, ServiceException, testXMLValue, extract_xml_list, xmltag_split, OrderedDict, nspath, - bind_url) -from owslib.util import nspath + nspath_eval, bind_url, Authentication) from owslib.fgdc import Metadata from owslib.iso import MD_Metadata from owslib.crs import Crs from owslib.namespaces import Namespaces -from owslib.map.common import WMSCapabilitiesReader +from owslib.map.common import WMSCapabilitiesReader, AbstractContentMetadata from owslib.util import log @@ -53,20 +52,23 @@ def __init__(self, url, version='1.3.0', xml=None, username=None, password=None, parse_remote_metadata=False, timeout=30, - headers=None): + headers=None, auth=None): """initialize""" + if auth: + if username: + auth.username = username + if password: + auth.password = password self.url = url - self.username = username - self.password = password self.version = version self.timeout = timeout self.headers = headers self._capabilities = None + self.auth = auth or Authentication(username, password) # Authentication handled by Reader - reader = WMSCapabilitiesReader(self.version, url=self.url, - un=self.username, pw=self.password, - headers=headers) + reader = WMSCapabilitiesReader( + self.version, url=self.url, headers=headers, auth=self.auth) if xml: # read from stored xml self._capabilities = reader.readString(xml) else: # read from server @@ -303,12 +305,7 @@ self.request = bind_url(base_url) + data - u = openURL(base_url, - data, - method, - username=self.username, - password=self.password, - timeout=timeout or self.timeout) + u = openURL(base_url, data, method, timeout=timeout or self.timeout, auth=self.auth) # need to handle casing in the header keys headers = {} @@ -316,7 +313,7 @@ headers[k.lower()] = v # handle the potential charset def - if headers['content-type'].split(';')[0] in ['application/vnd.ogc.se_xml', 'text/xml']: + if headers.get('content-type', '').split(';')[0] in ['application/vnd.ogc.se_xml', 'text/xml']: se_xml = u.read() se_tree = etree.fromstring(se_xml) err_message = six.text_type(se_tree.find(nspath('ServiceException', OGC_NAMESPACE)).text).strip() @@ -362,7 +359,7 @@ transparent=transparent, bgcolor=bgcolor, exceptions=exceptions, - kwargs=kwargs) + **kwargs) # extend to GetFeatureInfo-Request request['request'] = 'GetFeatureInfo' @@ -382,7 +379,7 @@ self.request = bind_url(base_url) + data - u = openURL(base_url, data, method, username=self.username, password=self.password, timeout=timeout or self.timeout) + u = openURL(base_url, data, method, timeout=timeout or self.timeout, auth=self.auth) # check for service exceptions, and return if u.info()['Content-Type'] == 'XML': @@ -412,7 +409,10 @@ self.name = name.text else: self.name = None - self.url = self._root.find(nspath('OnlineResource', WMS_NAMESPACE)).attrib.get('{http://www.w3.org/1999/xlink}href', '') + self.url = None + online_resource = self._root.find(nspath('OnlineResource', WMS_NAMESPACE)) + if online_resource is not None: + self.url = online_resource.attrib.get('{http://www.w3.org/1999/xlink}href', '') # contact metadata contact = self._root.find(nspath('ContactInformation', WMS_NAMESPACE)) # sometimes there is a contact block that is empty, so make @@ -423,8 +423,12 @@ self.contact = None -class ContentMetadata(object): - def __init__(self, elem, parent=None, children=None, index=0, parse_remote_metadata=False, timeout=30): +class ContentMetadata(AbstractContentMetadata): + + def __init__(self, elem, parent=None, children=None, index=0, parse_remote_metadata=False, + timeout=30, auth=None): + super(ContentMetadata, self).__init__(auth) + if xmltag_split(elem.tag) != 'Layer': raise ValueError('%s should be a Layer' % (elem,)) @@ -637,21 +641,11 @@ 'format': testXMLValue(m.find(nspath('Format', WMS_NAMESPACE))), 'url': testXMLValue(m.find(nspath('OnlineResource', WMS_NAMESPACE)).attrib['{http://www.w3.org/1999/xlink}href'], attrib=True) } - - if metadataUrl['url'] is not None and parse_remote_metadata: # download URL - try: - content = openURL(metadataUrl['url'], timeout=timeout) - doc = etree.parse(content) - if metadataUrl['type'] is not None: - if metadataUrl['type'] == 'FGDC': - metadataUrl['metadata'] = Metadata(doc) - if metadataUrl['type'] == 'TC211': - metadataUrl['metadata'] = MD_Metadata(doc) - except Exception: - metadataUrl['metadata'] = None - self.metadataUrls.append(metadataUrl) + if parse_remote_metadata: + self.parse_remote_metadata(timeout) + # DataURLs self.dataUrls = [] for m in elem.findall(nspath('DataURL', WMS_NAMESPACE)): @@ -674,6 +668,29 @@ for child in elem.findall(nspath('Layer', WMS_NAMESPACE)): self.layers.append(ContentMetadata(child, self)) + def parse_remote_metadata(self, timeout=30): + """Parse remote metadata for MetadataURL and add it as metadataUrl['metadata']""" + for metadataUrl in self.metadataUrls: + if metadataUrl['url'] is not None \ + and metadataUrl['format'].lower() in ['application/xml', 'text/xml']: # download URL + try: + content = openURL( + metadataUrl['url'], timeout=timeout, auth=self.auth) + doc = etree.fromstring(content.read()) + + mdelem = doc.find('.//metadata') + if mdelem is not None: + metadataUrl['metadata'] = Metadata(mdelem) + continue + + mdelem = doc.find('.//' + nspath_eval('gmd:MD_Metadata', n.get_namespaces(['gmd']))) \ + or doc.find('.//' + nspath_eval('gmi:MI_Metadata', n.get_namespaces(['gmi']))) + if mdelem is not None: + metadataUrl['metadata'] = MD_Metadata(mdelem) + continue + except Exception: + metadataUrl['metadata'] = None + @property def children(self): return self._children diff -Nru owslib-0.16.0/owslib/owscontext/atom.py owslib-0.18.0/owslib/owscontext/atom.py --- owslib-0.16.0/owslib/owscontext/atom.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/owslib/owscontext/atom.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,975 @@ +# -*- coding: utf-8 -*- +# ============================================================================= +# Authors : Alexander Kmoch +# +# ============================================================================= + +""" +API for OGC Web Services Context Document (OWS Context) format. + +ATOM XML Encoding: http://www.opengeospatial.org/standards/owc + +OGC OWS Context Atom Encoding Standard 1.0 (12-084r2) +""" + +from __future__ import (absolute_import, division, print_function) + +from owslib.etree import etree, ParseError +from owslib import util +from owslib.namespaces import Namespaces +from owslib.util import nspath_eval, element_to_string + +from owslib.util import log + +from owslib.owscontext.common import is_empty, extract_p, \ + try_int, try_float + +# default variables +add_namespaces = {"georss": "http://www.georss.org/georss", + "owc": "http://www.opengis.net/owc/1.0", + "xml": "http://www.w3.org/XML/1998/namespace"} + + +def get_namespaces(): + n = Namespaces() + ns = n.get_namespaces(["atom", "dc", "gml", "gml32", "xlink"]) + ns.update(add_namespaces) + ns[None] = n.get_namespace("atom") + return ns + + +ns = get_namespaces() + + +def nspv(path): + """ + short-hand syntax seen in waterml2.py + :param path: xpath namespace aware + :return: xml element + """ + return nspath_eval(path, ns) + + +def ns_elem(ns_prefix, elem_name): + ns_uri = ns.get(ns_prefix) + if ns_uri is not None: + return """{%(ns_uri)s}%(elem_name)s""" % {"ns_uri": ns_uri, + "elem_name": elem_name} + + +def parse_owc_content(content_node): + mimetype = util.testXMLAttribute(content_node, 'type') + url = util.testXMLAttribute(content_node, 'href') + title = util.testXMLAttribute(content_node, 'title') + child_elem = None + if len(list(content_node)) > 0: + child_elem = element_to_string( + list(content_node)[0],False) + + content_dict = { + "type": mimetype, + "url": url, + "content": str(child_elem), + "title": title + } + return content_dict + + +def parse_entry(entry_node): + """ + parse an aotm entry into a feature/resource dict to build OwcResource from + + :param entry_node: xml element root node of the atom:entry + :return: dictionary for OwcResource.from_dict() + """ + resource_base_dict = { + "type": "Feature", + "id": None, + "geometry": None, + "properties": { + 'title': None, + 'abstract': None, + 'updated': None, + 'date': None, + 'authors': [], + + 'publisher': None, + 'rights': None, + 'categories': [], + "links": { + "alternates": [], + "previews": [], + "data": [], + "via": [], + }, + 'offerings': [], + 'active': None, + 'minscaledenominator': None, + 'maxscaledenominator': None, + 'folder': None + } + } + + # ftp://ftp.remotesensing.org/pub/geotiff/samples/gdal_eg/cea.txt + val = entry_node.find(util.nspath_eval('atom:id', ns)) + id = util.testXMLValue(val) + # log.debug("entry :id %s :: %s", id, val) + resource_base_dict.update({"id": id}) + + # GeoTIFF Example + val = entry_node.find(util.nspath_eval('atom:title', ns)) + title = util.testXMLValue(val) + # log.debug("entry: title %s :: %s", id, val) + resource_base_dict['properties'].update({"title": title}) + + # 2011-11-01T00:00:00Z + val = entry_node.find(util.nspath_eval('atom:updated', ns)) + update_date = util.testXMLValue(val) + # log.debug("entry: updated %s :: %s", update_date, val) + resource_base_dict['properties'].update({"updated": update_date}) + + # + val = entry_node.find(util.nspath_eval('dc:publisher', ns)) + publisher = util.testXMLValue(val) + # log.debug("entry: dc:publisher %s :: %s", publisher, val) + resource_base_dict['properties'].update({"publisher": publisher}) + + # + val = entry_node.find(util.nspath_eval('dc:rights', ns)) + rights = util.testXMLValue(val) + # log.debug("entry: rights %s :: %s", rights, val) + resource_base_dict['properties'].update({"rights": rights}) + + # + val = entry_node.find(util.nspath_eval('georss:where', ns)) + if val is not None: + if len(list(val)) > 0: + # xmltxt = etree.tostring( + # list(val)[0], encoding='utf8', method='xml') + xmltxt = element_to_string( + list(val)[0], False) + # TODO here parse geometry?? + # log.debug("entry: geometry %s :: %s", xmltxt, val) + resource_base_dict.update({"geometry": xmltxt.decode('utf-8')}) + + # aka subtitle, aka abstract + val = entry_node.find(util.nspath_eval('atom:content', ns)) + subtitle = util.testXMLValue(val) + # log.debug("entry: subtitle %s :: %s", subtitle, val) + resource_base_dict['properties'].update({"abstract": subtitle}) + + # .. + # + # + vals = entry_node.findall(util.nspath_eval('atom:author', ns)) + authors = [] + for val in vals: + val_name = val.find(util.nspath_eval('atom:name', ns)) + val_email = val.find(util.nspath_eval('atom:email', ns)) + val_uri = val.find(util.nspath_eval('atom:uri', ns)) + name = util.testXMLValue(val_name) + email = util.testXMLValue(val_email) + uri = util.testXMLValue(val_uri) + author = { + "name": name, + "email": email, + "uri": uri + } + # log.debug("entry: author %s :: %s", author, vals) + if not is_empty(author): + authors.append(author) + + resource_base_dict['properties'].update({"authors": authors}) + + # + # + # + vals = entry_node.findall(util.nspath_eval('atom:link', ns)) + links_alternates = [] + links_previews = [] + links_data = [] + links_via = [] + for val in vals: + rel = util.testXMLAttribute(val, 'rel') + href = util.testXMLAttribute(val, 'href') + mimetype = util.testXMLAttribute(val, 'type') + lang = util.testXMLAttribute(val, 'lang') + title = util.testXMLAttribute(val, 'title') + length = util.testXMLAttribute(val, 'length') + link = { + "href": href, + "type": mimetype, + "length": length, + "lang": lang, + "title": title, + "rel": rel + } + # log.debug("entry: link %s :: %s", link, vals) + if link.get("rel") == "alternate" and not is_empty(link): + links_alternates.append(link) + elif link.get("rel") == "icon" and not is_empty(link): + links_previews.append(link) + elif link.get("rel") == "enclosure" and not is_empty(link): + links_data.append(link) + elif link.get("rel") == "via" and not is_empty(link): + links_via.append(link) + else: + log.warn( + "unknown link type in Ows Resource entry section: %r", link) + + resource_base_dict['properties']['links'].update( + {"alternates": links_alternates}) + resource_base_dict['properties']['links'].update( + {"previews": links_previews}) + resource_base_dict['properties']['links'].update({"data": links_data}) + resource_base_dict['properties']['links'].update({"via": links_via}) + + # + # + # + # .. + # + # raster + # Default Raster + # A sample style that draws a + # + # + offering_nodes = entry_node.findall(util.nspath_eval('owc:offering', ns)) + offerings = [] + for offering_node in offering_nodes: + offering_code = util.testXMLAttribute(offering_node, 'code') + operations = [] + contents = [] + styles = [] + operation_nodes = offering_node.findall( + util.nspath_eval('owc:operation', ns)) + for op_val in operation_nodes: + operations_code = util.testXMLAttribute(op_val, 'code') + http_method = util.testXMLAttribute(op_val, 'method') + mimetype = util.testXMLAttribute(op_val, 'type') + request_url = util.testXMLAttribute(op_val, 'href') + req_content_val = val.find(util.nspath_eval('owc:request', ns)) + req_content = None + if req_content_val is not None: + request_content = parse_owc_content(req_content_val) + + # TODO no example for result/response + op_dict = { + "code": operations_code, + "method": http_method, + "type": mimetype, + "href": request_url, + "request": None if is_empty(req_content) else req_content, + "result": None + } + # log.debug("entry: operation %s :: %s", op_dict, vals) + if not is_empty(op_dict): + operations.append(op_dict) + + content_nodes = offering_node.findall( + util.nspath_eval('owc:content', ns)) + for cont_val in content_nodes: + content_dict = parse_owc_content(cont_val) + # log.debug("entry: content_dict %s :: %s", content_dict, vals) + if not is_empty(content_dict): + contents.append(content_dict) + + style_nodes = offering_node.findall( + util.nspath_eval('owc:styleSet', ns)) + for style_val in style_nodes: + val_name = style_val.find(util.nspath_eval('owc:name', ns)) + val_title = style_val.find(util.nspath_eval('owc:title', ns)) + val_abstr = style_val.find(util.nspath_eval('owc:abstract', ns)) + val_uri = style_val.find(util.nspath_eval('owc:legendURL', ns)) + name = util.testXMLValue(val_name) + title = util.testXMLValue(val_title) + abstr = util.testXMLValue(val_abstr) + legend_url = util.testXMLAttribute(val_uri, 'href') + style_set = { + "name": name, + "title": title, + "abstract": abstr, + "default": None, + "legendURL": legend_url, + "content": None + } + # log.debug("entry: style_set %s :: %s", style_set, vals) + if not is_empty(style_set): + styles.append(style_set) + + offering_dict = { + "code": offering_code, + "operations": operations, + "contents": contents, + "styles": styles + } + if offering_code is not None: + offerings.append(offering_dict) + + resource_base_dict['properties'].update( + {"offerings": offerings}) + + # TODO no examples for active attribute + # 2500 + val = entry_node.find(util.nspath_eval('owc:minScaleDenominator', ns)) + min_scale_denominator = util.testXMLValue(val) + # log.debug("entry: min-scale-... %s :: %s", min_scale_denominator, val) + resource_base_dict['properties'].update( + {"minscaledenominator": min_scale_denominator}) + + # 25000 + val = entry_node.find(util.nspath_eval('owc:maxScaleDenominator', ns)) + max_scale_denominator = util.testXMLValue(val) + # log.debug("entry: max_scale_... %s :: %s", max_scale_denominator, val) + resource_base_dict['properties'].update( + {"maxscaledenominator": max_scale_denominator}) + # TODO no examples for folder attribute + + return resource_base_dict + + +def decode_atomxml(xml_string): + """ + here parse atom xml to a dict for instanciating of OWC:Context + :param xmlstring: + :return: OwcContext-ready dict + """ + context_base_dict = { + "type": "FeatureCollection", + "id": None, + "bbox": None, + "properties": { + "lang": None, + "links": { + "profiles": [], + "via": [], + }, + 'title': None, + 'abstract': None, + 'updated': None, + 'authors': [], + 'publisher': None, + 'generator': None, + 'display': None, + 'rights': None, + 'date': None, + 'categories': [], + }, + 'features': [] + } + feed_root = etree.fromstring(xml_string) + # feed_root = etree.parse(xml_bytes) + # feed_root xml lang use? + # # log.debug(feed_root) + # feed xml:lang=en + # lang = feed_root.get('{http://www.w3.org/XML/1998/namespace}lang') + lang = util.testXMLAttribute( + feed_root, '{http://www.w3.org/XML/1998/namespace}lang') + # log.debug("lang %s ", lang) + context_base_dict['properties'].update({"lang": lang}) + + # + val = feed_root.find(util.nspath_eval('atom:id', ns)) + id = util.testXMLValue(val) + # log.debug("id %s :: %s", id, val) + context_base_dict.update({"id": id}) + + # + val = feed_root.find(util.nspath_eval('atom:title', ns)) + title = util.testXMLValue(val) + # log.debug("title %s :: %s", title, val) + context_base_dict['properties'].update({"title": title}) + + # .. + # + # + vals = feed_root.findall(util.nspath_eval('atom:author', ns)) + authors = [] + for val in vals: + val_name = val.find(util.nspath_eval('atom:name', ns)) + val_email = val.find(util.nspath_eval('atom:email', ns)) + val_uri = val.find(util.nspath_eval('atom:uri', ns)) + name = util.testXMLValue(val_name) + email = util.testXMLValue(val_email) + uri = util.testXMLValue(val_uri) + author = { + "name": name, + "email": email, + "uri": uri + } + # log.debug("author %s :: %s", author, vals) + if not is_empty(author): + authors.append(author) + + context_base_dict['properties'].update({"authors": authors}) + + # + val = feed_root.find(util.nspath_eval('georss:where', ns)) + if val is not None: + if len(list(val)) > 0: + xmltxt = element_to_string( + list(val)[0], False) + # log.debug("geometry %s :: %s", xmltxt, val) + context_base_dict['properties'].update({"bbox": xmltxt.decode('utf-8')}) + + # 2012-11-04T17:26:23Z + val = feed_root.find(util.nspath_eval('atom:updated', ns)) + update_date = util.testXMLValue(val) + # log.debug("updated %s :: %s", update_date, val) + context_base_dict['properties'].update({"updated": update_date}) + + # 2009-01-23T09:08:56.000Z/2009-01-23T09:14:08.000Z + val = feed_root.find(util.nspath_eval('dc:date', ns)) + time_interval_of_interest = util.testXMLValue(val) + # log.debug("dc:date %s :: %s", time_interval_of_interest, val) + context_base_dict['properties'].update( + {"date": time_interval_of_interest}) + + # + val = feed_root.find(util.nspath_eval('atom:rights', ns)) + rights = util.testXMLValue(val) + # log.debug("rights %s :: %s", rights, val) + context_base_dict['properties'].update({"rights": rights}) + + # + val = feed_root.find(util.nspath_eval('dc:publisher', ns)) + publisher = util.testXMLValue(val) + # log.debug("dc:publisher %s :: %s", publisher, val) + context_base_dict['properties'].update({"publisher": publisher}) + + # + # + val_display = feed_root.find(util.nspath_eval('owc:display', ns)) + val_pixel_width = None if val_display is None \ + else val_display.find(util.nspath_eval('owc:pixelWidth', ns)) + val_pixel_height = None if val_display is None \ + else val_display.find(util.nspath_eval('owc:pixelHeight', ns)) + val_mm_per_pixel = None if val_display is None \ + else val_display.find(util.nspath_eval('owc:mmPerPixel', ns)) + pixel_width = util.testXMLValue(val_pixel_width) + pixel_height = util.testXMLValue(val_pixel_height) + mm_per_pixel = util.testXMLValue(val_mm_per_pixel) + owc_display = { + "pixelWidth": pixel_width, + "pixelHeight": pixel_height, + "mmPerPixel": mm_per_pixel + } + # log.debug("display %s :: %s", owc_display, val_display) + if not is_empty(owc_display): + context_base_dict['properties'].update({"display": owc_display}) + + # MiraMon + val = feed_root.find(util.nspath_eval('atom:generator', ns)) + name = util.testXMLValue(val) + version = util.testXMLAttribute(val, 'version') + uri = util.testXMLAttribute(val, 'uri') + owc_generator = { + "name": name, + "version": version, + "uri": uri + } + # log.debug("generator %s :: %s", owc_generator, val) + if not is_empty(owc_generator): + context_base_dict['properties'].update({"generator": owc_generator}) + + # + vals = feed_root.findall(util.nspath_eval('atom:category', ns)) + categories = [] + for val in vals: + term = util.testXMLAttribute(val, 'term') + scheme = util.testXMLAttribute(val, 'scheme') + label = util.testXMLAttribute(val, 'label') + category = { + "term": term, + "scheme": scheme, + "label": label + } + # log.debug("category %s :: %s", category, vals) + if not is_empty(category): + categories.append(category) + + context_base_dict['properties'].update({"categories": categories}) + + # ... + entries = feed_root.findall(util.nspath_eval('atom:entry', ns)) + resources = [] + for entry in entries: + entry_dict = parse_entry(entry) + + if entry_dict.get("id") is not None: + resources.append(entry_dict) + else: + log.warn("feature entry has no id, not allowed: skipping!") + + context_base_dict.update({"features": resources}) + return context_base_dict + + +def encode_atomxml(obj_d): + """ + encode instance of OwcContext dict into atom xml encoding, + because we can't do circular imports + :param obj_d: the dict from owscontext to dict + :return: b'atomxml' + """ + + # try: + # xml_tree = axml_context(obj_d) + # tree = etree.ElementTree(xml_tree) + # return tree + # except TypeError as te: + # log.warn('problem encoding context to xml', te) + # raise te + # except AttributeError as ae: + # log.warn('problem encoding context to xml', ae) + # raise ae + # except ValueError as ve: + # log.warn('problem encoding context to xml', ve) + # raise ve + # except ParseError as pe: + # log.warn('problem encoding context to xml', pe) + # raise pe + xml_tree = axml_context(obj_d) + tree = etree.ElementTree(xml_tree) + return element_to_string(tree, encoding='utf-8', xml_declaration=False) + + +def axml_context(d): + """ + encodes base OwcContext as dict to atom xml tree + :param d: + :return: + """ + xml = etree.Element("feed", nsmap=ns) + etree.SubElement(xml, "id").text = d['id'] + + spec_reference = [axml_link(do) for do in + extract_p('properties.links.profiles', d, [])] + [xml.append(el) for el in spec_reference if el is not None] + + area_of_interest = extract_p('bbox', d, None) + if area_of_interest is not None: + try: + gml = etree.fromstring(area_of_interest) + georss = etree.SubElement(xml, ns_elem("georss", "where")) + georss.append(gml) + except Exception as ex: + log.warn('could encode bbox into georss:where', ex) + pass + + context_metadata = [axml_link(do) for do in + extract_p('properties.links.via', d, [])] + [xml.append(el) for el in context_metadata if el is not None] + + language = extract_p('properties.lang', d, None) + if language is not None: xml.set(ns_elem("xml", "lang"), language) + + title = extract_p('properties.title', d, None) + if title is not None: etree.SubElement(xml, "title").text = title + + # + if subtitle is not None: etree.SubElement(entry, "content").text = subtitle + + update_date = extract_p('properties.updated', d, None) + if update_date is not None: etree.SubElement(entry, "updated").text = update_date + + authors = [axml_author(do) for do in + extract_p('properties.authors', d, [])] + [entry.append(el) for el in authors if el is not None] + + publisher = extract_p('properties.publisher', d, None) + if update_date is not None: etree.SubElement(entry, ns_elem("dc", "publisher")).text = publisher + + rights = extract_p('properties.rights', d, None) + if update_date is not None: etree.SubElement(entry, ns_elem("dc", "rights")).text = rights + + temporal_extent = extract_p('properties.date', d, None) + if temporal_extent is not None: etree.SubElement(entry, "date").text = temporal_extent + + keywords = [axml_category(do) for do in + extract_p('properties.categories', d, [])] + [entry.append(el) for el in keywords if el is not None] + + resource_metadata = [axml_link(do) for do in + extract_p('properties.links.via', d, [])] + [entry.append(el) for el in resource_metadata if el is not None] + + content_description = [axml_content(do) + for do in extract_p( + 'properties.links.alternates', d, [])] + [entry.append(el) for el in content_description if el is not None] + + preview = [axml_link(do) for do in + extract_p('properties.links.preview', d, [])] + [entry.append(el) for el in preview if el is not None] + + content_by_ref = [axml_link(do) for do in + extract_p('properties.links.data', d, [])] + [entry.append(el) for el in content_by_ref if el is not None] + + offerings = [axml_offering(do) for do in + extract_p('properties.offerings', d, [])] + [entry.append(el) for el in offerings if el is not None] + + # TODO no examples for active attribute + active = extract_p('properties.active', d, None) + if active is not None: etree.SubElement(entry, "active").text = active + + min_scale_denominator = try_float(extract_p( + 'properties.minscaledenominator', d, None)) + # 2500 + if min_scale_denominator is not None: etree.SubElement(entry, ns_elem("owc", + "minScaleDenominator")).text = str(min_scale_denominator) + + max_scale_denominator = try_float(extract_p( + 'properties.maxscaledenominator', d, None)) + # 25000 + if max_scale_denominator is not None: etree.SubElement(entry, ns_elem("owc", + "maxScaleDenominator")).text = str(max_scale_denominator) + + # TODO no examples for folder attribute + folder = extract_p('properties.folder', d, None) + if folder is not None: etree.SubElement(entry, "folder").text = folder + + # xml.append(entry) + return entry + + +def axml_creator_app(d): + # MiraMon + if is_empty(d): + return None + else: + try: + creator_app = etree.Element("generator", nsmap=ns) + title = extract_p('title', d, None) + if title is not None: creator_app.text = title + uri = extract_p('uri', d, None) + if uri is not None: creator_app.set("uri", uri) + version = extract_p('version', d, None) + if version is not None: creator_app.set("version", version) + return creator_app + except Exception as ex: + log.warn('could encode creator_app', ex) + return None + + +def axml_display(d): + # + # + if is_empty(d): + return None + else: + try: + creator_display = etree.Element(ns_elem("owc", "display"), nsmap=ns) + pixel_width = try_int(extract_p('pixelWidth', d, None)) + if pixel_width is not None: etree.SubElement(creator_display, + ns_elem("owc", "pixelWidth")).text = str(pixel_width) + pixel_height = try_int(extract_p('pixelHeight', d, None)) + if pixel_height is not None: etree.SubElement(creator_display, + ns_elem("owc", "pixelHeight")).text = str(pixel_height) + mm_per_pixel = try_float(extract_p('mmPerPixel', d, None)) + if mm_per_pixel is not None: etree.SubElement(creator_display, + ns_elem("owc", "mmPerPixel")).text = str(mm_per_pixel) + return creator_display + except Exception as ex: + log.warn('could encode creator_display', ex) + return None + + +def axml_link(d): + # < link rel = "via" type = "application/xml" href = "..." title = "..." + if is_empty(d): + return None + else: + try: + link = etree.Element("link", nsmap=ns) + href = extract_p('href', d, None) + if href is not None: link.set("href", href) + rel = extract_p('rel', d, None) + if rel is not None: link.set("rel", rel) + mimetype = extract_p('type', d, None) + if mimetype is not None: link.set("type", mimetype) + lang = extract_p('lang', d, None) + if lang is not None: link.set("lang", lang) + title = extract_p('title', d, None) + if title is not None: link.set("title", title) + length = try_int(extract_p('length', d, None)) + if length is not None: link.set("length", str(length)) + return link + except Exception as ex: + log.warn('could not encode link', ex) + return None + + +def axml_category(d): + # + if is_empty(d): + return None + else: + try: + category = etree.Element("category", nsmap=ns) + term = extract_p('term', d, None) + if term is not None: category.set("term", term) + scheme = extract_p('scheme', d, None) + if scheme is not None: category.set("scheme", scheme) + label = extract_p('label', d, None) + if label is not None: category.set("label", label) + return category + except Exception as ex: + log.warn('could encode category', ex) + return None + + +def axml_author(d): + # .. + # + # + if is_empty(d): + return None + else: + try: + author = etree.Element("author", nsmap=ns) + name = extract_p('name', d, None) + if name is not None: etree.SubElement(author, "name").text = name + email = extract_p('email', d, None) + if email is not None: etree.SubElement(author, "email").text = email + uri = extract_p('uri', d, None) + if uri is not None: etree.SubElement(author, "uri").text = uri + return author + except Exception as ex: + log.warn('could encode author', ex) + return None + + +def axml_offering(d): + # + # + # + if is_empty(d): + return None + else: + try: + offering_code = extract_p('code', d, None) + offering = etree.Element(ns_elem("owc", "offering"), attrib={"code": offering_code}, nsmap=ns) + + # use axml_operation here + operations = [axml_operation(do) for do in + extract_p('operations', d, [])] + [offering.append(el) for el in operations if el is not None] + # use axml_content here + contents = [axml_content(do) for do in + extract_p('contents', d, [])] + [offering.append(el) for el in contents if el is not None] + # use axml_styeset here + styles = [axml_styleset(do) for do in + extract_p('styles', d, [])] + [offering.append(el) for el in styles if el is not None] + return offering + except Exception as ex: + log.warn('could encode offering', ex) + return None + + +def axml_operation(d): + # .. + # etree.SubElement(entry, ns_elem("owc", "offering"), name="blah").text = "some value1" + if is_empty(d): + return None + else: + try: + operation = etree.Element(ns_elem("owc", "operation"), nsmap=ns) + + operations_code = extract_p('code', d, None) + if operations_code is not None: operation.set("code", operations_code) + http_method = extract_p('method', d, None) + if http_method is not None: operation.set("method", http_method) + mimetype = extract_p('type', d, None) + if mimetype is not None: operation.set("type", mimetype) + request_url = extract_p('href', d, None) + if request_url is not None: operation.set("href", request_url) + + # use axml_content here + request = extract_p('request', d, None) + request_enc = None if request is None else axml_content(request) + if request_enc is not None: operation.append(request_enc) + # use axml_content here + result = extract_p('result', d, None) + result_enc = None if result is None else axml_content(result) + if result_enc is not None: operation.append(result_enc) + return operation + except Exception as ex: + log.warn('could encode operation', ex) + return None + + +def axml_styleset(d): + # + # raster + # Default Raster + # A sample style that draws a + # + # + if is_empty(d): + return None + else: + try: + styleset = etree.Element(ns_elem("owc", "styleSet"), nsmap=ns) + + name = extract_p('name', d, None) + if name is not None: etree.SubElement(styleset, ns_elem("owc", "name")).text = name + title = extract_p('title', d, None) + if title is not None: etree.SubElement(styleset, ns_elem("owc", "title")).text = title + subtitle = extract_p('abstract', d, None) + if subtitle is not None: etree.SubElement(styleset, ns_elem("owc", "abstract")).text = subtitle + is_default = extract_p('default', d, None) + # TODO no example for default setting on style set + if is_default is not None: etree.SubElement(styleset, ns_elem("owc", "default")).text = is_default + legend_url = extract_p('legendURL', d, None) + if legend_url is not None: etree.SubElement(styleset, ns_elem("owc", "legendURL")).text = legend_url + # TODO no example for content on style set + content = extract_p('content', d, None) + content_enc = None if content is None else axml_content(content) + if content_enc is not None: styleset.append(content_enc) + return styleset + except Exception as ex: + log.warn('could encode styleset', ex) + return None + + +def axml_content(d): + """ + OwcContent dict to Atom XML + :param d: + :return: + """ + # +# +# ============================================================================= + +""" +place for some constants to avoid circular imports +""" + +from __future__ import (absolute_import, division, print_function) + +# seen in wms.py +from six.moves.urllib.parse import urlparse + +from datetime import datetime +from dateutil import parser + +""" +The spec reference uri is of course difference for each encoding, +so holding it in the context container object is maybe a bit silly, +thus I use a generic spec reference and and only encode at serialisation time +""" + +GENERIC_OWCSPEC_URL = "http://www.opengis.net/spec/owc-generic/1.0/req" +ATOM_OWCSPEC_URL = "http://www.opengis.net/spec/owc-atom/1.0/req" +GEOJSON_OWCSPEC_URL = "http://www.opengis.net/spec/owc-geojson/1.0/req" + +""" +supported geojson profiles +""" + +SUPPORTED_GEOJSON_PROFILES = [GEOJSON_OWCSPEC_URL + "/core"] + +""" +those are for compliance testing when parsing geojson owc input +""" + +SUPPORTED_GEOJSON_OFFERING_EXTENSIONS = [ + GEOJSON_OWCSPEC_URL + "/wms", + GEOJSON_OWCSPEC_URL + "/wfs", + GEOJSON_OWCSPEC_URL + "/wcs", + GEOJSON_OWCSPEC_URL + "/wps", + GEOJSON_OWCSPEC_URL + "/csw", + GEOJSON_OWCSPEC_URL + "/geotiff", + GEOJSON_OWCSPEC_URL + "/sos" +] + +# FIXME are the geosjson and atom offering codes ok, +# because ATOM offering codes are different (spec vs conf vs req) + +ATOM_OFFERING_CODES = [ + 'http://www.opengis.net/spec/owc/1.0/conf/atom/gml', + 'http://www.opengis.net/spec/owc/1.0/req/atom/wms' + 'http://www.opengis.net/spec/owc-atom/1.0/req/gml', + 'http://www.opengis.net/spec/owc-atom/1.0/req/csw', +] + + +def encodedspecurl_to_genericspecurl(encodedspecurl, genericspecurl): + parsed = urlparse(encodedspecurl) + speccode = "/" + parsed.path.split("/").last.trim + return genericspecurl + speccode + + +def genericspecurl_to_encodedspecurl(genericspecurl, encodedspecurl): + parsed = urlparse(genericspecurl) + speccode = parsed.path.split("/").last.trim + return encodedspecurl + speccode + + +class TimeIntervalFormat(object): + """ + little helper to have time intervals + """ + + def __init__(self, + start, + end=None): + """ + constructor: + + :param start: datetime + :param end: datetime + """ + self.start = start + self.end = end + + def __str__(self): + if self.end is None: + return self.start.isoformat() + else: + return self.start.isoformat() + "/" + self.end.isoformat() + + def to_dict(self): + """ + dict representation of object, for simple object comparison + :return: dict + """ + return { + "start": None if self.start is None else self.start.isoformat(), + "end": None if self.start is None else self.start.isoformat() + } + + @classmethod + def from_string(cls, date_str): + if date_str is None: + return None + try: + date_arr = date_str.split("/") + if len(date_arr) > 1: + start_dt = parser.parse(date_arr[0]) + end_dt = parser.parse(date_arr[1]) + return TimeIntervalFormat(start_dt, end_dt) + else: + single_dt = parser.parse(date_str) + return TimeIntervalFormat(single_dt) + except: + raise ValueError("Error parsing datetime string: %s" % date_str) + + +def skip_nulls(dict_obj): + """ + drops key/val pairs where js value is null, not needed in the JSON + :param o: needs to be dict + :return: + """ + reduced = {k: v for k, v in dict_obj.items() if v is not None} + return reduced + + +def skip_nulls_rec(dict_obj): + """ + removes dict key/val pairs recursively where value is None, + not needed/wanted(?) in the JSON + :param o: needs to be dict + :return: the trimed dict, or exceptionally the value if it wasn't a dict + """ + if not isinstance(dict_obj, dict): + return dict_obj + else: + result = {} + for k, v in dict_obj.items(): + if v is None: + pass + else: + if isinstance(v, dict): + tmp = skip_nulls_rec(v) + result.update({k: tmp}) + elif isinstance(v, list): + tmp = [skip_nulls_rec(o) for o in v] + result.update({k: tmp}) + else: + result.update({k: v}) + return result + + +def extract_p(path, dict_obj, default): + """ + try to extract dict value in key path, if key error provide default + :param path: the nested dict key path, separated by '.' + (therefore no dots in key names allowed) + :param dict_obj: the dictinary object from which to extract + :param default: a default return value if key error + :return: extracted value + """ + if dict_obj is None: + return default + + keys = path.split('.') + tmp_iter = dict_obj + for key in keys: + try: + # dict.get() might make KeyError exception unnecessary + tmp_iter = tmp_iter.get(key, default) + except KeyError: + return default + return tmp_iter + + +def build_from_xp(path, dict_obj, build_class, default): + """ + try to build class instance from extracted path, else return default + :param path: path: the nested dict key path, separated by '.' + (therefore no dots in key names allowed) + :param dict_obj: the dictinary object from which to extract + :param build_class: the class name from which to build + :param default: default return value + :return: ideally the inquired class instance, else default + """ + xp = extract_p(path, dict_obj, default) + if xp is None: + return default + elif xp == default: + return default + else: + return build_class.from_dict(xp) + + +def is_empty(dict_obj): + """ + query if a dict is empty + + :param dict_obj: the to be tested dictionary + :return: True, if it is empty, False if not empty + """ + if isinstance(dict_obj, dict): + if len(dict_obj.items()) <= 0: + return True + else: + switch = True + for k, v in dict_obj.items(): + if v is None: + pass + else: + switch = False + return switch + else: + return False + + +def try_int(num_string): + """ + short hand cast to number + + :param num_string: + :return: int or None + """ + if num_string is not None: + try: + return int(num_string) + except ValueError: + pass + return None + + +def try_float(num_string): + """ + short hand cast to number + + :param num_string: + :return: float or None + """ + if num_string is not None: + try: + return float(num_string) + except ValueError: + pass + return None diff -Nru owslib-0.16.0/owslib/owscontext/core.py owslib-0.18.0/owslib/owscontext/core.py --- owslib-0.16.0/owslib/owscontext/core.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/owslib/owscontext/core.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,975 @@ +# -*- coding: utf-8 -*- +# ============================================================================= +# Authors : Alexander Kmoch +# +# ============================================================================= + +""" +API for OGC Web Services Context Document (OWS Context) format. + +Conceptual model base classes: http://www.opengeospatial.org/standards/owc + +OGC OWS Context Conceptual Model 1.0 (12-080r2) +""" + +from __future__ import (absolute_import, division, print_function) + +from owslib.owscontext.atom import decode_atomxml, encode_atomxml +from owslib.owscontext.common import GENERIC_OWCSPEC_URL +# from owslib.util import log +# TODO make dates from (currently) string to datetime instances +from owslib.owscontext.common import TimeIntervalFormat +from owslib.owscontext.common import try_float, try_int, \ + extract_p, build_from_xp +from owslib.owscontext.geojson import encode_json, decode_json + + +class OwcContext(object): + """ + * + specReference :URI + * + language :CharacterString + * + id :CharacterString + * + title :CharacterString + * + abstract :CharacterString [0..1] + * + updateDate :CharacterString [0..1] + * + author :CharacterString [0..*] + * + publisher :CharacterString [0..1] + * + creator :Creator [0..1] + * +----+ creatorApplication :CreatorApplication [0..1] + * +----+ creatorDisplay :CreatorDisplay [0..1] + * + rights :CharacterString [0..1] + * + areaOfInterest :GM_Envelope [0..1] + * + timeIntervalOfInterest :TM_GeometricPrimitive [0..1] + * + keyword :CharacterString [0..*] + * + extension :Any [0..*] + """ + + def __init__(self, + id, + update_date, + title, + language="en", + spec_reference=[], + area_of_interest=[], + context_metadata=[], + subtitle=None, + authors=[], + publisher=None, + creator_application=None, + creator_display=None, + rights=None, + time_interval_of_interest=None, + keywords=[], + resources=[] + ): + """ + constructor: + + :param id: URL + :param update_date: datetime + :param title: String, + :param language: String = "en" + :param spec_reference: OwcLink[] links.profiles[] and rel=profile + :param area_of_interest: Option[Rectangle] = None, aka Double[] + :param context_metadata: OwcLink[] links.via[] and rel=via + :param subtitle: Option[String] = None, + :param authors: List[OwcAuthor] + :param publisher: Option[String] = None, + :param creator_application: Option[OwcCreatorApplication] = None, + :param creator_display: Option[OwcCreatorDisplay] = None, + :param rights: Option[String] = None, + :param time_interval_of_interest: TimeIntervalFormat(start,end) + :param keywords: OwcCategory[] + :param resources: OwcResource[] + """ + self.id = id + self.spec_reference = spec_reference + self.area_of_interest = area_of_interest + self.context_metadata = context_metadata + self.language = language + self.title = title + self.subtitle = subtitle + self.update_date = update_date + self.authors = authors + self.publisher = publisher + self.creator_application = creator_application + self.creator_display = creator_display + self.rights = rights + self.time_interval_of_interest = time_interval_of_interest + self.keywords = keywords + self.resources = resources + + # TODO spec reference, check or provide? + if len(self.spec_reference) <= 0: + self.spec_reference.append( + OwcLink(href=GENERIC_OWCSPEC_URL, rel='profile')) + + # TODO check and validate? how much? + + def to_dict(self): + """ + + :return: dict of obj + """ + return { + "type": "FeatureCollection", + "id": self.id, + "bbox": self.area_of_interest, + "properties": { + "lang": self.language, + "title": self.title, + "abstract": self.subtitle, + "updated": self.update_date, + "date": + None if self.time_interval_of_interest is None else + self.time_interval_of_interest.__str__(), + "rights": self.rights, + "authors": + [] if len(self.authors) <= 0 else + [obj.to_dict() for obj in self.authors], + "publisher": self.publisher, + "display": + None if self.creator_display is None else + self.creator_display.to_dict(), + "generator": + None if self.creator_application is None else + self.creator_application.to_dict(), + "categories": + [] if len(self.keywords) <= 0 else + [obj.to_dict() for obj in self.keywords], + "links": { + "profiles": + [] if len(self.spec_reference) <= 0 else + [obj.to_dict() for obj in self.spec_reference], + "via": + [] if len(self.context_metadata) <= 0 else + [obj.to_dict() for obj in self.context_metadata] + }, + }, + "features": + [] if len(self.resources) <= 0 else + [obj.to_dict() for obj in self.resources] + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + # TODO add spec url conversion from generic to geojson + return encode_json(self.to_dict()) + + def to_atomxml(self): + # TODO add spec url conversion from generic to atom + return encode_atomxml(self.to_dict()) + + @classmethod + def from_dict(cls, d): + # TODO parse bbox?? + return OwcContext( + id=d['id'], + spec_reference=[OwcLink.from_dict(do) for do in + extract_p('properties.links.profiles', d, [])], + area_of_interest=extract_p('bbox', d, None), + context_metadata=[OwcLink.from_dict(do) for do in + extract_p('properties.links.via', d, [])], + language=extract_p('properties.lang', d, None), + title=extract_p('properties.title', d, None), + subtitle=extract_p('properties.abstract', d, None), + update_date=extract_p('properties.updated', d, None), + authors=[OwcAuthor.from_dict(do) for do in + extract_p('properties.authors', d, [])], + publisher=extract_p('properties.publisher', d, None), + creator_application=build_from_xp( + 'properties.generator', d, OwcCreatorApplication, None), + creator_display=build_from_xp( + 'properties.display', d, OwcCreatorDisplay, None), + rights=extract_p('properties.rights', d, None), + time_interval_of_interest=TimeIntervalFormat.from_string( + extract_p('properties.date', d, None)), + keywords=[OwcCategory.from_dict(do) for do in + extract_p('properties.categories', d, [])], + resources=[OwcResource.from_dict(do) for do in + extract_p('features', d, [])] + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + # TODO add spec url conversion from geojson to generic + # TODO should validate if geojson Type == FeatureCollection? + return cls.from_dict(d) + + @classmethod + def from_atomxml(cls, xml_bytes): + """ + lets see if we can reuse the dict structure builder from geojson + :param xmlstring: + :return: OwcContext + """ + # TODO add spec url conversion from atom to generic + # TODO should validate anything? + # TODO ValueError: Unicode strings with encoding declaration + # are not supported. Please use bytes input or XML fragments + # without declaration -> Decide, currently bytes + d = decode_atomxml(xml_bytes) + return cls.from_dict(d) + + +class OwcResource(object): + """ + * + id :CharacterString - + Unambiguous reference to the identification of the resource, + SHALL contain an (IRI) URI value + * + title :CharacterString + * + abstract :CharacterString [0..1] + * + updateDate :TM_Date [0..1] + * + author :CharacterString [0..*] + * + publisher :CharacterString [0..1] + * + rights :CharacterString [0..1] + * + geospatialExtent :GM_Envelope [0..1] + * + temporalExtent :TM_GeometricPrimitive [0..1] + * + contentDescription :Any [0..1] // aka alternates + * + preview :URI [0..*] + * + contentByRef :URI [0..*] + * + offering :Offering [0..*] + * + active :Boolean [0..1] + * + keyword :CharacterString [0..*] + * + maxScaleDenominator :double [0..1] + * + minScaleDenominator :double [0..1] + * + folder :CharacterString [0..1] + * + extension :Any [0..*] + """ + + def __init__(self, + id, + title, + update_date, + subtitle=None, + authors=[], + publisher=None, + rights=None, + geospatial_extent=None, + temporal_extent=None, + content_description=[], + preview=[], + content_by_ref=[], + offerings=[], + active=False, + resource_metadata=[], + keywords=[], + min_scale_denominator=None, + max_scale_denominator=None, + folder=None + ): + """ + constructor: + + :param id: URL + :param title: String + :param update_date: datetime + :param subtitle: String + :param authors: List[OwcAuthor] + :param publisher: String + :param rights: String + :param geospatial_extent: currently GeoJSON Polygon String + :param temporal_extent: str + :param content_description: OwcLink[] links.alternates, rel=alternate + :param preview: OwcLink[] aka links.previews[] and rel=icon (atom) + :param content_by_ref: OwcLink[], links.data, rel=enclosure (atom) + :param offerings: OwcOffering[] + :param active: Boolean + :param resource_metadata: OwcLink[] aka links.via[] & rel=via + :param keywords: OwcCategory[] + :param min_scale_denominator: Double + :param max_scale_denominator: Double + :param folder: String + """ + # # TimeIntervalFormat(start,end) + self.id = id + self.title = title + self.subtitle = subtitle + self.update_date = update_date + self.authors = authors + self.publisher = publisher + self.rights = rights + self.geospatial_extent = geospatial_extent + self.temporal_extent = temporal_extent + self.content_description = content_description + self.preview = preview + self.content_by_ref = content_by_ref + self.offerings = offerings + self.active = active + self.resource_metadata = resource_metadata + self.keywords = keywords + self.min_scale_denominator = min_scale_denominator + self.max_scale_denominator = max_scale_denominator + self.folder = folder + + def to_dict(self): + # TODO parse geometry?? + return { + "type": "Feature", + "id": self.id, + "geometry": self.geospatial_extent, + "properties": { + "title": self.title, + "abstract": self.subtitle, + "updated": self.update_date, + "date": + None if self.temporal_extent is None else + self.temporal_extent.__str__(), + "authors": + [] if len(self.authors) <= 0 else + [obj.to_dict() for obj in self.authors], + "publisher": self.publisher, + "rights": self.rights, + "categories": + [] if len(self.keywords) <= 0 else + [obj.to_dict() for obj in self.keywords], + "links": { + "alternates": + [] if len(self.content_description) <= 0 else + [obj.to_dict() for obj in + self.content_description], + "previews": + [] if len(self.preview) <= 0 else + [obj.to_dict() for obj in self.preview], + "data": + [] if len(self.content_by_ref) <= 0 else + [obj.to_dict() for obj in + self.content_by_ref], + "via": + [] if len(self.resource_metadata) <= 0 else + [obj.to_dict() for obj in + self.resource_metadata] + }, + "offerings": + [] if len(self.offerings) <= 0 else + [obj.to_dict() for obj in self.offerings], + "active": self.active, + "minscaledenominator": self.min_scale_denominator, + "maxscaledenominator": self.max_scale_denominator, + "folder": self.folder + } + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + return encode_json(self.to_dict()) + + @classmethod + def from_dict(cls, d): + return OwcResource( + id=d['id'], + geospatial_extent=extract_p('geometry', d, None), + title=d['properties']['title'], + subtitle=extract_p('properties.abstract', d, None), + update_date=extract_p('properties.updated', d, None), + authors=[OwcAuthor.from_dict(do) for do in + extract_p('properties.authors', d, [])], + publisher=extract_p('properties.publisher', d, None), + rights=extract_p('properties.rights', d, None), + temporal_extent=TimeIntervalFormat.from_string( + extract_p('properties.date', d, None)), + keywords=[OwcCategory.from_dict(do) for do in + extract_p('properties.categories', d, [])], + resource_metadata=[OwcLink.from_dict(do) for do in + extract_p('properties.links.via', d, [])], + content_description=[OwcLink.from_dict(do) + for do in extract_p( + 'properties.links.alternates', d, [])], + preview=[OwcLink.from_dict(do) for do in + extract_p('properties.links.previews', d, [])], + content_by_ref=[OwcLink.from_dict(do) for do in + extract_p('properties.links.data', d, [])], + offerings=[OwcOffering.from_dict(do) for do in + extract_p('properties.offerings', d, [])], + active=extract_p('properties.active', d, None), + min_scale_denominator=try_float(extract_p( + 'properties.minscaledenominator', d, None)), + max_scale_denominator=try_float(extract_p( + 'properties.maxscaledenominator', d, None)), + folder=extract_p('properties.folder', d, None), + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + # TODO should validate if geojson Type == Feature? + return cls.from_dict(d) + + +class OwcCreator(object): + """ + * + creatorApplication :CreatorApplication [0..1] + * + creatorDisplay :CreatorDisplay [0..1] + * + extension :Any [0..*] + * + * OWCCreator base class is never realized by itself, + neither in Atom nor in GeoJSON Encoding; + * Creator/Display and Creator/Application are instantiated as completely + separate entities in both Atom and GeoJSON + """ + + def __init__(self, + creator_application=None, + creator_display=None + ): + """ + constructor: + + :param creator_application: OwcCreatorApplication + :param creator_display: OwcCreatorDisplay + """ + self.creator_application = creator_application + self.creator_display = creator_display + + +class OwcCreatorApplication(object): + """ + CreatorApplication + + title :CharacterString [0..1] + + uri :URI [0..1] + + version :Version [0..1] + + the single only class that doesn't have explicit extension? + (but would be inherited from OWC:Creator?) + """ + + def __init__(self, + title, + uri=None, + version=None + ): + """ + constructor: + + :param title: String + :param uri: URL + :param version: String + """ + self.title = title + self.uri = uri + self.version = version + + def to_dict(self): + return { + "title": self.title, + "uri": self.uri, + "version": self.version + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + return encode_json(self.to_dict()) + + @classmethod + def from_dict(cls, d): + return OwcCreatorApplication( + title=extract_p('title', d, None), + uri=extract_p('uri', d, None), + version=extract_p('version', d, None) + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + return cls.from_dict(d) + + +class OwcCreatorDisplay(object): + """ + CreatorDisplay + + pixelWidth :int [0..1] + + pixelHeight :int [0..1] + + mmPerPixel :double [0..1] + + extension :Any [0..*] + """ + + def __init__(self, + pixel_width, + pixel_height=None, + mm_per_pixel=None, + ): + """ + constructor: + + :param pixel_width: Double + :param pixel_height: Double + :param mm_per_pixel: Double + """ + self.pixel_width = pixel_width + self.pixel_height = pixel_height + self.mm_per_pixel = mm_per_pixel + + def to_dict(self): + return { + "pixelWidth": self.pixel_width, + "pixelHeight": self.pixel_height, + "mmPerPixel": self.mm_per_pixel + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + return encode_json(self.to_dict()) + + @classmethod + def from_dict(cls, d): + return OwcCreatorDisplay( + pixel_width=try_int(extract_p('pixelWidth', d, None)), + pixel_height=try_int(extract_p('pixelHeight', d, None)), + mm_per_pixel=try_float(extract_p('mmPerPixel', d, None)) + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + return cls.from_dict(d) + + +class OwcLink(object): + """ + * OwcLink in most cases will have an array of links at the path of the rel + * + * OWC:Context specReference attribute: + atom rel="profile" - geojson links.profiles[] array + * OWC:Context contextMetadata attribute: + atom rel="via" - geojson links.via[] array + * + * OWC:Resource contentDescription attribute: + atom rel="alternate" - geojson links.alternates[] array + * OWC:Resource preview attribute: + atom rel="icon" - geojson links.previews[] array + * OWC:Resource contentByRef attribute: + atom rel="enclosure" - geojson links.data[] array + * OWC:Resource resourceMetadata attribute: + atom rel="via" - geojson links.via[] array + * + * links for data and previews + (aka rels enclosure and icon should have length attributes set) + * + * + href :URI + * + type :String [0..1] + * + lang :String [0..1] + * + title :String [0..1] + * + length :Integer [0..1] + * + extension :Any [0..*] + """ + + def __init__(self, + href, + rel, + mimetype=None, + lang=None, + title=None, + length=None, + ): + """ + constructor: + + :param href: URL + :param rel: String + :param mimetype: String + :param lang: String + :param title: String + :param length: Int + """ + self.href = href + self.rel = rel + self.mimetype = mimetype + self.lang = lang + self.title = title + self.length = length + + def to_dict(self): + return { + "href": self.href, + "type": self.mimetype, + "length": self.length, + "lang": self.lang, + "title": self.title, + "rel": self.rel + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + return encode_json(self.to_dict()) + + @classmethod + def from_dict(cls, d): + return OwcLink( + href=extract_p('href', d, None), + rel=extract_p('rel', d, None), + mimetype=extract_p('type', d, None), + lang=extract_p('lang', d, None), + title=extract_p('title', d, None), + length=try_int(extract_p('length', d, None)) + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + return cls.from_dict(d) + + +class OwcCategory(object): + """ + keywords class + """ + + def __init__(self, + term, + scheme=None, + label=None, + ): + """ + constructor: + + :param term: String + :param scheme: String (can point to a controlled list, too, I guess) + :param label: String + """ + self.term = term + self.scheme = scheme + self.label = label + + def to_dict(self): + return { + "scheme": self.scheme, + "term": self.term, + "label": self.label + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + return encode_json(self.to_dict()) + + @classmethod + def from_dict(cls, d): + return OwcCategory( + term=extract_p('term', d, None), + scheme=extract_p('scheme', d, None), + label=extract_p('label', d, None) + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + return cls.from_dict(d) + + +class OwcAuthor(object): + """ + apparently handled differently in Atom and GeoJSON encodings? + """ + + def __init__(self, + name=None, + email=None, + uri=None + ): + """ + constructor: + + :param name: String + :param email: String (EmailAddress) + :param uri: URL + """ + self.name = name + self.email = email + self.uri = uri + + def to_dict(self): + return { + "name": self.name, + "email": self.email, + "uri": self.uri + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + return encode_json(self.to_dict()) + + @classmethod + def from_dict(cls, d): + return OwcAuthor( + name=extract_p('name', d, None), + email=extract_p('email', d, None), + uri=extract_p('uri', d, None) + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + return cls.from_dict(d) + + +class OwcOffering(object): + """ + * + code :URI + * + operations :Offering [0..*] + * + contents :Content [0..*] + * + styles :StyleSet [0..*] + * + extension :Any [0..*] + """ + + def __init__(self, + offering_code, + operations=[], + contents=[], + styles=[] + ): + """ + constructor: + + :param offering_code: URL + :param operations: List[OwcOperation] + :param contents: List[OwcContent] + :param styles: List[OwcStyleSet] + """ + self.offering_code = offering_code + self.operations = operations + self.contents = contents + self.styles = styles + + def to_dict(self): + return { + "code": self.offering_code, + "operations": [] if len(self.operations) <= 0 else + [obj.to_dict() for obj in self.operations], + "contents": [] if len(self.contents) <= 0 else + [obj.to_dict() for obj in self.contents], + "styles": [] if len(self.styles) <= 0 else + [obj.to_dict() for obj in self.styles] + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + return encode_json(self.to_dict()) + + @classmethod + def from_dict(cls, d): + return OwcOffering( + offering_code=extract_p('code', d, None), + operations=[OwcOperation.from_dict(do) for do in + extract_p('operations', d, [])], + contents=[OwcContent.from_dict(do) for do in + extract_p('contents', d, [])], + styles=[OwcStyleSet.from_dict(do) for do in + extract_p('styles', d, [])] + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + return cls.from_dict(d) + + +class OwcOperation(object): + """ + * + code :CharacterString + * + method :CharacterString + * + type :CharacterString + * + requestURL :URI + * + request :Content [0..1] + * + result :Any [0..1] + * + extension :Any [0..*] + """ + + def __init__(self, + operations_code, + http_method, + request_url, + mimetype=None, + request=None, + result=None + ): + """ + constructor: + + :param operations_code: String (e.g. GetCapabilities) + :param http_method: String, HTTP verb (GET, POST ..) + :param request_url: URL + :param mimetype: String, MIME media type of the EXPECTED results + :param request: Option[OwcContent] = None + :param result:Option[OwcContent] = None + """ + self.operations_code = operations_code + self.http_method = http_method + self.request_url = request_url + self.mimetype = mimetype + self.request = request + self.result = result + + def to_dict(self): + return { + "code": self.operations_code, + "method": self.http_method, + "type": self.mimetype, + "href": self.request_url, + "request": + None if self.request is None else self.request.to_dict(), + "result": + None if self.result is None else self.result.to_dict() + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + return encode_json(self.to_dict()) + + @classmethod + def from_dict(cls, d): + return OwcOperation( + operations_code=extract_p('code', d, None), + http_method=extract_p('method', d, None), + mimetype=extract_p('type', d, None), + request_url=extract_p('href', d, None), + request=build_from_xp('request', d, OwcContent, None), + result=build_from_xp('result', d, OwcContent, None) + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + return cls.from_dict(d) + + +class OwcStyleSet(object): + """ + * + name :CharacterString + * + title :CharacterString + * + abstract :CharacterString [0..1] + * + default :Boolean [0..1] + * + legendURL :URI [0..*] + * + content :Content [0..1] + * + extension :Any [0..*] + """ + + def __init__(self, + name, + title, + subtitle=None, + is_default=None, + legend_url=None, + content=None + ): + """ + constructor: + + :param name: String + :param title: String + :param subtitle: String + :param is_default: Boolean + :param legend_url: URL + :param content: Option[OwcContent] = None + """ + self.name = name + self.title = title + self.subtitle = subtitle + self.is_default = is_default + self.legend_url = legend_url + self.content = content + + def to_dict(self): + return { + "name": self.name, + "title": self.title, + "abstract": self.subtitle, + "default": self.is_default, + "legendURL": self.legend_url, + "content": + None if self.content is None else self.content.to_dict() + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + return encode_json(self.to_dict()) + + @classmethod + def from_dict(cls, d): + return OwcStyleSet( + name=extract_p('name', d, None), + title=extract_p('title', d, None), + subtitle=extract_p('abstract', d, None), + is_default=extract_p('default', d, None), + legend_url=extract_p('legendURL', d, None), + content=build_from_xp('content', d, OwcContent, None) + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + return cls.from_dict(d) + + +class OwcContent(object): + """ + * + type :CharacterString + * + URL :URI [0..1] + * + content :Any [0..1] + * + extension :Any [0..*] + """ + + def __init__(self, + mimetype, + content, + url=None, + title=None + ): + """ + constructor: + + :param mimetype: String + :param content: String encoded, actual content/data + :param url: URL + :param title: String + """ + self.mimetype = mimetype + self.content = content + self.url = url + self.title = title + + def to_dict(self): + return { + "type": self.mimetype, + "url": self.url, + "content": self.content, + "title": self.title + } + + def __str__(self): + return str(self.to_dict()) + + def to_json(self): + return encode_json(self.to_dict()) + + @classmethod + def from_dict(cls, d): + return OwcContent( + mimetype=extract_p('type', d, None), + content=extract_p('content', d, None), + url=extract_p('url', d, None), + title=extract_p('title', d, None) + ) + + @classmethod + def from_json(cls, jsondata): + d = decode_json(jsondata) + return cls.from_dict(d) diff -Nru owslib-0.16.0/owslib/owscontext/geojson.py owslib-0.18.0/owslib/owscontext/geojson.py --- owslib-0.16.0/owslib/owscontext/geojson.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/owslib/owscontext/geojson.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# ============================================================================= +# Authors : Alexander Kmoch +# +# ============================================================================= + +""" +API for OGC Web Services Context Document (OWS Context) format. + +GeoJson Encoding: http://www.opengeospatial.org/standards/owc + +OGC OWS Context GeoJSON Encoding Standard 1.0 (14-055r2) +""" + +from __future__ import (absolute_import, division, print_function) + +import json +from datetime import datetime +from owslib.owscontext.common import skip_nulls, skip_nulls_rec + + +# from owslib.util import log + +class DateTimeEncoder(json.JSONEncoder): + """ + https://stackoverflow.com/questions/11875770/how-to-overcome-datetime-datetime-not-json-serializable/36142844#36142844 + + usage: json.dumps(yourobj, cls=DateTimeEncoder) + """ + + def default(self, o): + if isinstance(o, datetime): + return o.isoformat() + + return json.JSONEncoder.default(self, o) + + +def decode_json(jsondata): + """ + TODO do we need to make sure everything is UTF-8? + here parse json to an instance of OWC:Context + + :param jsondata: + :return: dict + """ + return json.loads(jsondata, object_hook=skip_nulls) + + +def encode_json(obj): + """ + TODO do we need to make sure everything is UTF-8? + eg. ensure_ascii=False, encoding='utf8) .encode('utf8') ? + encode instance of OWCContext/or subclass into GeoJson encoding + + :param obj: + :return: JSON + """ + jsdata = json.dumps(skip_nulls_rec(obj), cls=DateTimeEncoder) + + return jsdata diff -Nru owslib-0.16.0/owslib/owscontext/__init__.py owslib-0.18.0/owslib/owscontext/__init__.py --- owslib-0.16.0/owslib/owscontext/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/owslib/owscontext/__init__.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# ============================================================================= +# Authors : Alexander Kmoch +# +# ============================================================================= + +""" +place for some constants to avoid circular imports +""" + +from __future__ import (absolute_import, division, print_function) + +from owslib.util import log diff -Nru owslib-0.16.0/owslib/ows.py owslib-0.18.0/owslib/ows.py --- owslib-0.16.0/owslib/ows.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/ows.py 2019-06-25 00:00:28.000000000 +0000 @@ -29,7 +29,7 @@ OWS_NAMESPACE_1_0_0 = n.get_namespace("ows") OWS_NAMESPACE_1_1_0 = n.get_namespace("ows110") -OWS_NAMESPACE_2_0 = n.get_namespace("ows200") +OWS_NAMESPACE_2_0_0 = n.get_namespace("ows200") XSI_NAMESPACE = n.get_namespace("xsi") XLINK_NAMESPACE = n.get_namespace("xlink") @@ -41,8 +41,10 @@ self.version = version if version == '1.0.0': self.namespace = OWS_NAMESPACE_1_0_0 - else: + elif version == '1.1.0': self.namespace = OWS_NAMESPACE_1_1_0 + else: + self.namespace = OWS_NAMESPACE_2_0_0 class ServiceIdentification(object): """Initialize an OWS Common ServiceIdentification construct""" @@ -82,6 +84,14 @@ for p in self._root.findall(util.nspath('Profile', namespace)): self.profiles.append(util.testXMLValue(p)) + + def __str__(self): + return 'Service: {}, title={}'.format(self.service, self.title or '') + + def __repr__(self): + return ''.format(self.service, hex(id(self))) + + class ServiceProvider(object): """Initialize an OWS Common ServiceProvider construct""" def __init__(self, infoset,namespace=DEFAULT_OWS_NAMESPACE): @@ -210,6 +220,12 @@ for constraint in elem.findall(util.nspath('Constraint', namespace)): self.constraints.append(Constraint(constraint, namespace)) + def __str__(self): + return "Operation: {}, format={}".format(self.name, self.formatOptions) + + def __repr__(self): + return ''.format(self.name, hex(id(self))) + class BoundingBox(object): """Initialize an OWS BoundingBox construct""" @@ -219,14 +235,14 @@ self.maxx = None self.maxy = None - val = elem.attrib.get('crs') + val = elem.attrib.get('crs') or elem.attrib.get('{{{}}}crs'.format(namespace)) try: self.crs = crs.Crs(val) except (AttributeError, ValueError): LOGGER.warning('Invalid CRS %r. Expected integer') self.crs = None - val = elem.attrib.get('dimensions') + val = elem.attrib.get('dimensions') or elem.attrib.get('{{{}}}dimensions'.format(namespace)) if val is not None: self.dimensions = int(util.testXMLValue(val, True)) else: # assume 2 @@ -252,6 +268,7 @@ else: self.maxx, self.maxy = xy[0], xy[1] + class WGS84BoundingBox(BoundingBox): """WGS84 bbox, axis order xy""" def __init__(self, elem, namespace=DEFAULT_OWS_NAMESPACE): diff -Nru owslib-0.16.0/owslib/swe/observation/sos100.py owslib-0.18.0/owslib/swe/observation/sos100.py --- owslib-0.16.0/owslib/swe/observation/sos100.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/swe/observation/sos100.py 2019-06-25 00:00:28.000000000 +0000 @@ -1,5 +1,6 @@ from __future__ import (absolute_import, division, print_function) +import six import cgi from owslib.etree import etree from datetime import datetime @@ -10,7 +11,7 @@ from owslib import ows from owslib.crs import Crs from owslib.fes import FilterCapabilities -from owslib.util import openURL, testXMLValue, nspath_eval, nspath, extract_time +from owslib.util import openURL, testXMLValue, nspath_eval, nspath, extract_time, encode_string from owslib.namespaces import Namespaces def get_namespaces(): @@ -135,11 +136,8 @@ data = urlencode(request) - response = openURL(base_url, data, method, username=self.username, password=self.password, **url_kwargs).read() - - tr = etree.fromstring(response) if tr.tag == nspath_eval("ows:ExceptionReport", namespaces): @@ -221,6 +219,7 @@ return item raise KeyError("No Operation named %s" % name) + class SosObservationOffering(object): def __init__(self, element): self._root = element @@ -278,10 +277,11 @@ self.response_modes.append(testXMLValue(rm)) def __str__(self): - return 'Offering id: %s, name: %s' % (self.id, self.name) + return 'Offering id: {}, name: {}'.format(encode_string(self.id), encode_string(self.name)) def __repr__(self): - return "" % self.name + return "".format(encode_string(self.name)) + class SosCapabilitiesReader(object): def __init__(self, version="1.0.0", url=None, username=None, password=None): diff -Nru owslib-0.16.0/owslib/tms.py owslib-0.18.0/owslib/tms.py --- owslib-0.16.0/owslib/tms.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/tms.py 2019-06-25 00:00:28.000000000 +0000 @@ -18,7 +18,7 @@ from __future__ import (absolute_import, division, print_function) from .etree import etree -from .util import openURL, testXMLValue, ServiceException +from .util import testXMLValue, ServiceException, Authentication, openURL FORCE900913 = False @@ -40,11 +40,16 @@ Implements IWebMapService. """ - def __init__(self, url, version='1.0.0', xml=None, username=None, password=None, parse_remote_metadata=False, timeout=30): + def __init__(self, url, version='1.0.0', xml=None, username=None, password=None, + parse_remote_metadata=False, timeout=30, auth=None): """Initialize.""" + if auth: + if username: + auth.username = username + if password: + auth.password = password self.url = url - self.username = username - self.password = password + self.auth = auth or Authentication(username, password) self.version = version self.timeout = timeout self.services = None @@ -65,11 +70,13 @@ def _getcapproperty(self): + # TODO: deprecated function. See ticket #453. if not self._capabilities: reader = TMSCapabilitiesReader( self.version, url=self.url, un=self.username, pw=self.password ) - self._capabilities = ServiceMetadata(reader.read(self.url)) + # self._capabilities = ServiceMetadata(reader.read(self.url)) + self._capabilities = reader.read(self.url, timeout=self.timeout) return self._capabilities @@ -83,7 +90,7 @@ tilemaps = self._capabilities.find('TileMaps') if tilemaps is not None: for tilemap in tilemaps.findall('TileMap'): - cm = ContentMetadata(tilemap, un=self.username, pw=self.password) + cm = ContentMetadata(tilemap, auth=self.auth) if cm.id: if cm.id in self.contents: raise KeyError('Content metadata for layer "%s" already exists' % cm.id) @@ -111,7 +118,7 @@ if self.contents[item].srs == srs: items.append((item,self.contents[item])) elif profile: - for item in self.contents: + for item in self.contents: if self.contents[item].profile == profile: items.append((item,self.contents[item])) return items @@ -120,8 +127,7 @@ for tileset in tilesets: if tileset['order'] == z: url = tileset['href'] + '/' + str(x) +'/' + str(y) + '.' + ext - u = openURL(url, '', username = self.username, - password = self.password, timeout=timeout or self.timeout) + u = openURL(url, '', timeout=timeout or self.timeout, auth=self.auth) return u else: raise ValueError('cannot find zoomlevel %i for TileMap' % z) @@ -178,25 +184,28 @@ def __str__(self): return 'Layer Title: %s, URL: %s' % (self.title, self.id) - def __init__(self, elem, un=None, pw=None): + def __init__(self, elem, un=None, pw=None, auth=None): if elem.tag != 'TileMap': raise ValueError('%s should be a TileMap' % (elem,)) self.id = elem.attrib['href'] self.title = elem.attrib['title'] self.srs = force900913(elem.attrib['srs']) self.profile = elem.attrib['profile'] - self.password = pw - self.username = pw + if auth: + if un: + auth.username = un + if pw: + auth.password = pw + self.auth = auth or Authentication(un, pw) self._tile_map = None self.type = elem.attrib.get('type') def _get_tilemap(self): if self._tile_map is None: - self._tile_map = TileMap(self.id, un=self.username, pw=self.password) + self._tile_map = TileMap(self.id, auth=self.auth) assert(self._tile_map.srs == self.srs) return self._tile_map - @property def tilemap(self): return self._get_tilemap() @@ -247,17 +256,20 @@ tilesets = None profile = None - def __init__(self, url=None, xml=None, un=None, pw=None): + def __init__(self, url=None, xml=None, un=None, pw=None, auth=None): self.url = url - self.username = un - self.password = pw + if auth: + if un: + auth.username = un + if pw: + auth.password = pw + self.auth = auth or Authentication(un, pw) self.tilesets = [] if xml and not url: self.readString(xml) elif url: self.read(url) - def _parse(self, elem): if elem.tag != 'TileMap': raise ValueError('%s should be a TileMap' % (elem,)) @@ -294,7 +306,7 @@ 'order': order}) def read(self, url): - u = openURL(url, '', method='Get', username = self.username, password = self.password) + u = openURL(url, '', method='Get', auth=self.auth) self._parse(etree.fromstring(u.read())) def readString(self, st): @@ -308,20 +320,23 @@ """Read and parse capabilities document into a lxml.etree infoset """ - def __init__(self, version='1.0.0', url=None, un=None, pw=None): + def __init__(self, version='1.0.0', url=None, un=None, pw=None, auth=None): """Initialize""" + if auth: + if un: + auth.username = un + if pw: + auth.password = pw self.version = version self._infoset = None self.url = url - self.username = un - self.password = pw - + self.auth = auth or Authentication(un, pw) def read(self, service_url, timeout=30): """Get and parse a TMS capabilities document, returning an elementtree instance """ - u = openURL(service_url, '', method='Get', username=self.username, password=self.password, timeout=timeout) + u = openURL(service_url, '', method='Get', timeout=timeout, auth=self.auth) return etree.fromstring(u.read()) def readString(self, st): diff -Nru owslib-0.16.0/owslib/util.py owslib-0.18.0/owslib/util.py --- owslib-0.16.0/owslib/util.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/util.py 2019-06-25 00:00:28.000000000 +0000 @@ -9,14 +9,16 @@ from __future__ import (absolute_import, division, print_function) +import os import sys from collections import OrderedDict from dateutil import parser -from datetime import datetime +from datetime import datetime, timedelta import pytz from owslib.etree import etree, ParseError from owslib.namespaces import Namespaces from six.moves.urllib.parse import urlsplit, urlencode, urlparse, parse_qs, urlunparse +import copy try: from StringIO import StringIO # Python 2 @@ -37,7 +39,7 @@ """ 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 @@ -91,7 +93,7 @@ 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() @@ -134,23 +136,42 @@ # @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='Get', cookies=None, username=None, password=None, timeout=30, headers=None, + verify=True, cert=None, auth=None): """ Function to open URLs. Uses requests library but with additional checks for OGC service exceptions and url formatting. Also handles cookies and simple user password authentication. + + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param verify: (optional) whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. + Defaults to ``True``. + :param cert: (optional) A file with a client side certificate for SSL authentication + to send with the :class:`Request`. + :param auth: Instance of owslib.util.Authentication """ + headers = headers if headers is not None else {} rkwargs = {} rkwargs['timeout'] = timeout - auth = None - if username and password: - auth = (username, password) - - rkwargs['auth'] = auth + if auth: + if username: + auth.username = username + if password: + auth.password = password + if cert: + auth.cert = cert + if verify and not auth.verify: + auth.verify = verify + else: + auth = Authentication(username, password, cert, verify) + if auth.username and auth.password: + rkwargs['auth'] = (auth.username, auth.password) + rkwargs['cert'] = auth.cert + rkwargs['verify'] = auth.verify # FIXUP for WFS in particular, remove xml style namespace # @TODO does this belong here? @@ -158,7 +179,7 @@ if method.lower() == 'post': try: - xml = etree.fromstring(data) + etree.fromstring(data) headers['Content-Type'] = 'text/xml' except (ParseError, UnicodeEncodeError): pass @@ -167,17 +188,14 @@ elif method.lower() == 'get': rkwargs['params'] = data - + else: raise ValueError("Unknown method ('%s'), expected 'get' or 'post'" % method) if cookies is not None: rkwargs['cookies'] = cookies - req = requests.request(method.upper(), - url_base, - headers=headers, - **rkwargs) + req = requests.request(method.upper(), url_base, headers=headers, **rkwargs) if req.status_code in [400, 401]: raise ServiceException(req.text) @@ -203,7 +221,7 @@ serviceException = se_tree.find(possible_error) if serviceException is not None: # and we need to deal with some message nesting - raise ServiceException('\n'.join([str(t).strip() for t in serviceException.itertext() if str(t).strip()])) + raise ServiceException('\n'.join([encode_string(t).strip() for t in serviceException.itertext() if encode_string(t).strip()])) return ResponseWrapper(req) @@ -214,7 +232,7 @@ """ Prefix the given path with the given namespace identifier. - + Parameters ---------- @@ -324,10 +342,10 @@ 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 @@ -348,10 +366,10 @@ return None -def http_post(url=None, request=None, lang='en-US', timeout=10, username=None, password=None): +def http_post(url=None, request=None, lang='en-US', timeout=10, username=None, password=None, auth=None): """ - Invoke an HTTP POST request + Invoke an HTTP POST request Parameters ---------- @@ -379,12 +397,52 @@ rkwargs = {} - if username is not None and password is not None: - rkwargs['auth'] = (username, password) + if auth: + if username: + auth.username = username + if password: + auth.password = password + else: + auth = Authentication(username, password) + if auth.username is not None and auth.password is not None: + rkwargs['auth'] = (auth.username, auth.password) + rkwargs['verify'] = auth.verify + rkwargs['cert'] = auth.cert up = requests.post(url, request, headers=headers, **rkwargs) return up.content +def http_get(*args, **kwargs): + # Copy input kwargs so the dict can be modified + rkwargs = copy.deepcopy(kwargs) + + # Use Authentication instance if provided, else create one + auth = rkwargs.pop('auth', None) + if auth is not None: + if isinstance(auth, (tuple, list)): + auth = Authentication(*auth) + else: + auth = Authentication() + + # Populate values with other arguments supplied + if 'username' in rkwargs: + auth.username = rkwargs.pop('username') + if 'password' in rkwargs: + auth.password = rkwargs.pop('password') + if 'cert' in rkwargs: + auth.cert = rkwargs.pop('cert') + if 'verify' in rkwargs: + auth.verify = rkwargs.pop('verify') + + # Build keyword args for call to requests.get() + if auth.username and auth.password: + rkwargs.setdefault('auth', (auth.username, auth.password)) + else: + rkwargs.setdefault('auth', None) + rkwargs.setdefault('cert', rkwargs.get('cert')) + rkwargs.setdefault('verify', rkwargs.get('verify', True)) + return requests.get(*args, **rkwargs) + def element_to_string(element, encoding=None, xml_declaration=False): """ Returns a string from a XML object @@ -469,22 +527,43 @@ 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 = [] + +def build_get_url(base_url, params, overwrite=False): + ''' Utility function to build a full HTTP GET URL from the service base URL and a dictionary of HTTP parameters. + + TODO: handle parameters case-insensitive? + + @param overwrite: boolean flag to allow overwrite of parameters of the base_url (default: False) + ''' + + qs_base = [] if base_url.find('?') != -1: - qs = cgi.parse_qsl(base_url.split('?')[1]) + qs_base = cgi.parse_qsl(base_url.split('?')[1]) + + qs_params = [] + for key, value in six.iteritems(params): + qs_params.append((key, value)) + + qs = qs_add = [] + if overwrite is True: + # all params and additional base + qs = qs_params + qs_add = qs_base + else: + # all base and additional params + qs = qs_base + qs_add = qs_params pars = [x[0] for x in qs] - for key,value in six.iteritems(params): + for key, value in qs_add: 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.''' @@ -494,7 +573,7 @@ '''Utility function to cast a string value to the appropriate XSD type. ''' if data_type == 'boolean': - return bool(value) + return True if value.lower() == 'true' else False elif data_type == 'integer': return int(value) elif data_type == 'float': @@ -538,35 +617,35 @@ 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] - flattened = [item.strip() for sublist in keywords for item in sublist] - remove_blank = [_f for _f in flattened if _f] - return remove_blank - else: - return [] + 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 def strip_bom(raw_text): """ return the raw (assumed) xml response without the BOM """ boms = [ + # utf-8 + codecs.BOM_UTF8, + # utf-16 codecs.BOM, codecs.BOM_BE, codecs.BOM_LE, - codecs.BOM_UTF8, codecs.BOM_UTF16, codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE, + # utf-32 codecs.BOM_UTF32, codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE ] - if not isinstance(raw_text, str): + if isinstance(raw_text, six.binary_type): for bom in boms: if raw_text.startswith(bom): - return raw_text.replace(bom, '') + return raw_text[len(bom):] return raw_text @@ -669,3 +748,170 @@ if found_elements == []: found_elements = None return found_elements + + +def datetime_from_iso(iso): + """returns a datetime object from dates in the format 2001-07-01T00:00:00Z or 2001-07-01T00:00:00.000Z """ + try: + iso_datetime = datetime.strptime(iso, "%Y-%m-%dT%H:%M:%SZ") + except: + iso_datetime = datetime.strptime(iso, "%Y-%m-%dT%H:%M:%S.%fZ") + return iso_datetime + +def datetime_from_ansi(ansi): + """Converts an ansiDate (expressed as a number = the nuber of days since the datum origin of ansi) to a python datetime object.""" + + datumOrigin = datetime(1600,12,31,0,0,0) + + return datumOrigin + timedelta(ansi) + +def is_vector_grid(grid_elem): + pass + + +def encode_string(text): + """ + On Python 3 this method does nothing and returns the ``text`` string itself. + On Python 2 this method returns the ``text`` string encoded with UTF-8. + + See: + * https://pythonhosted.org/six/#six.python_2_unicode_compatible + * https://www.azavea.com/blog/2014/03/24/solving-unicode-problems-in-python-2-7/ + """ + if six.PY3: + return text + if isinstance(text, str): + return text.decode('utf-8').encode('utf-8', 'ignore') + return text.encode('utf-8', 'ignore') + + +class Authentication(object): + + _USERNAME = None + _PASSWORD = None + _CERT = None + _VERIFY = None + + def __init__(self, username=None, password=None, + cert=None, verify=True, shared=False): + ''' + :param str username=None: Username for basic authentication, None for + unauthenticated access (or if using cert/verify) + :param str password=None: Password for basic authentication, None for + unauthenticated access (or if using cert/verify) + :param cert=None: Either a str (path to a combined certificate/key) or + tuple/list of paths (certificate, key). If supplied, the target + files must exist. + :param verify=True: Either a bool (verify SSL certificates, use system + CA bundle) or str (path to a specific CA bundle). If a str, the + target file must exist. + :param bool shared=False: Set to True to make the values be class-level + attributes (shared among instances where shared=True) instead of + instance-level (shared=False, default) + ''' + self.shared = shared + self.username = username + self.password = password + self.cert = cert + self.verify = verify + + @property + def username(self): + if self.shared: + return self._USERNAME + return self._username + + @username.setter + def username(self, value): + if value is None: + pass + elif not isinstance(value, str): + raise TypeError('Value for "username" must be a str') + if self.shared: + self.__class__._USERNAME = value + else: + self._username = value + + @property + def password(self): + if self.shared: + return self._PASSWORD + return self._username + + @password.setter + def password(self, value): + if value is None: + pass + elif not isinstance(value, str): + raise TypeError('Value for "password" must be a str') + if self.shared: + self.__class__._PASSWORD = value + else: + self._password = value + + @property + def cert(self): + if self.shared: + return self._CERT + return self._cert + + @cert.setter + def cert(self, certificate, key=None): + error = 'Value for "cert" must be a str path to a file or list/tuple of str paths' + value = None + if certificate is None: + value = certificate + elif isinstance(certificate, (list, tuple)): + for _ in certificate: + if not isinstance(_, str): + raise TypeError(error) + os.stat(_) # Raises OSError/FileNotFoundError if missing + # Both paths supplied as same argument + value = tuple(certificate) + elif isinstance(certificate, str): + os.stat(certificate) # Raises OSError/FileNotFoundError if missing + if isinstance(key, str): + # Separate files for certificate and key + value = (certificate, key) + else: + # Assume combined file of both certificate and key + value = certificate + else: + raise TypeError(error) + if self.shared: + self.__class__._CERT = value + else: + self._cert = value + + @property + def verify(self): + if self.shared: + return self._VERIFY + return self._verify + + @verify.setter + def verify(self, value): + if value is None: + pass # Passthrough when clearing the value + elif not isinstance(value, (bool, str)): + raise TypeError( + 'Value for "verify" must a bool or str path to a file') + elif isinstance(value, str): + os.stat(value) # Raises OSError/FileNotFoundError if missing + if self.shared: + self.__class__._VERIFY = value + else: + self._verify = value + + @property + def urlopen_kwargs(self): + return { + 'username': self.username, + 'password': self.password, + 'cert': self.cert, + 'verify': self.verify + } + + def __repr__(self, *args, **kwargs): + return '<{} shared={} username={} password={} cert={} verify={}>'.format( + self.__class__.__name__, self.shared, self.username, self.password, self.cert, self.verify) diff -Nru owslib-0.16.0/owslib/wcs.py owslib-0.18.0/owslib/wcs.py --- owslib-0.16.0/owslib/wcs.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/wcs.py 2019-06-25 00:00:28.000000000 +0000 @@ -16,18 +16,22 @@ from __future__ import (absolute_import, division, print_function) from . import etree -from .coverage import wcs100, wcs110, wcs111, wcsBase -from owslib.util import clean_ows_url, openURL +from .coverage import wcs100, wcs110, wcs111, wcsBase, wcs200, wcs201 +from owslib.util import clean_ows_url, Authentication, openURL -def WebCoverageService(url, version=None, xml=None, cookies=None, timeout=30): +def WebCoverageService(url, version=None, xml=None, cookies=None, timeout=30, auth=None): ''' wcs factory function, returns a version specific WebCoverageService object ''' + if not auth: + auth = Authentication() + if version is None: if xml is None: - reader = wcsBase.WCSCapabilitiesReader() + reader = wcsBase.WCSCapabilitiesReader(auth=auth) request = reader.capabilities_url(url) - xml = openURL(request, cookies=cookies, timeout=timeout).read() + xml = openURL( + request, cookies=cookies, timeout=timeout, auth=auth).read() capabilities = etree.etree.fromstring(xml) version = capabilities.get('version') @@ -36,8 +40,17 @@ clean_url = clean_ows_url(url) if version == '1.0.0': - return wcs100.WebCoverageService_1_0_0.__new__(wcs100.WebCoverageService_1_0_0, clean_url, xml, cookies) + return wcs100.WebCoverageService_1_0_0.__new__( + wcs100.WebCoverageService_1_0_0, clean_url, xml, cookies, auth=auth) elif version == '1.1.0': - return wcs110.WebCoverageService_1_1_0.__new__(wcs110.WebCoverageService_1_1_0, clean_url, xml, cookies) + return wcs110.WebCoverageService_1_1_0.__new__( + wcs110.WebCoverageService_1_1_0, url, xml, cookies, auth=auth) elif version == '1.1.1': - return wcs111.WebCoverageService_1_1_1.__new__(wcs111.WebCoverageService_1_1_1, clean_url, xml, cookies) + return wcs111.WebCoverageService_1_1_1.__new__( + wcs111.WebCoverageService_1_1_1, url, xml, cookies, auth=auth) + elif version == '2.0.0': + return wcs200.WebCoverageService_2_0_0.__new__( + wcs200.WebCoverageService_2_0_0, url, xml, cookies, auth=auth) + elif version == '2.0.1': + return wcs201.WebCoverageService_2_0_1.__new__( + wcs201.WebCoverageService_2_0_1, url, xml, cookies, auth=auth) diff -Nru owslib-0.16.0/owslib/wfs.py owslib-0.18.0/owslib/wfs.py --- owslib-0.16.0/owslib/wfs.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/wfs.py 2019-06-25 00:00:28.000000000 +0000 @@ -15,12 +15,13 @@ from __future__ import (absolute_import, division, print_function) -from .feature import wfs100, wfs110, wfs200 -from .util import clean_ows_url +from .feature import wfs100, wfs110, wfs200, wfs300 +from .util import clean_ows_url, Authentication -def WebFeatureService(url, version='1.0.0', xml=None, parse_remote_metadata=False, - timeout=30, username=None, password=None): +def WebFeatureService(url, version='1.0.0', xml=None, json_=None, + parse_remote_metadata=False, timeout=30, username=None, + password=None, auth=None): ''' wfs factory function, returns a version specific WebFeatureService object @type url: string @@ -32,23 +33,27 @@ @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 + @param auth: instance of owslib.util.Authentication + @return: initialized WebFeatureService object (version dependent) ''' - + if auth: + if username: + auth.username = username + if password: + auth.password = password + else: + auth = Authentication(username, password) clean_url = clean_ows_url(url) - if version in ['1.0', '1.0.0']: - return wfs100.WebFeatureService_1_0_0(clean_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(clean_url, version, xml, parse_remote_metadata, - timeout=timeout, - username=username, - password=password) + if version in ['1.0', '1.0.0']: + return wfs100.WebFeatureService_1_0_0( + clean_url, version, xml, parse_remote_metadata, timeout=timeout, auth=auth) + elif version in ['1.1', '1.1.0']: + return wfs110.WebFeatureService_1_1_0( + clean_url, version, xml, parse_remote_metadata, timeout=timeout, auth=auth) elif version in ['2.0', '2.0.0']: - return wfs200.WebFeatureService_2_0_0(clean_url, version, xml, parse_remote_metadata, - timeout=timeout, - username=username, - password=password) + return wfs200.WebFeatureService_2_0_0( + clean_url, version, xml, parse_remote_metadata, timeout=timeout, auth=auth) + elif version in ['3.0', '3.0.0']: + return wfs300.WebFeatureService_3_0_0( + clean_url, version, json_, timeout=timeout, auth=auth) diff -Nru owslib-0.16.0/owslib/wms.py owslib-0.18.0/owslib/wms.py --- owslib-0.16.0/owslib/wms.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/wms.py 2019-06-25 00:00:28.000000000 +0000 @@ -17,17 +17,11 @@ from __future__ import (absolute_import, division, print_function) from .map import wms111, wms130 -from .util import clean_ows_url +from .util import clean_ows_url, Authentication -def WebMapService(url, - version='1.1.1', - xml=None, - username=None, - password=None, - parse_remote_metadata=False, - timeout=30, - headers=None): +def WebMapService(url, version='1.1.1', xml=None, username=None, password=None, + parse_remote_metadata=False, timeout=30, headers=None, auth=None): '''wms factory function, returns a version specific WebMapService object @@ -38,20 +32,26 @@ @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 + @param auth: instance of owslib.util.Authentication @return: initialized WebFeatureService_2_0_0 object ''' - + if auth: + if username: + auth.username = username + if password: + auth.password = password + else: + auth = Authentication(username, password) clean_url = clean_ows_url(url) if version in ['1.1.1']: - return wms111.WebMapService_1_1_1(clean_url, version=version, xml=xml, - parse_remote_metadata=parse_remote_metadata, - username=username, password=password, - timeout=timeout, headers=headers) + return wms111.WebMapService_1_1_1( + clean_url, version=version, xml=xml, parse_remote_metadata=parse_remote_metadata, + timeout=timeout, auth=auth) elif version in ['1.3.0']: - return wms130.WebMapService_1_3_0(clean_url, version=version, xml=xml, - parse_remote_metadata=parse_remote_metadata, - username=username, password=password, - timeout=timeout, headers=headers) + return wms130.WebMapService_1_3_0( + clean_url, version=version, xml=xml, parse_remote_metadata=parse_remote_metadata, + timeout=timeout, headers=headers, auth=auth) raise NotImplementedError('The WMS version (%s) you requested is not implemented. Please use 1.1.1 or 1.3.0.' % version) - diff -Nru owslib-0.16.0/owslib/wmts.py owslib-0.18.0/owslib/wmts.py --- owslib-0.16.0/owslib/wmts.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/wmts.py 2019-06-25 00:00:28.000000000 +0000 @@ -42,7 +42,7 @@ from urllib import urlencode from urlparse import urlparse, urlunparse, parse_qs, ParseResult from .etree import etree -from .util import clean_ows_url, openURL, testXMLValue, getXMLInteger +from .util import clean_ows_url, testXMLValue, getXMLInteger, Authentication, openURL from .fgdc import Metadata from .iso import MD_Metadata from .ows import ServiceProvider, ServiceIdentification, OperationsMetadata @@ -134,9 +134,8 @@ else: raise KeyError("No content named %s" % name) - def __init__(self, url, version='1.0.0', xml=None, username=None, - password=None, parse_remote_metadata=False, - vendor_kwargs=None): + def __init__(self, url, version='1.0.0', xml=None, username=None, password=None, + parse_remote_metadata=False, vendor_kwargs=None, auth=None): """Initialize. Parameters @@ -157,19 +156,24 @@ vendor_kwargs : dict Optional vendor-specific parameters to be included in all requests. + auth : owslib.util.Authentication + Instance of Authentication class to hold username/password/cert/verify """ self.url = clean_ows_url(url) - self.username = username - self.password = password + if auth: + if username: + auth.username = username + if password: + auth.password = password self.version = version self.vendor_kwargs = vendor_kwargs self._capabilities = None + self.auth = auth or Authentication(username, password) # Authentication handled by Reader - reader = WMTSCapabilitiesReader(self.version, url=self.url, - un=self.username, pw=self.password) - + reader = WMTSCapabilitiesReader( + self.version, url=self.url, auth=self.auth) if xml: # read from stored xml self._capabilities = reader.readString(xml) else: # read from server @@ -187,12 +191,13 @@ self._buildMetadata(parse_remote_metadata) def _getcapproperty(self): + # TODO: deprecated function. See ticket #453. if not self._capabilities: reader = WMTSCapabilitiesReader( - self.version, url=self.url, un=self.username, pw=self.password - ) - xml = reader.read(self.url, self.vendor_kwargs) - self._capabilities = ServiceMetadata(xml) + self.version, url=self.url, auth=self.auth) + # xml = reader.read(self.url, self.vendor_kwargs) + # self._capabilities = ServiceMetadata(xml) + self._capabilities = reader.read(self.url, self.vendor_kwargs) return self._capabilities def _buildMetadata(self, parse_remote_metadata=False): @@ -225,7 +230,7 @@ def gather_layers(parent_elem, parent_metadata): for index, elem in enumerate(parent_elem.findall(_LAYER_TAG)): cm = ContentMetadata( - elem, parent=parent_metadata, index=index+1, + elem, parent=parent_metadata, index=index + 1, parse_remote_metadata=parse_remote_metadata) if cm.id: if cm.id in self.contents: @@ -321,9 +326,9 @@ msg = 'tilematrix (zoom level) is mandatory (cannot be None)' raise ValueError(msg) if row is None: - raise ValueError("row is mandatory (cannot be None)") + raise ValueError("row is mandatory (cannot be None)") if column is None: - raise ValueError("column is mandatory (cannot be None)") + raise ValueError("column is mandatory (cannot be None)") request = list() request.append(('SERVICE', 'WMTS')) @@ -451,7 +456,7 @@ resurl = self.buildTileResource( layer, style, format, tilematrixset, tilematrix, row, column, **vendor_kwargs) - u = openURL(resurl, username=self.username, password=self.password) + u = openURL(resurl, auth=self.auth) return u # KVP implemetation @@ -477,8 +482,7 @@ base_url = get_verbs[0].get('url') except StopIteration: pass - u = openURL(base_url, data, username=self.username, - password=self.password) + u = openURL(base_url, data, auth=self.auth) # check for service exceptions, and return if u.info()['Content-Type'] == 'application/vnd.ogc.se_xml': @@ -676,8 +680,7 @@ Implements IContentMetadata. """ - def __init__(self, elem, parent=None, index=0, - parse_remote_metadata=False): + def __init__(self, elem, parent=None, index=0, parse_remote_metadata=False): if elem.tag != _LAYER_TAG: raise ValueError('%s should be a Layer' % (elem,)) @@ -709,8 +712,7 @@ # probably be shared code self._tilematrixsets = [f.text.strip() for f in - elem.findall(_TILE_MATRIX_SET_LINK_TAG + '/' + - _TILE_MATRIX_SET_TAG)] + elem.findall(_TILE_MATRIX_SET_LINK_TAG + '/' + _TILE_MATRIX_SET_TAG)] link_elements = elem.findall(_TILE_MATRIX_SET_LINK_TAG) tile_matrix_set_links = TileMatrixSetLink.from_elements(link_elements) @@ -759,7 +761,7 @@ style['format'] = legendURL.attrib.get('format') keywords = [f.text for f in s.findall( - _KEYWORDS_TAG+'/'+_KEYWORD_TAG)] + _KEYWORDS_TAG + '/' + _KEYWORD_TAG)] if keywords: # keywords is a list [] style['keywords'] = keywords @@ -768,7 +770,7 @@ self.formats = [f.text for f in elem.findall(_FORMAT_TAG)] self.keywords = [f.text for f in elem.findall( - _KEYWORDS_TAG+'/'+_KEYWORD_TAG)] + _KEYWORDS_TAG + '/' + _KEYWORD_TAG)] self.infoformats = [f.text for f in elem.findall(_INFO_FORMAT_TAG)] self.layers = [] @@ -793,13 +795,17 @@ """Read and parse capabilities document into a lxml.etree infoset """ - def __init__(self, version='1.0.0', url=None, un=None, pw=None): + def __init__(self, version='1.0.0', url=None, un=None, pw=None, auth=None): """Initialize""" self.version = version self._infoset = None self.url = url - self.username = un - self.password = pw + if auth: + if un: + auth.username = un + if pw: + auth.password = pw + self.auth = auth or Authentication(un, pw) def capabilities_url(self, service_url, vendor_kwargs=None): """Return a capabilities url @@ -834,8 +840,7 @@ # now split it up again to use the generic openURL function... spliturl = getcaprequest.split('?') - u = openURL(spliturl[0], spliturl[1], method='Get', - username=self.username, password=self.password) + u = openURL(spliturl[0], spliturl[1], method='Get', auth=self.auth) return etree.fromstring(u.read()) def readString(self, st): diff -Nru owslib-0.16.0/owslib/wps.py owslib-0.18.0/owslib/wps.py --- owslib-0.16.0/owslib/wps.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/owslib/wps.py 2019-06-25 00:00:28.000000000 +0000 @@ -1,20 +1,26 @@ +# -*- coding: ISO-8859-15 -*- +# ============================================================================= +# Copyright (c) 2018 Luca Cinquini # +# Authors : Luca Cinquini +# Carsten Ehbrecht # -# Author: Luca Cinquini -# -# - +# Contact email: ehbrecht@dkrz.de +# ============================================================================= """ - Abstract -------- -The wps module of the OWSlib package provides client-side functionality for executing invocations to a remote Web Processing Server. + +The wps module of the OWSlib package provides client-side functionality for executing invocations to a remote +Web Processing Server. Disclaimer ---------- -PLEASE NOTE: the owslib wps module should be considered in beta state: it has been tested versus only a handful of WPS services (deployed by the USGS, BADC and PML). -More extensive testing is needed and feedback is appreciated. + +.. warning:: The owslib wps module should be considered in beta state: it has been tested versus only a handful of + WPS services (deployed by the USGS, BADC and PML). + More extensive testing is needed and feedback is appreciated. Usage @@ -22,75 +28,92 @@ The module can be used to execute three types of requests versus a remote WPS endpoint: -a) "GetCapabilities" - - use the method wps.getcapabilities(xml=None) - - the optional keyword argument "xml" may be used to avoid a real live request, and instead read the WPS capabilities document from a cached XML file - -b) "DescribeProcess" - - use the method wps.describeprocess(identifier, xml=None) - - identifier is the process identifier, retrieved from the list obtained from a previous "GetCapabilities" invocation - - the optional keyword argument "xml" may be used to avoid a real live request, and instead read the WPS process description document from a cached XML file - -c) "Execute" - - use the method wps.execute(identifier, inputs, output=None, request=None, response=None), - which submits the job to the remote WPS server and returns a WPSExecution object that can be used to periodically check the job status until completion - (or error) - - - the optional keyword argument "request" may be used to avoid re-building the request XML from input arguments, and instead submit a request from a - pre-made XML file - - - alternatively, an "Execute" request can be built from input arguments by supplying the "identifier", "inputs" and "output" arguments to the execute() method. - - "identifier" is the mandatory process identifier - - "inputs" is a dictionary of (key,value) pairs where: - - key is a named input parameter - - value is either a string, or any python object that supports a getXml() method +# "GetCapabilities" + + * use the method wps.getcapabilities(xml=None) + * the optional keyword argument "xml" may be used to avoid a real live request, and instead read the + WPS capabilities document from a cached XML file + +# "DescribeProcess" + + * use the method wps.describeprocess(identifier, xml=None) + * identifier is the process identifier, retrieved from the list obtained from a previous + "GetCapabilities" invocation + * the optional keyword argument "xml" may be used to avoid a real live request, and instead read the + WPS process description document from a cached XML file + +# "Execute" + + * use the method wps.execute(identifier, inputs, output=None, request=None, response=None), + which submits the job to the remote WPS server and returns a WPSExecution object that can be used to periodically + check the job status until completion (or error) + * the optional keyword argument "request" may be used to avoid re-building the request XML from input arguments, + and instead submit a request from a pre-made XML file + * alternatively, an "Execute" request can be built from input arguments by supplying the "identifier", "inputs" + and "output" arguments to the execute() method. + + * "identifier" is the mandatory process identifier + * "inputs" is a dictionary of (key,value) pairs where: + + * key is a named input parameter + * value is either a string, or any python object that supports a getXml() method In particular, a few classes are included in the package to support a FeatuteCollection input: - - "WFSFeatureCollection" can be used in conjunction with "WFSQuery" to define a FEATURE_COLLECTION retrieved from a live WFS server. - - "GMLMultiPolygonFeatureCollection" can be used to define one or more polygons of (latitude, longitude) points. - - "output" is an optional output identifier to be included in the ResponseForm section of the request. - - - the optional keyword argument "response" mey be used to avoid submitting a real live request, and instead reading the WPS execution response document - from a cached XML file (for debugging or testing purposes) - - the convenience module function monitorExecution() can be used to periodically check the status of a remote running job, and eventually download the output - either to a named file, or to a file specified by the server. + + * "WFSFeatureCollection" can be used in conjunction with "WFSQuery" to define a FEATURE_COLLECTION + retrieved from a live WFS server. + * "GMLMultiPolygonFeatureCollection" can be used to define one or more polygons + of (latitude, longitude) points. + * "output" is an optional output identifier to be included in the ResponseForm section of the request. + + * the optional keyword argument "response" mey be used to avoid submitting a real live request, and instead + reading the WPS execution response document from a cached XML file (for debugging or testing purposes) + * the convenience module function monitorExecution() can be used to periodically check the status of a remote + running job, and eventually download the output either to a named file, or to a file specified by the server. Examples -------- -The files examples/wps-usgs-script.py, examples/wps-pml-script-1.py and examples/wps-pml-script-2.py contain real-world usage examples -that submits a "GetCapabilities", "DescribeProcess" and "Execute" requests to the live USGS and PML servers. To run: - cd examples - python wps-usgs-script.py - python wps-pml-script-1.py - python wps-pml-script-2.py - -The file wps-client.py contains a command-line client that can be used to submit a "GetCapabilities", "DescribeProcess" or "Execute" -request to an arbitratry WPS server. For example, you can run it as follows: - cd examples - To prints out usage and example invocations: wps-client -help - To execute a (fake) WPS invocation: - wps-client.py -v -u http://cida.usgs.gov/climate/gdp/process/WebProcessingService -r GetCapabilities -x ../tests/USGSCapabilities.xml +The files examples/wps-usgs-script.py, examples/wps-pml-script-1.py and examples/wps-pml-script-2.py contain +real-world usage examples that submits a "GetCapabilities", "DescribeProcess" and "Execute" requests to +the live USGS and PML servers. To run: + +* cd examples +* python wps-usgs-script.py +* python wps-pml-script-1.py +* python wps-pml-script-2.py + +The file wps-client.py contains a command-line client that can be used to submit a "GetCapabilities", +"DescribeProcess" or "Execute" request to an arbitratry WPS server. For example, you can run it as follows: + +* cd examples +* To prints out usage and example invocations: wps-client -help +* To execute a (fake) WPS invocation:: + + $ wps-client.py -v -u http://cida.usgs.gov/climate/gdp/process/WebProcessingService -r GetCapabilities -x ../tests/USGSCapabilities.xml # noqa The directory tests/ includes several doctest-style files wps_*.txt that show how to interactively submit a -"GetCapabilities", "DescribeProcess" or "Execute" request, without making a live request but rather parsing the response of cached XML response documents. To run: - cd tests - python -m doctest wps_*.txt - (or python -m doctest -v wps_*.txt for verbose output) +"GetCapabilities", "DescribeProcess" or "Execute" request, without making a live request but rather parsing the +response of cached XML response documents. To run: + +* cd tests +* python -m doctest wps_*.txt + ``(or python -m doctest -v wps_*.txt for verbose output)`` Also, the directory tests/ contains several examples of well-formed "Execute" requests: - - The files wps_USGSExecuteRequest*.xml contain requests that can be submitted to the live USGS WPS service. - - The files PMLExecuteRequest*.xml contain requests that can be submitted to the live PML WPS service. +* The files wps_USGSExecuteRequest*.xml contain requests that can be submitted to the live USGS WPS service. +* The files PMLExecuteRequest*.xml contain requests that can be submitted to the live PML WPS service. """ from __future__ import (absolute_import, division, print_function) from owslib.etree import etree -from owslib.ows import DEFAULT_OWS_NAMESPACE, ServiceIdentification, ServiceProvider, OperationsMetadata, BoundingBox +from owslib.ows import DEFAULT_OWS_NAMESPACE, XLINK_NAMESPACE +from owslib.ows import ServiceIdentification, ServiceProvider, OperationsMetadata, BoundingBox from time import sleep -from owslib.util import (testXMLValue, build_get_url, clean_ows_url, dump, getTypedValue, - getNamespace, element_to_string, nspath, openURL, nspath_eval, log) +from owslib.util import (testXMLValue, testXMLAttribute, build_get_url, clean_ows_url, dump, getTypedValue, + getNamespace, element_to_string, nspath, openURL, nspath_eval, log, Authentication) from xml.dom.minidom import parseString from owslib.namespaces import Namespaces try: # Python 3 @@ -98,6 +121,7 @@ except ImportError: # Python 2 from urlparse import urlparse +import six # namespace definition n = Namespaces() @@ -115,12 +139,19 @@ WPS_DEFAULT_SCHEMA_LOCATION = 'http://schemas.opengis.net/wps/1.0.0/wpsExecute_request.xsd' WPS_DEFAULT_VERSION = '1.0.0' +# WPS execution modes +AUTO = 'auto' +SYNC = 'sync' +ASYNC = 'async' + def get_namespaces(): ns = n.get_namespaces(["ogc", "wfs", "wps", "gml", "xsi", "xlink"]) ns[None] = n.get_namespace("wps") ns["ows"] = DEFAULT_OWS_NAMESPACE return ns + + namespaces = get_namespaces() @@ -130,8 +161,8 @@ """ try: parsed = urlparse(val) - is_ref = parsed.scheme != '' - except: + is_ref = bool(parsed.scheme) + except Exception: is_ref = False return is_ref @@ -144,8 +175,8 @@ if not is_str: # on python 2.x we need to check unicode try: - is_str = isinstance(val, unicode) - except: + is_str = isinstance(val, unicode) # noqa: F821 + except Exception: # unicode is not available on python 3.x is_str = False return is_str @@ -187,19 +218,31 @@ Implements IWebProcessingService. """ - def __init__(self, url, version=WPS_DEFAULT_VERSION, username=None, password=None, verbose=False, skip_caps=False): + def __init__(self, url, version=WPS_DEFAULT_VERSION, username=None, password=None, verbose=False, skip_caps=False, + headers=None, verify=True, cert=None, timeout=None, auth=None): """ Initialization method resets the object status. By default it will execute a GetCapabilities invocation to the remote service, which can be skipped by using skip_caps=True. """ + if auth: + if username: + auth.username = username + if password: + auth.password = password + if cert: + auth.cert = cert + if verify: + auth.verify = verify + self.auth = auth or Authentication(username, password, cert, verify) + # fields passed in from object initializer self.url = clean_ows_url(url) - self.username = username - self.password = password self.version = version self.verbose = verbose + self.headers = headers + self.timeout = timeout # fields populated by method invocations self._capabilities = None @@ -219,13 +262,13 @@ # read capabilities document reader = WPSCapabilitiesReader( - version=self.version, verbose=self.verbose) + version=self.version, verbose=self.verbose, auth=self.auth) if xml: # read from stored XML file self._capabilities = reader.readFromString(xml) else: self._capabilities = reader.readFromUrl( - self.url, username=self.username, password=self.password) + self.url, headers=self.headers) log.debug(element_to_string(self._capabilities)) @@ -235,44 +278,66 @@ def describeprocess(self, identifier, xml=None): """ Requests a process document from a WPS service and populates the process metadata. - Returns the process object. + Returns the process object or a list of process objects. + + :param str identifier: The process id. If `all`, return a list of all processes available. """ # read capabilities document reader = WPSDescribeProcessReader( - version=self.version, verbose=self.verbose) + version=self.version, verbose=self.verbose, auth=self.auth) if xml: # read from stored XML file rootElement = reader.readFromString(xml) else: # read from server - rootElement = reader.readFromUrl(self.url, identifier) + rootElement = reader.readFromUrl( + self.url, identifier, headers=self.headers) log.info(element_to_string(rootElement)) # build metadata objects - return self._parseProcessMetadata(rootElement) + processes = self._parseProcessMetadata(rootElement) + + if identifier == 'all': + return processes + else: + return processes[0] - def execute(self, identifier, inputs, output=None, request=None, response=None): + def execute(self, identifier, inputs, output=None, mode=ASYNC, lineage=False, request=None, response=None): """ Submits a WPS process execution request. - Returns a WPSExecution object, which can be used to monitor the status of the job, and ultimately retrieve the result. + Returns a WPSExecution object, which can be used to monitor the status of the job, and ultimately + retrieve the result. - identifier: the requested process identifier - inputs: list of process inputs as (key, value) tuples (where value is either a string for LiteralData, or an object for ComplexData) - output: optional identifier for process output reference (if not provided, output will be embedded in the response) - request: optional pre-built XML request document, prevents building of request from other arguments - response: optional pre-built XML response document, prevents submission of request to live WPS server + :param str identifier: the requested process identifier + :param inputs: list of process inputs as (input_identifier, value) tuples (where value is either a string + for LiteralData, or an object for ComplexData). + :param output: optional list of process outputs as tuples (output_identifier, as_ref, mime_type). + `as_ref` can be True (as reference), + False (embedded in response) or None (use service default). + `mime_type` should be text or None (use service default) + :param mode: execution mode: SYNC, ASYNC or AUTO. Default: ASYNC + :param lineage: if lineage is "true", the Execute operation response shall include the DataInputs and + OutputDefinitions elements. + :param request: optional pre-built XML request document, prevents building of request from other arguments + :param response: optional pre-built XML response document, prevents submission of request to live WPS server """ # instantiate a WPSExecution object log.info('Executing WPS request...') - execution = WPSExecution(version=self.version, url=self.url, - username=self.username, password=self.password, verbose=self.verbose) + execution = WPSExecution( + version=self.version, + url=self.url, + verbose=self.verbose, + headers=self.headers, + timeout=self.timeout, + auth=self.auth + ) # build XML request from parameters if request is None: - requestElement = execution.buildRequest(identifier, inputs, output) + requestElement = execution.buildRequest(identifier, inputs, output, mode=mode, lineage=lineage) request = etree.tostring(requestElement) execution.request = request log.debug(request) @@ -290,31 +355,45 @@ return execution + def getOperationByName(self, name): + """Return a named content item.""" + for item in self.operations: + if item.name == name: + return item + raise KeyError("No operation named %s" % name) + def _parseProcessMetadata(self, rootElement): - """ - Method to parse a XML element and returned the constructed Process object - """ + """Return a list of Process objects parsed from a XML element.""" - processDescriptionElement = rootElement.find('ProcessDescription') - process = Process(processDescriptionElement, verbose=self.verbose) + processDescriptionElements = rootElement.findall('ProcessDescription') + processes = [] + for processDescriptionElement in processDescriptionElements: + process = Process(processDescriptionElement, verbose=self.verbose) + + # override existing processes in object metadata, if existing already + found = False + for n, p in enumerate(self.processes): + if p.identifier == process.identifier: + self.processes[n] = process + found = True + # otherwise add it + if not found: + self.processes.append(process) - # override existing processes in object metadata, if existing already - found = False - for n, p in enumerate(self.processes): - if p.identifier == process.identifier: - self.processes[n] = process - found = True - # otherwise add it - if not found: - self.processes.append(process) + processes.append(process) - return process + return processes def _parseCapabilitiesMetadata(self, root): - ''' Sets up capabilities metadata objects ''' + """Set up capabilities metadata objects.""" + + # reset metdata + self.operations = [] + self.processes = [] # use the WPS namespace defined in the document root - wpsns = getNamespace(root) + # TODO: wpsns not used + # wpsns = getNamespace(root) self.updateSequence = root.attrib.get('updateSequence') @@ -328,20 +407,20 @@ if element.tag.endswith('ServiceIdentification'): self.identification = ServiceIdentification( element, namespace=ns) - if self.verbose == True: + if self.verbose is True: dump(self.identification) # metadata elif element.tag.endswith('ServiceProvider'): self.provider = ServiceProvider(element, namespace=ns) - if self.verbose == True: + if self.verbose is True: dump(self.provider) # # # # - # + # # noqa # # # @@ -351,13 +430,13 @@ for child in element.findall(nspath('Operation', ns=ns)): self.operations.append( OperationsMetadata(child, namespace=ns)) - if self.verbose == True: + if self.verbose is True: dump(self.operations[-1]) # # - # gov.usgs.cida.gdp.wps.algorithm.filemanagement.ReceiveFiles - # gov.usgs.cida.gdp.wps.algorithm.filemanagement.ReceiveFiles + # gov.usgs.cida.gdp.wps.algorithm.filemanagement.ReceiveFiles # noqa + # gov.usgs.cida.gdp.wps.algorithm.filemanagement.ReceiveFiles # noqa # # ...... # @@ -365,42 +444,51 @@ for child in element.findall(nspath('Process', ns=ns)): p = Process(child, verbose=self.verbose) self.processes.append(p) - if self.verbose == True: + if self.verbose is True: dump(self.processes[-1]) class WPSReader(object): - """ Superclass for reading a WPS document into a lxml.etree infoset. """ - def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False): + def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False, timeout=30, auth=None): self.version = version self.verbose = verbose + self.timeout = timeout + self.auth = auth or Authentication() - def _readFromUrl(self, url, data, method='Get', username=None, password=None): + def _readFromUrl(self, url, data, timeout, method='Get', username=None, password=None, + headers=None, verify=True, cert=None): """ Method to get and parse a WPS document, returning an elementtree instance. - url: WPS service base url. - data: GET: dictionary of HTTP (key, value) parameter pairs, POST: XML document to post - username, password: optional user credentials - """ + :param str url: WPS service base url. + :param str data: GET: dictionary of HTTP (key, value) parameter pairs, POST: XML document to post + :param str username: optional user credentials + :param str password: optional user credentials + """ + username = username or self.auth.username + password = password or self.auth.password + cert = cert or self.auth.cert + verify = verify or self.auth.verify if method == 'Get': # full HTTP request url - request_url = build_get_url(url, data) + request_url = build_get_url(url, data, overwrite=True) log.debug(request_url) # split URL into base url and query string to use utility function spliturl = request_url.split('?') u = openURL(spliturl[0], spliturl[ - 1], method='Get', username=username, password=password) + 1], method='Get', username=username, password=password, + headers=headers, verify=verify, cert=cert, timeout=self.timeout) return etree.fromstring(u.read()) elif method == 'Post': u = openURL(url, data, method='Post', - username=username, password=password) + username=username, password=password, + headers=headers, verify=verify, cert=cert, timeout=timeout) return etree.fromstring(u.read()) else: @@ -423,21 +511,26 @@ Utility class that reads and parses a WPS GetCapabilities document into a lxml.etree infoset. """ - def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False): + def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False, timeout=None, auth=None): # superclass initializer super(WPSCapabilitiesReader, self).__init__( - version=version, verbose=verbose) + version=version, verbose=verbose, timeout=timeout, auth=auth) - def readFromUrl(self, url, username=None, password=None): + def readFromUrl(self, url, username=None, password=None, + headers=None, verify=True, cert=None): """ Method to get and parse a WPS capabilities document, returning an elementtree instance. - url: WPS service base url, to which is appended the HTTP parameters: service, version, and request. - username, password: optional user credentials + + :param str url: WPS service base url, to which is appended the HTTP parameters: service, version, and request. + :param str username: optional user credentials + :param str password: optional user credentials """ return self._readFromUrl(url, {'service': 'WPS', 'request': 'GetCapabilities', 'version': self.version}, - username=username, password=password) + self.timeout, + username=username, password=password, + headers=headers, verify=verify, cert=cert) class WPSDescribeProcessReader(WPSReader): @@ -446,21 +539,25 @@ Class that reads and parses a WPS DescribeProcess document into a etree infoset """ - def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False): + def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False, timeout=None, auth=None): # superclass initializer super(WPSDescribeProcessReader, self).__init__( - version=version, verbose=verbose) + version=version, verbose=verbose, timeout=timeout, auth=auth) - def readFromUrl(self, url, identifier, username=None, password=None): + def readFromUrl(self, url, identifier, username=None, password=None, + headers=None, verify=True, cert=None): """ Reads a WPS DescribeProcess document from a remote service and returns the XML etree object - url: WPS service base url, to which is appended the HTTP parameters: 'service', 'version', and 'request', and 'identifier'. - """ + :param str url: WPS service base url, to which is appended the HTTP parameters: 'service', 'version', + 'request', and 'identifier'. + """ return self._readFromUrl(url, {'service': 'WPS', 'request': 'DescribeProcess', 'version': self.version, 'identifier': identifier}, - username=username, password=password) + self.timeout, + username=username, password=password, + headers=headers, verify=verify, cert=cert) class WPSExecuteReader(WPSReader): @@ -469,33 +566,47 @@ Class that reads and parses a WPS Execute response document into a etree infoset """ - def __init__(self, verbose=False): + def __init__(self, verbose=False, timeout=None, auth=None): # superclass initializer - super(WPSExecuteReader, self).__init__(verbose=verbose) + super(WPSExecuteReader, self).__init__(verbose=verbose, timeout=timeout, auth=auth) - def readFromUrl(self, url, data={}, method='Get', username=None, password=None): + def readFromUrl(self, url, data={}, method='Get', username=None, password=None, + headers=None, verify=True, cert=None): """ Reads a WPS status document from a remote service and returns the XML etree object. - url: the URL to submit the GET/POST request to. + :param str url: the URL to submit the GET/POST request to. """ - return self._readFromUrl(url, data, method, username=username, password=password) + return self._readFromUrl(url, data, self.timeout, method, username=username, password=password, + headers=headers, verify=verify, cert=cert) -class WPSExecution(): +class WPSExecution(object): """ Class that represents a single WPS process executed on a remote WPS service. """ - def __init__(self, version=WPS_DEFAULT_VERSION, url=None, username=None, password=None, verbose=False): + def __init__(self, version=WPS_DEFAULT_VERSION, url=None, username=None, password=None, verbose=False, + headers=None, verify=True, cert=None, timeout=None, auth=None): + + if auth: + if username: + auth.username = username + if password: + auth.password = password + if cert: + auth.cert = cert + if verify: + auth.verify = verify # initialize fields self.url = url self.version = version - self.username = username - self.password = password self.verbose = verbose + self.headers = headers + self.auth = auth or Authentication(username, password, cert, verify) + self.timeout = timeout # request document self.request = None @@ -513,19 +624,36 @@ self.statusLocation = None self.dataInputs = [] self.processOutputs = [] + self.creationTime = None - def buildRequest(self, identifier, inputs=[], output=None): + def buildRequest(self, identifier, inputs=[], output=None, mode=ASYNC, lineage=False): """ Method to build a WPS process request. - identifier: the requested process identifier - inputs: array of input arguments for the process. - - LiteralData inputs are expressed as simple (key,value) tuples where key is the input identifier, value is the value + :param str identifier: the requested process identifier + :param inputs: array of input arguments for the process. + - LiteralData inputs are expressed as simple (key,value) tuples where key is the input identifier, + value is the value - ComplexData inputs are expressed as (key, object) tuples, where key is the input identifier, - and the object must contain a 'getXml()' method that returns an XML infoset to be included in the WPS request - output: optional identifier if process output is to be returned as a hyperlink reference - """ + and the object must contain a 'getXml()' method that returns an XML infoset to be included in + the WPS request + :param output: array of outputs which should be returned: + expressed as tuples (key, as_ref, mime_mype) where key is the output identifier and as_ref is True + if output should be returned as reference. + as_ref and mimeType may be null for using server's default value + :param mode: execution mode: SYNC, ASYNC or AUTO. + :param lineage: if lineage is "true", the Execute operation response shall include the DataInputs and + OutputDefinitions elements. + """ + # TODO: auto mode needs to implemented for WPS 2.0.0 + if mode is SYNC: + _async = False + elif mode is AUTO: + log.warn("Auto mode not available in WPS 1.0.0. Using async mode.") + _async = True + else: + _async = True - #FEATURE_COLLECTION # # - # + # # noqa # # the_geom # STATE @@ -598,8 +726,8 @@ 'input type of "%s" parameter is unknown' % key) # - # - # + # + # # OUTPUT # # @@ -610,59 +738,79 @@ responseDocumentElement = etree.SubElement( responseFormElement, nspath_eval( 'wps:ResponseDocument', namespaces), - attrib={'storeExecuteResponse': 'true', 'status': 'true'}) + attrib={'storeExecuteResponse': str(_async).lower(), + 'status': str(_async).lower(), + 'lineage': str(lineage).lower()}) + # keeping backward compability of output parameter if isinstance(output, str): - self._add_output( - responseDocumentElement, output, asReference=True) + self._add_output(responseDocumentElement, output) elif isinstance(output, list): - for (identifier, as_reference) in output: + for ouputTuple in output: + # tuple (identifier, as_reference) for backward compatibility + if(len(ouputTuple) == 2): + (identifier, as_reference) = ouputTuple + mime_type = None + else: + (identifier, as_reference, mime_type) = ouputTuple self._add_output( - responseDocumentElement, identifier, asReference=as_reference) + responseDocumentElement, identifier, asReference=as_reference, mimeType=mime_type) else: raise Exception( 'output parameter is neither string nor list. output=%s' % output) return root - def _add_output(self, element, identifier, asReference=False): - outputElement = etree.SubElement( - element, nspath_eval('wps:Output', namespaces), - attrib={'asReference': str(asReference).lower()}) - outputIdentifierElement = etree.SubElement( - outputElement, nspath_eval('ows:Identifier', namespaces)).text = identifier + def _add_output(self, element, identifier, asReference=None, mimeType=None): + output_element = etree.SubElement( + element, nspath_eval('wps:Output', namespaces)) + if isinstance(mimeType, str): + output_element.attrib['mimeType'] = mimeType + if isinstance(asReference, bool): + output_element.attrib['asReference'] = str(asReference).lower() + # outputIdentifierElement + etree.SubElement( + output_element, nspath_eval('ows:Identifier', namespaces)).text = identifier # wait for 60 seconds by default def checkStatus(self, url=None, response=None, sleepSecs=60): """ Method to check the status of a job execution. - In the process, this method will upadte the object 'response' attribute. + In the process, this method will update the object 'response' attribute. - url: optional 'statusLocation' URL retrieved from a previous WPS Execute response document. + :param str url: optional 'statusLocation' URL retrieved from a previous WPS Execute response document. If not provided, the current 'statusLocation' URL will be used. - sleepSecs: number of seconds to sleep before returning control to the caller. + :param int sleepSecs: number of seconds to sleep before returning control to the caller. """ - reader = WPSExecuteReader(verbose=self.verbose) + reader = WPSExecuteReader(verbose=self.verbose, auth=self.auth) if response is None: # override status location if url is not None: self.statusLocation = url log.info('\nChecking execution status... (location=%s)' % self.statusLocation) - response = reader.readFromUrl( - self.statusLocation, username=self.username, password=self.password) + try: + response = reader.readFromUrl( + self.statusLocation, headers=self.headers) + except Exception: + log.error("Could not read status document.") else: response = reader.readFromString(response) # store latest response - self.response = etree.tostring(response) - log.debug(self.response) + try: + xml = etree.tostring(response) + except Exception: + log.error("Could not parse XML response.") + else: + self.response = xml + log.debug(self.response) - self.parseResponse(response) + self.parseResponse(response) - # sleep given number of seconds - if self.isComplete() == False: - log.info('Sleeping %d seconds...' % sleepSecs) - sleep(sleepSecs) + # sleep given number of seconds + if self.isComplete() is False: + log.info('Sleeping %d seconds...' % sleepSecs) + sleep(sleepSecs) def getStatus(self): return self.status @@ -692,8 +840,8 @@ Method to write the outputs of a WPS process to a file: either retrieves the referenced files from the server, or writes out the content of response embedded output. - filepath: optional path to the output file, otherwise a file will be created in the local directory with the name assigned by the server, - or default name 'wps.out' for embedded output. + :param filepath: optional path to the output file, otherwise a file will be created in the local directory with + the name assigned by the server, or default name 'wps.out' for embedded output. """ if self.isSucceded(): @@ -701,10 +849,11 @@ for output in self.processOutputs: output_content = output.retrieveData( - self.username, self.password) + self.auth.username, self.auth.password, + headers=self.headers, verify=self.auth.verify, cert=self.auth.cert) # ExecuteResponse contains reference to server-side output - if output_content is not b'': + if output_content != b'': content = content + output_content if filepath is None: filepath = output.fileName @@ -717,7 +866,7 @@ content = content + data # write out content - if content is not '': + if content != '': out = open(filepath, 'wb') out.write(content) out.close() @@ -732,13 +881,13 @@ Submits a WPS Execute document to a remote service, returns the XML response document from the server. This method will save the request document and the first returned response document. - request: the XML request document to be submitted as POST to the server. + :param request: the XML request document to be submitted as POST to the server. """ self.request = request - reader = WPSExecuteReader(verbose=self.verbose) + reader = WPSExecuteReader(verbose=self.verbose, timeout=self.timeout, auth=self.auth) response = reader.readFromUrl( - self.url, request, method='Post', username=self.username, password=self.password) + self.url, request, method='Post', headers=self.headers) self.response = response return response @@ -782,9 +931,8 @@ """ Method to parse a WPS ExceptionReport document and populate this object's metadata. """ - # set exception status, unless set already - if self.status is None: - self.status = "Exception" + # set exception status + self.status = "Exception" for exceptionEl in root.findall(nspath('Exception', ns=namespaces['ows'])): self.errors.append(WPSException(exceptionEl)) @@ -816,12 +964,18 @@ # statusEl = root.find(nspath('Status/*', ns=wpsns)) self.status = statusEl.tag.split('}')[1] + # creationTime attribute + element = root.find(nspath('Status', ns=wpsns)) + self.creationTime = testXMLAttribute(element, 'creationTime') # get progress info - try: - percentCompleted = int(statusEl.get('percentCompleted')) - self.percentCompleted = percentCompleted - except: - pass + if self.status == 'ProcessSucceeded': + self.percentCompleted = 100 + else: + try: + percentCompleted = int(statusEl.get('percentCompleted')) + self.percentCompleted = percentCompleted + except Exception: + pass # get status message self.statusMessage = statusEl.text # exceptions ? @@ -832,19 +986,25 @@ self.process = Process( root.find(nspath('Process', ns=wpsns)), verbose=self.verbose) - # + if len(self.dataInputs) > 0: + log.debug('clean data inputs') + self.dataInputs[:] = [] for inputElement in root.findall(nspath('DataInputs/Input', ns=wpsns)): - self.dataInputs.append(Input(inputElement)) - if self.verbose == True: + self.dataInputs.append(Output(inputElement)) + if self.verbose is True: dump(self.dataInputs[-1]) # # xmlns:ns="http://www.opengis.net/wps/1.0.0" + if len(self.processOutputs) > 0: + log.debug('clean process outputs') + self.processOutputs[:] = [] for outputElement in root.findall(nspath('ProcessOutputs/Output', ns=wpsns)): self.processOutputs.append(Output(outputElement)) - if self.verbose == True: + if self.verbose is True: dump(self.processOutputs[-1]) @@ -869,21 +1029,29 @@ def __init__(self, element): self.abstract = None + self.metadata = [] # loop over sub-elements without requiring a specific namespace - for subElement in element: + for child in element: # SUMMARIZE_TIMESTEP - if subElement.tag.endswith('Identifier'): - self.identifier = testXMLValue(subElement) + if child.tag.endswith('Identifier'): + self.identifier = testXMLValue(child) # Summarize Timestep - elif subElement.tag.endswith('Title'): - self.title = testXMLValue(subElement) + elif child.tag.endswith('Title'): + self.title = testXMLValue(child) + + # + # If selected, processing output will include columns with summarized statistics for all + # feature attribute values for each timestep + # + elif child.tag.endswith('Abstract'): + self.abstract = testXMLValue(child) - # If selected, processing output will include columns with summarized statistics for all feature attribute values for each timestep - elif subElement.tag.endswith('Abstract'): - self.abstract = testXMLValue(subElement) + # + elif child.tag.endswith('Metadata'): + self.metadata.append(Metadata(child)) self.allowedValues = [] self.supportedValues = [] @@ -898,7 +1066,7 @@ # # - # 7504912.93758151 -764109.175074507,7750849.82379226 -22141.8611641468,8561828.42371234 -897195.923493867,7724946.16844165 -602984.014261927 + # 7504912.93758151 -764109.175074507,7750849.82379226 -22141.8611641468,8561828.42371234 -897195.923493867,7724946.16844165 -602984.014261927 # noqa # # # nspath('Data', ns=WPS_NAMESPACE) @@ -934,9 +1102,15 @@ for sub_element in literal_data_element: subns = getNamespace(sub_element) if sub_element.tag.endswith('DataType'): - reference = sub_element.get(nspath("reference", ns=subns)) or sub_element.text - if reference and ':' in reference: - self.dataType = reference.split(':')[-1] + self.dataType = sub_element.text + if not self.dataType: + reference = sub_element.get(nspath("reference", ns=subns)) + # backward search of first non-alpha character (:, #, /, etc.) + pos = len(reference) - 1 + while pos >= 0 and reference[pos].isalpha(): + pos -= 1 + # obtain substring after found non-alpha character position + self.dataType = reference[pos + 1:] for sub_element in literal_data_element: @@ -1123,7 +1297,14 @@ # /> referenceElement = outputElement.find(nspath('Reference', ns=wpsns)) if referenceElement is not None: - self.reference = referenceElement.get('href') + # extract xlink namespace + xlinkns = get_namespaces()['xlink'] + xlink_href = '{{{}}}href'.format(xlinkns) + + if xlink_href in referenceElement.keys(): + self.reference = referenceElement.get(xlink_href) + else: + self.reference = referenceElement.get('href') self.mimeType = referenceElement.get('mimeType') # @@ -1138,13 +1319,13 @@ # # # - # 7504912.93758151 -764109.175074507,7750849.82379226 -22141.8611641468,8561828.42371234 -897195.923493867,7724946.16844165 -602984.014261927 + # 7504912.93758151 -764109.175074507,7750849.82379226 -22141.8611641468,8561828.42371234 -897195.923493867,7724946.16844165 -602984.014261927 # noqa # # # OR: # - # - # + # # noqa + # # noqa # # # -960123.14218016264665723.56559387 @@ -1153,7 +1334,7 @@ # # # - # -960123.142180162365548,4665723.565593870356679,0 -960123.142180162365548,4665723.565593870356679,0 -960123.142180162598379,4665723.565593870356679,0 -960123.142180162598379,4665723.565593870356679,0 -711230.141176006174646,4710278.48552671354264,0 -711230.141176006174646,4710278.48552671354264,0 -623656.677859728806652,4848552.374973464757204,0 -623656.677859728806652,4848552.374973464757204,0 -410100.337491964863148,4923834.82589447684586,0 -410100.337491964863148,4923834.82589447684586,0 -101288.651060882242746,5108200.011823480948806,0 -101288.651060882242746,5108200.011823480948806,0 -101288.651060882257298,5108200.011823480948806,0 -101288.651060882257298,5108200.011823480948806,0 + # -960123.142180162365548,4665723.565593870356679,0 -960123.142180162365548,4665723.565593870356679,0 -960123.142180162598379,4665723.565593870356679,0 -960123.142180162598379,4665723.565593870356679,0 -711230.141176006174646,4710278.48552671354264,0 -711230.141176006174646,4710278.48552671354264,0 -623656.677859728806652,4848552.374973464757204,0 -623656.677859728806652,4848552.374973464757204,0 # noqa -410100.337491964863148,4923834.82589447684586,0 -410100.337491964863148,4923834.82589447684586,0 -101288.651060882242746,5108200.011823480948806,0 -101288.651060882242746,5108200.011823480948806,0 -101288.651060882257298,5108200.011823480948806,0 -101288.651060882257298,5108200.011823480948806,0 # 1 # 1 # 0 @@ -1185,7 +1366,7 @@ if complexDataElement is not None: self.dataType = "ComplexData" self.mimeType = complexDataElement.get('mimeType') - if complexDataElement.text is not None and complexDataElement.text.strip() is not '': + if complexDataElement.text is not None and complexDataElement.text.strip() != '': self.data.append(complexDataElement.text.strip()) for child in complexDataElement: self.data.append(etree.tostring(child)) @@ -1193,10 +1374,10 @@ nspath('LiteralData', ns=wpsns)) if literalDataElement is not None: self.dataType = literalDataElement.get('dataType') - if literalDataElement.text is not None and literalDataElement.text.strip() is not '': + if literalDataElement.text is not None and literalDataElement.text.strip() != '': self.data.append(literalDataElement.text.strip()) bboxDataElement = dataElement.find(nspath('BoundingBox', ns=namespaces['ows'])) - if not bboxDataElement: + if bboxDataElement is not None: # TODO: just a workaround for data-inputs in lineage bboxDataElement = dataElement.find(nspath('BoundingBoxData', ns=namespaces['wps'])) if bboxDataElement is not None: @@ -1205,55 +1386,59 @@ if bbox: self.data.append(bbox) - def retrieveData(self, username=None, password=None): + def retrieveData(self, username=None, password=None, headers=None, verify=True, cert=None): """ Method to retrieve data from server-side reference: returns "" if the reference is not known. - username, password: credentials to access the remote WPS server + :param username: credentials to access the remote WPS server + :param password: credentials to access the remote WPS server """ - url = self.reference if url is None: return "" - # a) 'http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=1318528582026OUTPUT.601bb3d0-547f-4eab-8642-7c7d2834459e' + # a) 'http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=1318528582026OUTPUT.601bb3d0-547f-4eab-8642-7c7d2834459e' # noqa # b) 'http://rsg.pml.ac.uk/wps/wpsoutputs/outputImage-11294Bd6l2a.tif' log.info('Output URL=%s' % url) if '?' in url: spliturl = url.split('?') u = openURL(spliturl[0], spliturl[ - 1], method='Get', username=username, password=password) + 1], method='Get', username=username, password=password, + headers=headers, verify=verify, cert=cert) # extract output filepath from URL query string self.fileName = spliturl[1].split('=')[1] else: u = openURL( - url, '', method='Get', username=username, password=password) + url, '', method='Get', username=username, password=password, + headers=headers, verify=verify, cert=cert) # extract output filepath from base URL self.fileName = url.split('/')[-1] return u.read() - def writeToDisk(self, path=None, username=None, password=None): + def writeToDisk(self, path=None, username=None, password=None, + headers=None, verify=True, cert=None): """ Method to write an output of a WPS process to disk: it either retrieves the referenced file from the server, or write out the content of response embedded output. - filepath: optional path to the output file, otherwise a file will be created in the local directory with the name assigned by the server, - username, password: credentials to access the remote WPS server + :param filepath: optional path to the output file, otherwise a file will be created in the local directory + with the name assigned by the server, + :param username: credentials to access the remote WPS server + :param password: credentials to access the remote WPS server """ - # Check if ExecuteResponse contains reference to server-side output - content = self.retrieveData(username, password) + content = self.retrieveData(username, password, headers=headers, verify=verify, cert=cert) # ExecuteResponse contain embedded output - if content is "" and len(self.data) > 0: + if content == "" and len(self.data) > 0: self.fileName = self.identifier for data in self.data: content = content + data # write out content - if content is not "": + if content != "": if self.fileName == "": self.fileName = self.identifier self.filePath = path + self.fileName @@ -1264,11 +1449,9 @@ class WPSException: - """ Class representing an exception raised by a WPS. """ - def __init__(self, root): self.code = root.attrib.get("exceptionCode", None) self.locator = root.attrib.get("locator", None) @@ -1279,18 +1462,35 @@ self.text = "" -class Process(object): +class Metadata(object): + """Initialize an OWS Metadata construct""" + def __init__(self, elem, namespace=DEFAULT_OWS_NAMESPACE): + self.url = None + self.title = None + self.role = None + + if elem is not None: + urlattrib = elem.attrib.get(nspath('href', XLINK_NAMESPACE)) + if urlattrib is not None: + self.url = testXMLValue(urlattrib, True) + titleattrib = elem.attrib.get(nspath('title', XLINK_NAMESPACE)) + if titleattrib is not None: + self.title = testXMLValue(titleattrib, True) + roleattrib = elem.attrib.get(nspath('role', XLINK_NAMESPACE)) + if roleattrib is not None: + self.role = testXMLValue(roleattrib, True) + +class Process(object): """ Class that represents a WPS process. """ - def __init__(self, elem, verbose=False): """ Initialization method extracts all available metadata from an XML document (passed in as etree object) """ # + # xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsDescribeProcess_response.xsd" # noqa + # xml:lang="en-US" xmlns:ns0="http://www.opengis.net/wps/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> # noqa # OR: # self._root = elem @@ -1298,45 +1498,85 @@ wpsns = getNamespace(elem) + def get_bool_attribute(elem, attribute): + property = elem.get(attribute, '').lower() + if property == 'true': + value = True + elif property == 'false': + value = False + else: + value = None + return value + # self.processVersion = elem.get(nspath('processVersion', ns=wpsns)) - self.statusSupported = bool(elem.get("statusSupported")) - self.storeSupported = bool(elem.get("storeSupported")) + self.statusSupported = get_bool_attribute(elem, "statusSupported") + self.storeSupported = get_bool_attribute(elem, "storeSupported") + self.identifier = None + self.title = None self.abstract = None + self.metadata = [] for child in elem: # this element's namespace - ns = getNamespace(child) + # TODO: ns not used + # ns = getNamespace(child) - # gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm + # + # gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm + # if child.tag.endswith('Identifier'): self.identifier = testXMLValue(child) - # Feature Weighted Grid Statistics + # + # Feature Weighted Grid Statistics + # elif child.tag.endswith('Title'): self.title = testXMLValue(child) - # This algorithm generates area weighted statistics of a gridded dataset for a set of vector polygon features. Using the bounding-box that encloses the feature data and the time range, if provided, a subset of the gridded dataset is requested from the remote gridded data server. Polygon representations are generated for cells in the retrieved grid. The polygon grid-cell representations are then projected to the feature data coordinate reference system. The grid-cells are used to calculate per grid-cell feature coverage fractions. Area-weighted statistics are then calculated for each feature using the grid values and fractions as weights. If the gridded dataset has a time range the last step is repeated for each time step within the time range or all time steps if a time range was not supplied. + # + # This algorithm generates area weighted statistics of a gridded dataset for + # a set of vector polygon features. Using the bounding-box that encloses + # the feature data and the time range, if provided, a subset of the gridded dataset + # is requested from the remote gridded data server. + # Polygon representations are generated for cells in the retrieved grid. + # The polygon grid-cell representations are then projected to the feature data + # coordinate reference system. The grid-cells are used to calculate per grid-cell + # feature coverage fractions. Area-weighted statistics are then calculated for each feature + # using the grid values and fractions as weights. If the gridded dataset has a time range + # the last step is repeated for each time step within the time range or all time steps + # if a time range was not supplied. + # elif child.tag.endswith('Abstract'): self.abstract = testXMLValue(child) - if self.verbose == True: + # + elif child.tag.endswith('Metadata'): + self.metadata.append(Metadata(child)) + + if self.verbose is True: dump(self) # self.dataInputs = [] for inputElement in elem.findall('DataInputs/Input'): self.dataInputs.append(Input(inputElement)) - if self.verbose == True: + if self.verbose is True: dump(self.dataInputs[-1], prefix='\tInput: ') # self.processOutputs = [] for outputElement in elem.findall('ProcessOutputs/Output'): self.processOutputs.append(Output(outputElement)) - if self.verbose == True: - dump(self.processOutputs[-1], prefix='\tOutput: ') + if self.verbose is True: + dump(self.processOutputs[-1], prefix='\tOutput: ') + + def __str__(self): + return "WPS Process: {}, title={}".format(self.identifier or '', self.title or '') + + def __repr__(self): + return "".format(self.identifier or '') class BoundingBoxDataInput(object): @@ -1345,7 +1585,7 @@ :param list data: Coordinates of lower and upper corner. Example [10, 50, 20, 60] with lower corner=[10, 50] and upper corner=[20, 60]. - :param string crs: Name of coordinate reference system. Default: "epsg:4326". + :param str crs: Name of coordinate reference system. Default: "epsg:4326". """ def __init__(self, data, crs=None, dimensions=2): if isinstance(data, list): @@ -1405,8 +1645,14 @@ """ """ - refElement = etree.Element(nspath_eval('wps:Reference', namespaces), - attrib={nspath_eval("xlink:href", namespaces): self.value}) + attrib = {nspath_eval("xlink:href", namespaces): self.value} + if self.encoding: + attrib['encoding'] = self.encoding + if self.schema: + attrib['schema'] = self.schema + if self.mimeType: + attrib['mimeType'] = self.mimeType + refElement = etree.Element(nspath_eval('wps:Reference', namespaces), attrib) return refElement def complexDataRaw(self): @@ -1464,9 +1710,10 @@ self.url = wfsUrl self.query = wfsQuery self.method = wfsMethod + # # - # + # # noqa # ....... # # @@ -1480,10 +1727,10 @@ root, nspath_eval('wps:Body', namespaces)) getFeatureElement = etree.SubElement( bodyElement, nspath_eval('wfs:GetFeature', namespaces), - attrib={"service": "WFS", - "version": "1.1.0", - "outputFormat": "text/xml; subtype=gml/3.1.1", - nspath_eval("xsi:schemaLocation", namespaces): "%s %s" % (namespaces['wfs'], WFS_SCHEMA_LOCATION)}) + attrib={"service": "WFS", + "version": "1.1.0", + "outputFormat": "text/xml; subtype=gml/3.1.1", + nspath_eval("xsi:schemaLocation", namespaces): "%s %s" % (namespaces['wfs'], WFS_SCHEMA_LOCATION)}) # # the_geom @@ -1530,22 +1777,21 @@ filterElement = etree.SubElement( queryElement, nspath_eval('ogc:Filter', namespaces)) for filter in self.filters: - gmlObjectIdElement = etree.SubElement( + # gmlObjectIdElement + etree.SubElement( filterElement, nspath_eval('ogc:GmlObjectId', namespaces), - attrib={nspath_eval('gml:id', namespaces): filter}) + attrib={nspath_eval('gml:id', namespaces): filter}) return queryElement class GMLMultiPolygonFeatureCollection(FeatureCollection): - ''' Class that represents a FeatureCollection defined as a GML multi-polygon. ''' - def __init__(self, polygons): ''' Initializer accepts an array of polygons, where each polygon is an array of (lat,lon) tuples. - Example: polygons = [ [(-102.8184, 39.5273), (-102.8184, 37.418), (-101.2363, 37.418), (-101.2363, 39.5273), (-102.8184, 39.5273)], + Example: polygons = [ [(-102.8184, 39.5273), (-102.8184, 37.418), (-101.2363, 37.418), (-101.2363, 39.5273), (-102.8184, 39.5273)], # noqa [(-92.8184, 39.5273), (-92.8184, 37.418), (-91.2363, 37.418), (-91.2363, 39.5273), (-92.8184, 39.5273)] ] ''' self.polygons = polygons @@ -1559,7 +1805,7 @@ xmlns:draw="gov.usgs.cida.gdp.draw" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" - xsi:schemaLocation="gov.usgs.cida.gdp.draw http://cida.usgs.gov/climate/derivative/xsd/draw.xsd"> + xsi:schemaLocation="gov.usgs.cida.gdp.draw http://cida.usgs.gov/climate/derivative/xsd/draw.xsd"> # noqa >> from owslib.wms import WebMapService + >>> wms = WebMapService('http://wms.jpl.nasa.gov/wms.cgi', version='1.1.1') + >>> wms.identification.type + 'OGC:WMS' + >>> wms.identification.version + '1.1.1' + >>> wms.identification.title + 'JPL Global Imagery Service' + >>> wms.identification.abstract + 'WMS Server maintained by JPL, worldwide satellite imagery.' + +Available layers:: + + >>> list(wms.contents) + ['us_landsat_wgs84', 'modis', 'global_mosaic_base', 'huemapped_srtm', + 'srtm_mag', 'daily_terra', 'us_ned', 'us_elevation', 'global_mosaic', + 'daily_terra_ndvi', 'daily_aqua_ndvi', 'daily_aqua_721', 'daily_planet', + 'BMNG', 'srtmplus', 'us_colordem', None, 'daily_aqua', 'worldwind_dem', + 'daily_terra_721'] + +Details of a layer:: + + >>> wms['global_mosaic'].title + 'WMS Global Mosaic, pan sharpened' + >>> wms['global_mosaic'].boundingBoxWGS84 + (-180.0, -60.0, 180.0, 84.0) + >>> wms['global_mosaic'].crsOptions + ['EPSG:4326', 'AUTO:42003'] + >>> wms['global_mosaic'].styles + {'pseudo_bright': {'title': 'Pseudo-color image (Uses IR and Visual bands, + 542 mapping), gamma 1.5'}, 'pseudo': {'title': '(default) Pseudo-color + image, pan sharpened (Uses IR and Visual bands, 542 mapping), gamma 1.5'}, + 'visual': {'title': 'Real-color image, pan sharpened (Uses the visual + bands, 321 mapping), gamma 1.5'}, 'pseudo_low': {'title': 'Pseudo-color + image, pan sharpened (Uses IR and Visual bands, 542 mapping)'}, + 'visual_low': {'title': 'Real-color image, pan sharpened (Uses the visual + bands, 321 mapping)'}, 'visual_bright': {'title': 'Real-color image (Uses + the visual bands, 321 mapping), gamma 1.5'}} + +Available methods, their URLs, and available formats:: + + >>> [op.name for op in wms.operations] + ['GetTileService', 'GetCapabilities', 'GetMap'] + >>> wms.getOperationByName('GetMap').methods + {'Get': {'url': 'http://wms.jpl.nasa.gov/wms.cgi?'}} + >>> wms.getOperationByName('GetMap').formatOptions + ['image/jpeg', 'image/png', 'image/geotiff', 'image/tiff'] + +That's everything needed to make a request for imagery:: + + >>> img = wms.getmap( layers=['global_mosaic'], + ... styles=['visual_bright'], + ... srs='EPSG:4326', + ... bbox=(-112, 36, -106, 41), + ... size=(300, 250), + ... format='image/jpeg', + ... transparent=True + ... ) + >>> out = open('jpl_mosaic_visb.jpg', 'wb') + >>> out.write(img.read()) + >>> out.close() + +A very similar API exists for WebFeatureService. See +tests/wfs_MapServerWFSCapabilities.txt for details. + +There is also support for Web Coverage Service (WCS), Catalogue +Service for the Web (CSW), Web Processing Service (WPS), and Web +Map Tile Service (WMTS). Some of those are beta quality. + + +Logging +------- +OWSLib logs messages to the 'owslib' named python logger. You may +configure your application to use the log messages like so: + + >>> import logging + >>> owslib_log = logging.getLogger('owslib') + >>> # Add formatting and handlers as needed + >>> owslib_log.setLevel(logging.DEBUG) + +Releasing +--------- + +.. code-block:: bash + + # update version + vi VERSION.txt + vi owslib/__init__.py + git commit -m 'update release version' VERSION.txt owslib/__init__.py + # push changes + git push origin master + git tag -a x.y.z -m 'tagging OWSLib release x.y.z' + # push tag + git push --tags + # update live docs + cd docs + make html + ./publish.sh + # update on PyPI (must be a maintainer) + python setup.py sdist upload + +Support +------- + +http://lists.osgeo.org/mailman/listinfo/owslib-users +http://lists.osgeo.org/mailman/listinfo/owslib-devel diff -Nru owslib-0.16.0/README.txt owslib-0.18.0/README.txt --- owslib-0.16.0/README.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/README.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,108 +0,0 @@ -OWSLib -====== - -OWSLib is a Python package for client programming with Open Geospatial -Consortium (OGC) web service (hence OWS) interface standards, and their -related content models. - -Full documentation is available at http://geopython.github.io/OWSLib - -OWSLib provides a common API for accessing service metadata and wrappers for -numerous OGC Web Service interfaces. - -Dependencies ------------- - -OWSLib requires elementtree (standard in 2.5 as xml.etree) or lxml. - -Usage ------ - -Find out what a WMS has to offer. Service metadata:: - - >>> from owslib.wms import WebMapService - >>> wms = WebMapService('http://wms.jpl.nasa.gov/wms.cgi', version='1.1.1') - >>> wms.identification.type - 'OGC:WMS' - >>> wms.identification.version - '1.1.1' - >>> wms.identification.title - 'JPL Global Imagery Service' - >>> wms.identification.abstract - 'WMS Server maintained by JPL, worldwide satellite imagery.' - -Available layers:: - - >>> list(wms.contents) - ['us_landsat_wgs84', 'modis', 'global_mosaic_base', 'huemapped_srtm', - 'srtm_mag', 'daily_terra', 'us_ned', 'us_elevation', 'global_mosaic', - 'daily_terra_ndvi', 'daily_aqua_ndvi', 'daily_aqua_721', 'daily_planet', - 'BMNG', 'srtmplus', 'us_colordem', None, 'daily_aqua', 'worldwind_dem', - 'daily_terra_721'] - -Details of a layer:: - - >>> wms['global_mosaic'].title - 'WMS Global Mosaic, pan sharpened' - >>> wms['global_mosaic'].boundingBoxWGS84 - (-180.0, -60.0, 180.0, 84.0) - >>> wms['global_mosaic'].crsOptions - ['EPSG:4326', 'AUTO:42003'] - >>> wms['global_mosaic'].styles - {'pseudo_bright': {'title': 'Pseudo-color image (Uses IR and Visual bands, - 542 mapping), gamma 1.5'}, 'pseudo': {'title': '(default) Pseudo-color - image, pan sharpened (Uses IR and Visual bands, 542 mapping), gamma 1.5'}, - 'visual': {'title': 'Real-color image, pan sharpened (Uses the visual - bands, 321 mapping), gamma 1.5'}, 'pseudo_low': {'title': 'Pseudo-color - image, pan sharpened (Uses IR and Visual bands, 542 mapping)'}, - 'visual_low': {'title': 'Real-color image, pan sharpened (Uses the visual - bands, 321 mapping)'}, 'visual_bright': {'title': 'Real-color image (Uses - the visual bands, 321 mapping), gamma 1.5'}} - -Available methods, their URLs, and available formats:: - - >>> [op.name for op in wms.operations] - ['GetTileService', 'GetCapabilities', 'GetMap'] - >>> wms.getOperationByName('GetMap').methods - {'Get': {'url': 'http://wms.jpl.nasa.gov/wms.cgi?'}} - >>> wms.getOperationByName('GetMap').formatOptions - ['image/jpeg', 'image/png', 'image/geotiff', 'image/tiff'] - -That's everything needed to make a request for imagery:: - - >>> img = wms.getmap( layers=['global_mosaic'], - ... styles=['visual_bright'], - ... srs='EPSG:4326', - ... bbox=(-112, 36, -106, 41), - ... size=(300, 250), - ... format='image/jpeg', - ... transparent=True - ... ) - >>> out = open('jpl_mosaic_visb.jpg', 'wb') - >>> out.write(img.read()) - >>> out.close() - -A very similar API exists for WebFeatureService. See -tests/wfs_MapServerWFSCapabilities.txt for details. - -There is also support for Web Coverage Service (WCS), Catalogue -Service for the Web (CSW), Web Processing Service (WPS), and Web -Map Tile Service (WMTS). Some of those are beta quality. - - -Logging -------- -OWSLib logs messages to the 'owslib' named python logger. You may -configure your application to use the log messages like so: - - >>> import logging - >>> owslib_log = logging.getLogger('owslib') - >>> # Add formatting and handlers as needed - >>> owslib_log.setLevel(logging.DEBUG) - - -Support -------- - -http://lists.osgeo.org/mailman/listinfo/owslib-users -http://lists.osgeo.org/mailman/listinfo/owslib-devel diff -Nru owslib-0.16.0/requirements-dev.txt owslib-0.18.0/requirements-dev.txt --- owslib-0.16.0/requirements-dev.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/requirements-dev.txt 2019-06-25 00:00:28.000000000 +0000 @@ -1,6 +1,6 @@ -r requirements.txt -pep8 -pytest +flake8 +pytest>=3.6 pytest-cov Pillow tox diff -Nru owslib-0.16.0/setup.py owslib-0.18.0/setup.py --- owslib-0.16.0/setup.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/setup.py 2019-06-25 00:00:28.000000000 +0000 @@ -14,7 +14,7 @@ errno = pytest.main(self.test_args) sys.exit(errno) -readme = open('README.txt').read() +readme = open('README.rst').read() reqs = [line.strip() for line in open('requirements.txt')] setup(name = 'OWSLib', @@ -41,4 +41,3 @@ 'Topic :: Scientific/Engineering :: GIS', ], ) - diff -Nru owslib-0.16.0/tests/_broken/doctests/csw_linz.txt owslib-0.18.0/tests/_broken/doctests/csw_linz.txt --- owslib-0.16.0/tests/_broken/doctests/csw_linz.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests/csw_linz.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,65 @@ +Imports + + >>> from __future__ import (absolute_import, division, print_function) + >>> from owslib import fes + >>> from owslib.dif import namespaces + >>> from owslib.csw import CatalogueServiceWeb as cs + >>> from owslib.etree import etree + + >>> c=cs('http://data.linz.govt.nz/services/csw/',timeout=30) + >>> c.identification.title + 'LINZ Data Service' + >>> c.identification.version + '2.0.2' + >>> c.provider.name + 'Land Information New Zealand' + >>> prop = fes.PropertyIsLike('csw:AnyText', 'parcel boundaries') + >>> c.getrecords2([prop], maxrecords=20) + >>> c.results['matches'] + 23 + >>> c.results['returned'] + 20 + >>> c.records['4d8c2d95-4ac2-1aa3-5b81-3cd4eff1ad0f'].title + 'NZ Strata Parcels' + >>> c.records['4d8c2d95-4ac2-1aa3-5b81-3cd4eff1ad0f'].abstract + 'This layer provides the **current** strata parcel polygons and their associated descriptive data as a single layer to facilitate their use independently of other primary parcels or non primary parcels.\n\nStrata parcels are portions of land where the vertical extent is limited. \n\nThe combination of this layer with the primary parcels layer provides all current parcels for New Zealand (i.e. excludes Historic and Pending parcels)\n\nIf you require approved or historic parcels see the [All Parcels Layer](http://data.linz.govt.nz/layer/1571-nz-all-parcels)\n\nThis layer has a nominal accuracy of 0.1-1m in urban areas and 1-100m in rural areas. For more detailed information about parcel accuracies please refer to the [Survey Boundary Marks](http://data.linz.govt.nz/layer/774-nz-survey-boundary-marks) layer which contains accuracies for each parcel node.\n\nThe originating data for parcel/title associations includes some non-official sources where the official data does not support a link. For more information [see](http://www.linz.govt.nz/about-linz/linz-data-service/dataset-information/cadastral-titles-data)' + >>> c.getrecordbyid(['4d8c2d95-4ac2-1aa3-5b81-3cd4eff1ad0f']) + >>> prop = fes.PropertyIsLike("csw:AnyText", "hydro") + >>> c.getrecords2([prop], outputschema='http://www.isotc211.org/2005/gmd-bad') #doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + File "", line 1, in + ExceptionReport: 'Invalid outputSchema parameter value: http://www.isotc211.org/2005/gmd-bad' + >>> c.response #doctest: +SKIP + >>> prop = fes.PropertyIsLike("csw:AnyText", "hydro") + >>> c.getrecords2([prop], outputschema='http://www.isotc211.org/2005/gmd', maxrecords=2) + >>> c.results['returned'] + 2 + >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].identification.title + 'Unsurveyed area polygon (Hydro, 1:1.5mil and smaller)' + >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].identifier + 'e4625e24-899e-4aed-c9d0-e4e341bf9d4b' + >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].stdname + 'ISO19115' + >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].stdver + '2003/Cor.1:2006' + >>> c.harvest('somefile','someuri') #doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + File "", line 1, in + ExceptionReport: 'Harvest operations are not supported' + >>> c.response #doctest: +SKIP + '\n\nHarvest operations are not supported' + >>> prop = fes.PropertyIsLike("csw:AnyText", "glacial") + >>> c.getrecords2([prop], outputschema='http://www.opengis.net/cat/csw/csdgm') + >>> c.results['matches'] > 0 + True + >>> c.results['nextrecord'] + 0 + >>> c.getrecords2([prop], outputschema='http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/', maxrecords=2) + >>> c.results['returned'] + 2 + >>> c.results['nextrecord'] + 0 + >>> sort_by=fes.SortBy([fes.SortProperty("dc:title", "ASC")]) + >>> c.getrecords2([prop], outputschema='http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/', maxrecords=2, sortby=sort_by) + >>> c.records['3cb46f76-e8d7-65ac-8b41-055675021f7b'].title + 'NZ Ross Dependency Glacial Lake Polygons (ANT, 1:50k)' diff -Nru owslib-0.16.0/tests/_broken/doctests/csw_nlr.txt owslib-0.18.0/tests/_broken/doctests/csw_nlr.txt --- owslib-0.16.0/tests/_broken/doctests/csw_nlr.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests/csw_nlr.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,73 @@ + +>>> from __future__ import (absolute_import, division, print_function) +>>> from owslib.csw import CatalogueServiceWeb +>>> from owslib import fes + +>>> c = CatalogueServiceWeb('http://geomatics.nlr.nl/excat/csw') + +>>> c.identification.title +'NLR CSW' + +>>> c.identification.abstract +'NLR CSW: XQuery based catalog service conform to the HTTP protocol binding \n of the OpenGIS Catalogue Service specification version 2.0.2/2.0.1' + +>>> c.identification.keywords +['CSW', 'geospatial', 'catalogue'] + +>>> c.identification.fees +'NONE' + +>>> c.identification.accessconstraints +'NONE' + +>>> c.identification.type +'CSW' + +>>> c.identification.version +'2.0.2' + +>>> c.provider.name +'National Aerospace Laboratory NLR' + +>>> c.provider.site #doctest: +IGNORE_EXCEPTION_DETAIL +Traceback (most recent call last): + File "", line 1, in +AttributeError: 'ServiceProvider' object has no attribute 'site' + +>>> c.provider.url +'http://geomatics.nlr.nl/excat' + +>>> c.provider.uri #doctest: +IGNORE_EXCEPTION_DETAIL +Traceback (most recent call last): + File "", line 1, in +AttributeError: 'ServiceProvider' object has no attribute 'uri' + +>>> c.provider.contact.name +'Rob van Swol' + +>>> c.provider.contact.position +'Senior Scientist NLR-ASSP' + +>>> [op.name for op in c.operations] +['GetCapabilities', 'DescribeRecord', 'GetRecords', 'GetRecordById'] + +>>> grop = c.get_operation_by_name('GetRecords') +>>> grop.name +'GetRecords' + +>>> c.get_operation_by_name('GetRecords-bad') #doctest: +IGNORE_EXCEPTION_DETAIL +Traceback (most recent call last): + File "", line 1, in +KeyError: 'No operation named GetRecords-bad' + +>>> c.describerecord() + +>>> c.getdomain('GetRecords.outputSchema') #doctest: +IGNORE_EXCEPTION_DETAIL +Traceback (most recent call last): + File "", line 1, in +ExceptionReport: 'Operation not supported: GetDomain' + +>>> c.getrecordbyid(['DGFKRYMCWUZSCDRBWRXMIETZE']) + +#>>> c.records['DGFKRYMCWUZSCDRBWRXMIETZE'].title +#'CERISE: Computationally Efficient Radar Image Simulation Environment' diff -Nru owslib-0.16.0/tests/_broken/doctests/csw_uuid_constrain.txt owslib-0.18.0/tests/_broken/doctests/csw_uuid_constrain.txt --- owslib-0.16.0/tests/_broken/doctests/csw_uuid_constrain.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests/csw_uuid_constrain.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,120 @@ +Imports + >>> from __future__ import (absolute_import, division, print_function) + >>> from owslib.csw import CatalogueServiceWeb as cs + >>> from xml.dom import minidom as md + >>> from owslib import fes, csw + >>> from tests.utils import compare_xml + +Initialize CSW client + + # connect to CSW, explore it's properties + #endpoint = 'http://data.nodc.noaa.gov/geoportal/csw' # NODC Geoportal: collection level + #endpoint = 'http://geodiscover.cgdi.ca/wes/serviceManagerCSW/csw' # NRCAN + #endpoint = 'http://geoport.whoi.edu/gi-cat/services/cswiso' # USGS Woods Hole GI_CAT + #endpoint = 'http://cida.usgs.gov/gdp/geonetwork/srv/en/csw' # USGS CIDA Geonetwork + #endpoint = 'http://www.nodc.noaa.gov/geoportal/csw' # NODC Geoportal: granule level + #endpoint = 'http://cmgds.marine.usgs.gov/geonetwork/srv/en/csw' # USGS Coastal & Marine Program Geonetwork + >>> endpoint = 'http://www.ngdc.noaa.gov/geoportal/csw' # NGDC Geoportal + >>> c = cs(endpoint, timeout=30) + + # define some var + >>> AOOS = '1706F520-2647-4A33-B7BF-592FAFDE4B45' + >>> bbox = [-141,42,-52,84] + + # Test new function getrecords2() + >>> uuid = fes.PropertyIsEqualTo(propertyname='sys.siteuuid', literal='{%s}' % AOOS) + >>> timeRange = fes.PropertyIsBetween(propertyname='apiso:modified', lower='2009-02-01', upper='2015-02-01') + >>> word = fes.PropertyIsLike(propertyname='csw:AnyText', literal='*salinity*', escapeChar='\\', singleChar='?', wildCard='*') + >>> box = fes.BBox(bbox) + + ########################################################## + # Test 1 + # Passing a list of list [[a,c,d],[b,c,d]] + # Translates to (a && c && d) || (b && c && d) + ########################################################## + >>> filter_list = [[uuid, word, timeRange], [bbox, word, timeRange]] + >>> c.getrecords2(filter_list) + >>> c.results == {'matches': 75, 'nextrecord': 11, 'returned': 10} + True + + ########################################################## + # Test 2 + # Passing a list of list [a, b] + # it means a || b + ########################################################## + # The response of this query is chaning to often to be a reliable test. + # >>> filter_list = [uuid, box] + # >>> c.getrecords2(filter_list) + # >>> c.results + # {'matches': 4895, 'nextrecord': 11, 'returned': 10} + + ########################################################## + # Test 3 + # Passing a list of list [[a,b]] + # it means a && b + ########################################################## + >>> filter_list = [[uuid, box]] + >>> c.getrecords2(filter_list) + >>> c.results['matches'] > 0 + True + >>> c.results['returned'] < 11 + True + + ########################################################## + # Test 4 + # Null Check: sys.siteuuid is null + # Passing a list [c] + ########################################################## + >>> filter = fes.PropertyIsNull(propertyname='sys.siteuuid') + >>> c.getrecords2([filter]) + >>> c.results['matches'] < 1 + True + >>> c.results['nextrecord'] == 0 + True + + + ########################################################## + # Test 5 + # construct a request by send the xml string + ########################################################## + >>> sos_search=b''' + ... + ... + ... full + ... + ... + ... + ... + ... apiso:ServiceType + ... *opendap* + ... + ... + ... + ... + ... + ... + ... ''' + >>> c.getrecords2(xml=sos_search) # in about XML it has constraint: maxrecords=10 + >>> c.results['matches'] > 0 + True + >>> c.results['returned'] < 11 + True + >>> c.results['nextrecord'] == 11 + True + + ########################################################## + # Test 6 + # construct a request by setting SAME constraint with Test 1 + # Passing a list of list [[a,b]] + # it means a && b + ########################################################## + >>> dap_filter = fes.PropertyIsLike(propertyname='apiso:ServiceType', literal='*opendap*', escapeChar='\\', singleChar='?', wildCard='*') + >>> filter_list = [[uuid,dap_filter]] + >>> c.getrecords2(filter_list) + >>> c.results['matches'] > 0 + True + >>> c.results['returned'] < 11 + True + >>> c.results['nextrecord'] == 11 + True + diff -Nru owslib-0.16.0/tests/_broken/doctests/iso_che.txt owslib-0.18.0/tests/_broken/doctests/iso_che.txt --- owslib-0.16.0/tests/_broken/doctests/iso_che.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests/iso_che.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,28 @@ + >>> from owslib.etree import etree + >>> from owslib.iso_che import CHE_MD_Metadata + >>> from tests.utils import resource_file + + >>> m = CHE_MD_Metadata(etree.parse(resource_file('iso_che.xml'))) + + >>> m.language + 'ger' + >>> [loc.id for loc in m.locales] + ['DE', 'FR', 'IT', 'EN'] + >>> m.get_default_locale().id + 'DE' + >>> m.identification.title + u'Gew\xe4sserschutzkarte' + >>> m.identification.contact[0].organization + u'Amt f\xfcr Umweltschutz' + >>> m.identification.bbox.minx + 8.396 + >>> m.contact[0].organization + 'Grundbuch- und Vermessungsamt' + >>> m.contact[0].streetname + 'Aabachstrasse' + >>> m.contact[0].streetnumber + '5' + >>> m.contact[0].postbox + '857' + >>> [link.url for link in m.distribution.online] + ['http://www.zugmap.ch/?link=gewaesserschutzkarte'] diff -Nru owslib-0.16.0/tests/_broken/doctests/sos_10_ndbc_getobservation.txt owslib-0.18.0/tests/_broken/doctests/sos_10_ndbc_getobservation.txt --- owslib-0.16.0/tests/_broken/doctests/sos_10_ndbc_getobservation.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests/sos_10_ndbc_getobservation.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,60 @@ +Imports + + >>> from __future__ import (absolute_import, division, print_function) + >>> from tests.utils import resource_file + >>> from owslib.sos import SensorObservationService + >>> from owslib.ows import OperationsMetadata + >>> from owslib.fes import FilterCapabilities + >>> from owslib.crs import Crs + >>> from datetime import datetime + + +Initialize + + >>> xml = open(resource_file('sos_ndbc_getcapabilities.xml'),'rb').read() + >>> ndbc = SensorObservationService(None, xml=xml) + + +GetObservation + + # Send a funky eventTime + + >>> off = ndbc.offerings[1] + >>> offerings = [off.name] + >>> responseFormat = off.response_formats[0] + >>> observedProperties = [off.observed_properties[0]] + >>> #observedProperties = [ndbc.get_operation_by_name('GetObservation').parameters['observedProperty']['values'][0]] + >>> eventTime = "This is not a valid eventTime!" + >>> response = ndbc.get_observation(offerings=offerings, responseFormat=responseFormat, observedProperties=observedProperties, eventTime=eventTime) #doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + File "", line 1, in + ServiceException: 'This is not a valid eventTime!' + + # NDBC only supports one offering and one observedProperty at a time + + >>> off = ndbc.offerings[1] + >>> offerings = [off.name] + >>> responseFormat = off.response_formats[0] + >>> observedProperties = [off.observed_properties[0]] + >>> #observedProperties = [ndbc.get_operation_by_name('GetObservation').parameters['observedProperty']['values'][0]] + >>> eventTime = None + + >>> response = ndbc.get_observation(offerings=offerings, responseFormat=responseFormat, observedProperties=observedProperties, eventTime=eventTime) + + +DescribeSensor + + # Send a funky procedure + + >>> procedure = "foobar" + >>> outputFormat = ndbc.get_operation_by_name('DescribeSensor').parameters['outputFormat']['values'][0] + >>> response = ndbc.describe_sensor(procedure=procedure, outputFormat=outputFormat) #doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + File "", line 1, in + ServiceException: 'foobar' + + # Valid request + + >>> procedure = ndbc.offerings[1].procedures[0] + >>> outputFormat = ndbc.get_operation_by_name('DescribeSensor').parameters['outputFormat']['values'][0] + >>> response = ndbc.describe_sensor(procedure=procedure, outputFormat=outputFormat) diff -Nru owslib-0.16.0/tests/_broken/doctests/tms.txt owslib-0.18.0/tests/_broken/doctests/tms.txt --- owslib-0.16.0/tests/_broken/doctests/tms.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests/tms.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,112 @@ +Imports + + >>> from __future__ import (absolute_import, division, print_function, unicode_literals) + >>> from owslib import tms + +You can find a list of servers at +http://svn.osgeo.org/gdal/trunk/gdal/frmts/wms/WMSServerList.txt + +Find out what a TMS has to offer. Service metadata: + + >>> service = tms.TileMapService('http://odims.ospar.org/geoserver/gwc/service/tms/1.0.0', timeout=120) + >>> service.identification.title + 'Tile Map Service' + >>> service.identification.abstract + 'A Tile Map Service served by GeoWebCache' + >>> service.identification.keywords + [] + >>> service.identification.version + '1.0.0' + >>> service.identification.url + 'https://odims.ospar.org/geoserver/gwc/' + >>> len(service.contents) > 0 + True + >>> tm = service.contents['http://odims.ospar.org/geoserver/gwc/service/tms/1.0.0/geonode%3Aospar_offshore_renewables_2010_01@EPSG%3A4326@png'] + >>> tm.title + 'ospar_offshore_renewables_2010_01' + +you can filter the contents by profile and srs: + >>> len(service.items()) + 664 + >>> len(service.items('EPSG:900913')) + 332 + >>> len(service.items(profile='global-mercator')) + 332 + >>> len(service.items('EPSG:900913', profile='global-mercator')) + 332 + >>> len(service.items('EPSG:4326', profile='global-mercator')) + 0 + >>> sorted(service.items('EPSG:4326'))[0] # doctest: +ELLIPSIS + ('http://odims.ospar.org/geoserver/gwc/service/tms/1.0.0/geonode%3AMarine_protected_area__OSPAR____Global_view__polygon_@EPSG%3A4326@gif', ) + +The details of the TileMap are fetched on demand + >>> tm._tile_map == None + True + >>> tm.title + 'ospar_offshore_renewables_2010_01' + >>> tm.abstract + >>> tm._tile_map == None + False + >>> tm.srs + 'EPSG:4326' + >>> tm.extension + 'png' + >>> tm.height + 256 + >>> tm.width + 256 + >>> tm.mimetype + 'image/png' + >>> tm.boundingBox + (-180.0, -90.0, 180.0, 90.0) + >>> tm.origin + (-180.0, -90.0) + + + + +You can get tiles by their x,y,z indices, the title of the tilemap, projection and mime-type + >>> service.gettile(10,10,0, title='bluemarble', srs='EPSG:4326', mimetype='image/png').geturl() #doctest: +SKIP + 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/bluemarble@EPSG%3A4326@png/0/10/10.png' + >>> service.gettile(10,10,1, title='bluemarble', srs='EPSG:4326', mimetype='image/jpeg').geturl() #doctest: +SKIP + 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/bluemarble@EPSG%3A4326@jpeg/1/10/10.jpeg' + +if mimetype is ommited the tile is fetched from the first TileMap found: + >>> service.gettile(10,10,1, title='bluemarble', srs='EPSG:900913').geturl() #doctest: +SKIP + 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/bluemarble@EPSG%3A900913@jpeg/1/10/10.jpeg' + +You can also specify the Tilemap by id: + >>> service.gettile(10,10,0, 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/bluemarble@EPSG%3A900913@jpeg').geturl() #doctest: +SKIP + 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/bluemarble@EPSG%3A900913@jpeg/0/10/10.jpeg' + +An extensive test with: + >>> servers = [ + ... 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0', + ... 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0', + ... 'http://osm.omniscale.net/proxy/tms/1.0.0', + ... 'http://apps.esdi-humboldt.cz/mapproxy/tms/1.0.0', + ... 'http://apps.esdi-humboldt.cz/cgi-bin/tilecache/tilecache.cgi/1.0.0', + ... # 'http://tilecache.osgeo.org/wms-c/tilecache.py/1.0.0/', + ... 'http://tileserver.maptiler.com/tms', + ... ] + +# uncomment if you want to test all of the above +# >>> for server in servers: +# ... service = tms.TileMapService(server) +# ... service.identification.title +# ... service.identification.version +# ... len(service.items()) +# ... len(service.items('EPSG:900913')) +# ... len(service.items(profile='global-mercator')) +# ... len(service.items('EPSG:4326')) +# ... for tm in service.contents.values(): +# ... tm.title +# ... tm._tile_map == None +# ... tm.abstract +# ... tm._tile_map +# ... tm.srs +# ... tm.mimetype +# ... tm.extension +# ... tm.boundingBox +# ... tm.origin +# ... tm.type diff -Nru owslib-0.16.0/tests/_broken/doctests/wfs2_generic.txt owslib-0.18.0/tests/_broken/doctests/wfs2_generic.txt --- owslib-0.16.0/tests/_broken/doctests/wfs2_generic.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests/wfs2_generic.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,52 @@ +Imports and initialize + + >>> from __future__ import (absolute_import, division, print_function) + >>> from owslib.wfs import WebFeatureService + >>> from tests.utils import resource_file, sorted_url_query + + >>> getcapsin = open(resource_file("wfs_CUZK_GetCapabilities_2_0_0.xml"), 'rb').read() + >>> wfs = WebFeatureService('http://services.cuzk.cz/wfs/inspire-cp-wfs.asp', xml=getcapsin, version='2.0.0') + +Test the capabilities info + >>> wfs.identification.service + 'OGC WFS' + >>> wfs.identification.version + '2.0.0' + >>> wfs.identification.title + 'CZE INSPIRE Download Service - Cadastral Parcels' + >>> wfs.identification.abstract + 'Cadastral Parcels - INSPIRE themes' + >>> sorted(wfs.identification.keywords) + ['Cadastral Parcel Boundaries', 'Cadastral Zoning polygons', 'Cadastral parcel polygons'] + >>> wfs.identification.fees + >>> wfs.identification.accessconstraints + >>> wfs.provider.name + 'Czech Office for Surveying, Mapping and Cadastre' + >>> wfs.provider.url + 'www.cuzk.cz' + >>> wfs.provider.contact.email + >>> wfs.provider.contact.phone + '+420284041550' + >>> wfs.provider.contact.name + >>> wfs.provider.contact.organization + >>> wfs.provider.contact.city + >>> wfs.provider.contact.region + >>> wfs.provider.contact.postcode + >>> wfs.provider.contact.country + +Test the getfeature method + + >>> sorted(wfs.contents.keys()) + ['CP:CadastralBoundary', 'CP:CadastralParcel', 'CP:CadastralZoning'] + + >>> wfs.contents['CP:CadastralBoundary'].crsOptions[0].getcodeurn() + 'urn:ogc:def:crs:EPSG::102067' + + >>> sorted_url_query(wfs.getGETGetFeatureRequest(typename=['CP:CadastralBoundary'], maxfeatures=2)) + ['maxfeatures=2', 'request=GetFeature', 'service=WFS', 'typename=CP%3ACadastralBoundary', 'version=2.0.0'] + + >>> sorted_url_query(wfs.getGETGetFeatureRequest(typename=['CP:CadastralBoundary'], maxfeatures=2, bbox=[15,49,16,51,'urn:ogc:def:crs:EPSG:4326'])) + ['bbox=49%2C15%2C51%2C16%2Curn%3Aogc%3Adef%3Acrs%3AEPSG%3A%3A4326', 'maxfeatures=2', 'request=GetFeature', 'service=WFS', 'typename=CP%3ACadastralBoundary', 'version=2.0.0'] + + >>> sorted_url_query(wfs.getGETGetFeatureRequest(typename=['CP:CadastralBoundary'], maxfeatures=2, bbox=[-685336,-993518,-684996,-993285])) + ['bbox=-685336%2C-993518%2C-684996%2C-993285%2Curn%3Aogc%3Adef%3Acrs%3AEPSG%3A%3A102067', 'maxfeatures=2', 'request=GetFeature', 'service=WFS', 'typename=CP%3ACadastralBoundary', 'version=2.0.0'] diff -Nru owslib-0.16.0/tests/_broken/doctests/wmts_SFSWorldWMTSCapabilities.txt owslib-0.18.0/tests/_broken/doctests/wmts_SFSWorldWMTSCapabilities.txt --- owslib-0.16.0/tests/_broken/doctests/wmts_SFSWorldWMTSCapabilities.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests/wmts_SFSWorldWMTSCapabilities.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,240 @@ + +Imports + + >>> from __future__ import (absolute_import, division, print_function) + >>> from tests.utils import cast_tuple_int_list, resource_file + >>> from owslib.wmts import WebMapTileService + +Fake a request to a WMTS Server using saved doc from +http://server.caris.com/spatialfusionserver/services/ows/wmts/World/1.0.0/WMTSCapabilities.xml + + >>> xml = open(resource_file('sfs-wmts-cap-world.xml'), 'rb').read() + >>> wmts = WebMapTileService('url', version='1.0.0', xml=xml) + +Test capabilities +----------------- + >>> wmts.identification.type + 'WMTS' + >>> wmts.identification.version + '1.0.0' + >>> wmts.identification.title + + >>> wmts.identification.abstract + + >>> wmts.identification.keywords + [] + >>> wmts.identification.accessconstraints + 'None' + >>> wmts.identification.fees + 'conditions unknown' + +Test service metadata URL (RESTful API) + >>> wmts.serviceMetadataURL + 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World/1.0.0/WMTSCapabilities.xml' + +Service Provider: + + >>> wmts.provider.name + 'CARIS' + + >>> wmts.provider.url + +Check contact info + >>> wmts.provider.contact.name + 'Andy Hoggarth' + >>> wmts.provider.contact.position + 'Marketing & Sales Manager' + >>> wmts.provider.contact.phone + '1 (506) 459-3849' + >>> wmts.provider.contact.address + '115 Waggoners Lane' + >>> wmts.provider.contact.region + 'New Brunswick' + >>> wmts.provider.contact.email + 'info@caris.com' + >>> wmts.provider.contact.city + 'Fredericton' + >>> wmts.provider.contact.postcode + 'E3B 2L4' + >>> wmts.provider.contact.country + 'Canada' + +Test available content layers + + >>> sorted(list(wmts.contents)) + ['Ocean', 'World'] + +Test TileMatrixSet variants + + >>> sorted(wmts.tilematrixsets.keys()) + ['GlobalCRS84Scale', 'GoogleMapsCompatible'] + >>> wmts.tilematrixsets['GoogleMapsCompatible'].identifier + 'GoogleMapsCompatible' + >>> wmts.tilematrixsets['GoogleMapsCompatible'].crs + 'urn:ogc:def:crs:EPSG:6.18:3:3857' + >>> sorted(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix.keys()) + ['0', '1', '10', '11', '12', '13', '14', '15', '16', '17', '2', '3', '4', '5', '6', '7', '8', '9'] + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].identifier + '0' + >>> int(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].scaledenominator) + 559082264 + >>> cast_tuple_int_list(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].topleftcorner) + [-20037508, -20037508] + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].tilewidth + 256 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].tileheight + 256 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].matrixwidth + 1 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].matrixheight + 1 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].identifier + '17' + >>> int(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].scaledenominator) + 4265 + >>> cast_tuple_int_list(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].topleftcorner) + [-20037508, -20037508] + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].tilewidth + 256 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].tileheight + 256 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].matrixwidth + 131072 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].matrixheight + 131072 + + >>> wmts.tilematrixsets['GlobalCRS84Scale'].identifier + 'GlobalCRS84Scale' + >>> wmts.tilematrixsets['GlobalCRS84Scale'].crs + 'urn:ogc:def:crs:OGC:1.3:CRS84' + >>> sorted(wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix.keys()) + ['0', '1', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2', '20', '3', '4', '5', '6', '7', '8', '9'] + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].identifier + '0' + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].scaledenominator + 500000000.0 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].topleftcorner + (90.0, -180.0) + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].tilewidth + 256 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].tileheight + 256 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].matrixwidth + 2 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].matrixheight + 1 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].identifier + '20' + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].scaledenominator + 100.0 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].topleftcorner + (90.0, -180.0) + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].tilewidth + 256 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].tileheight + 256 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].matrixwidth + 2097152 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].matrixheight + 1048576 + +Test single item accessor + + >>> wmts['World'].title + 'World' + >>> cast_tuple_int_list(wmts['World'].boundingBoxWGS84) + [-179, -90, 179, 83] + >>> wmts['World'].id + 'World' + >>> wmts['World'].styles + {'default': {'isDefault': True}} + >>> wmts['World'].formats + ['image/png'] + >>> sorted(wmts['World'].tilematrixsets) + ['GlobalCRS84Scale', 'GoogleMapsCompatible'] + >>> sorted(wmts['World'].tilematrixsetlinks.keys()) + ['GlobalCRS84Scale', 'GoogleMapsCompatible'] + >>> wmts['World'].infoformats + ['application/gml+xml; version=3.1'] + >>> wmts['World'].resourceURLs[0] == {'resourceType': 'tile', 'template': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World/World/default/{tileMatrixSet}/{tileMatrix}/{tileRow}/{tileCol}.png', 'format': 'image/png'} + True + >>> wmts['World'].resourceURLs[1] == {'resourceType': 'FeatureInfo', 'template': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World/World/default/{tileMatrixSet}/{tileMatrix}/{tileRow}/{tileCol}/{j}/{i}.xml', 'format': 'application/gml+xml; version=3.1'} + True + + >>> wmts['Ocean'].title + 'Ocean' + >>> cast_tuple_int_list(wmts['Ocean'].boundingBoxWGS84) + [-179, -85, 179, 89] + >>> wmts['Ocean'].id + 'Ocean' + >>> wmts['Ocean'].styles + {'default': {'isDefault': True}} + >>> wmts['Ocean'].formats + ['image/png'] + >>> sorted(wmts['Ocean'].tilematrixsets) + ['GlobalCRS84Scale', 'GoogleMapsCompatible'] + >>> sorted(wmts['Ocean'].tilematrixsetlinks.keys()) + ['GlobalCRS84Scale', 'GoogleMapsCompatible'] + >>> wmts['Ocean'].infoformats + ['application/gml+xml; version=3.1'] + >>> wmts['Ocean'].resourceURLs[0] == {'resourceType': 'tile', 'template': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World/Ocean/default/{tileMatrixSet}/{tileMatrix}/{tileRow}/{tileCol}.png', 'format': 'image/png'} + True + >>> wmts['Ocean'].resourceURLs[1] == {'resourceType': 'FeatureInfo', 'template': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World/Ocean/default/{tileMatrixSet}/{tileMatrix}/{tileRow}/{tileCol}/{j}/{i}.xml', 'format': 'application/gml+xml; version=3.1'} + True + +Test themes + >>> list(wmts.themes.keys()) + ['Earth'] + >>> wmts.themes['Earth'].title + 'Earth' + >>> wmts.themes['Earth'].identifier + 'Earth' + >>> wmts.themes['Earth'].abstract + + >>> sorted(wmts.themes['Earth'].layerRefs) + ['Ocean', 'World'] + + + +Expect a KeyError for invalid names + + >>> wmts['utterly bogus'].title + Traceback (most recent call last): + ... + KeyError: 'No content named utterly bogus' + +Test operations + + >>> sorted([op.name for op in wmts.operations]) + ['GetCapabilities', 'GetFeatureInfo', 'GetTile'] + + >>> x = wmts.getOperationByName('GetFeatureInfo').methods + >>> x == [{'type': 'Get', 'url': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World', 'constraints': []}] + True + + >>> x = wmts.getOperationByName('GetTile').methods + >>> x == [{'type' : 'Get', 'url': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World', 'constraints': []}] + True + + >>> x = wmts.getOperationByName('GetCapabilities').methods + >>> x == [{'type' : 'Get', 'url': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World', 'constraints': []}] + True + + +Test the gettile methods + >>> try: + ... from io import BytesIO as ImageIO + ... except ImportError: + ... from cStringIO import StringIO as ImageIO + >>> try: + ... from PIL import Image + ... except: + ... pass + ... else: + ... rq = wmts.buildTileRequest(layer='World', tilematrix='0', row=0, column=0) + ... assert rq == 'SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=World&STYLE=default&TILEMATRIXSET=GlobalCRS84Scale&TILEMATRIX=0&TILEROW=0&TILECOL=0&FORMAT=image%2Fpng' + ... tile000 = wmts.gettile(layer='World', tilematrix='0', row=0, column=0) + ... im = ImageIO(tile000.read()) + ... image = Image.open(im) + ... assert image.size == (256, 256) + diff -Nru owslib-0.16.0/tests/_broken/doctests_py3/wcs_nsidc.txt owslib-0.18.0/tests/_broken/doctests_py3/wcs_nsidc.txt --- owslib-0.16.0/tests/_broken/doctests_py3/wcs_nsidc.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests_py3/wcs_nsidc.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,67 @@ +Web Coverage Service: #This is an example that shows how to the OWSLib wcs client to make requests from the NSIDC WCS. +==================== + +Version 1.1.0 +======== + +Imports + + >>> from __future__ import (absolute_import, division, print_function) + >>> from owslib.wcs import WebCoverageService + >>> from tests.utils import resource_file, scratch_file + + >>> xml = open(resource_file('wcs_nsidc.xml')).read() + >>> wcs=WebCoverageService('http://nsidc.org/cgi-bin/atlas_north', version='1.1.0', xml=xml) + >>> wcs.url + 'http://nsidc.org/cgi-bin/atlas_north' + >>> wcs.version + '1.1.0' + >>> wcs.identification.service + 'WCS' + >>> wcs.identification.version + '1.1.0' + >>> wcs.identification.type + 'OGC WCS' + >>> wcs.identification.title + 'Atlas of the Cryosphere: Northern Hemisphere' + >>> wcs.identification.abstract + "The National Snow and Ice Data Center (NSIDC) Atlas of the Cryosphere is a map server that provides data and information pertinent to the frozen regions of Earth, including monthly climatologies of sea ice extent and concentration, snow cover extent, and snow water equivalent, in addition to glacier outlines, permafrost extent and classification, ice sheet elevation and accumulation, and more. In order to support polar projections, the Atlas is divided into two separate map servers: one for the Northern Hemisphere and one for the Southern Hemisphere. In addition to providing map images and source data through Open Geospatial Consortium, Inc. (OGC) protocols (WMS, WFS, and WCS), a dynamic web interface for exploring these data is also available at http://nsidc.org/data/atlas. If you have questions, comments or suggestions, please contact NSIDC User Services at +1.303.492.6199 or nsidc@nsidc.org. The development of this map server application was supported by NASA's Earth Observing System (EOS) Program under contract NAS5-03099 and was developed using MapServer, an Open Source development environment for building spatially-enabled internet applications. To cite the Atlas of the Cryosphere: Maurer, J. 2007. Atlas of the Cryosphere. Boulder, Colorado USA: National Snow and Ice Data Center. Digital media. Available at http://nsidc.org/data/atlas/." + >>> wcs.identification.keywords + ['Arctic', 'Cryosphere', 'Earth Science', 'Ice Extent', 'Ice Sheets', 'Northern Hemisphere', 'Oceans', 'Polar', 'Sea Ice', 'Sea Ice Concentration', 'Snow/Ice', 'Snow Cover', 'Snow Melt', 'Snow Water Equivalent'] + >>> wcs.identification.fees + 'none' + >>> wcs.identification.accessConstraints + 'none' + +#There is no 'ResponsibleParty' information in the NCEP/NAM capabilities document, so wcs.provider is empty. +#but if there was you could do: +#wcs.provider.url +#and.. +#wcs.provider.contact.organization +#wcs.provider.contact.email +#wcs.provider.contact.address +#etc... for region, city, postcode, country + +Print the ids of all layers (actually just the first 3): + >>> sorted(wcs.contents.keys()) + ['greenland_accumulation', 'greenland_bedrock_elevation', 'greenland_elevation', 'greenland_ice_thickness', 'greenland_surface_melt', 'sea_ice_concentration_01', 'sea_ice_concentration_02', 'sea_ice_concentration_03', 'sea_ice_concentration_04', 'sea_ice_concentration_05', 'sea_ice_concentration_06', 'sea_ice_concentration_07', 'sea_ice_concentration_08', 'sea_ice_concentration_09', 'sea_ice_concentration_10', 'sea_ice_concentration_11', 'sea_ice_concentration_12', 'seasonal_snow_classification', 'snow_extent_01', 'snow_extent_02', 'snow_extent_03', 'snow_extent_04', 'snow_extent_05', 'snow_extent_06', 'snow_extent_07', 'snow_extent_08', 'snow_extent_09', 'snow_extent_10', 'snow_extent_11', 'snow_extent_12', 'snow_water_equivalent_01', 'snow_water_equivalent_02', 'snow_water_equivalent_03', 'snow_water_equivalent_04', 'snow_water_equivalent_05', 'snow_water_equivalent_06', 'snow_water_equivalent_07', 'snow_water_equivalent_08', 'snow_water_equivalent_09', 'snow_water_equivalent_10', 'snow_water_equivalent_11', 'snow_water_equivalent_12'] + + +#To further interrogate a single "coverage" get the coverageMetadata object +#You can either do: + >>> cvg= wcs.contents['sea_ice_concentration_09'] #to get it from the dictonary + +#or even simpler you can do: + >>> cvg=wcs['sea_ice_concentration_09'] + + >>> cvg.boundingBoxWGS84 + (-179.999998745864, 34.9037152643753, 178.959571606408, 53.7717181062498) + + >>> len(cvg.timepositions)>1 #The old test kept failing as the response timepositions kept changign on the server + False + + >>> [y for y in (x.getcode() for x in cvg.supportedCRS) if y] + ['EPSG:32661', 'EPSG:4326', 'EPSG:3408', 'EPSG:3410', 'EPSG:3411', 'EPSG:3413', 'EPSG:3571', 'EPSG:3572', 'EPSG:3573', 'EPSG:3574', 'EPSG:3575', 'EPSG:3576', 'EPSG:3973', 'EPSG:3975', 'EPSG:32624', 'EPSG:3857', 'EPSG:900913'] + + >>> cvg.supportedFormats + ['image/tiff'] diff -Nru owslib-0.16.0/tests/_broken/doctests_py3/wfs_USDASSURGO.txt owslib-0.18.0/tests/_broken/doctests_py3/wfs_USDASSURGO.txt --- owslib-0.16.0/tests/_broken/doctests_py3/wfs_USDASSURGO.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests_py3/wfs_USDASSURGO.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,10 @@ +# Test ability of OWSLib.wfs to interact with USDA SSURGO WFS 1.0.0 web service +# Contact e-mail: selimnairb@gmail.com + +>>> from __future__ import (absolute_import, division, print_function) +>>> from owslib.wfs import WebFeatureService +>>> wfs_filter = "Geometry -76.766960,39.283611 -76.684120,39.338394 " +>>> wfs = WebFeatureService('http://SDMDataAccess.nrcs.usda.gov/Spatial/SDMWGS84Geographic.wfs', version='1.1.0', timeout=360) +>>> response = wfs.getfeature(typename='mapunitpolyextended', filter=wfs_filter, propertyname=None) +>>> response.read().find(' 0 +True diff -Nru owslib-0.16.0/tests/_broken/doctests_py3/wms_getfeatureinfo.txt owslib-0.18.0/tests/_broken/doctests_py3/wms_getfeatureinfo.txt --- owslib-0.16.0/tests/_broken/doctests_py3/wms_getfeatureinfo.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests_py3/wms_getfeatureinfo.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,26 @@ +>>> from owslib.wms import WebMapService +>>> wms = WebMapService('http://geoserv.weichand.de:8080/geoserver/wms') + +>>> res1 = wms.getfeatureinfo(layers=['bvv:lkr_ex'], srs='EPSG:31468', bbox=(4500000,5500000,4500500,5500500), size=(500,500), format='image/jpeg', info_format="text/html", xy=(250,250)) +>>> html_string1 = res1.read().decode("utf-8") +>>> ('lkr_ex' in html_string1) +True +>>> ('gmd_ex' in html_string1) +False + +>>> res2 = wms.getfeatureinfo(layers=['bvv:lkr_ex','bvv:gmd_ex'], srs='EPSG:31468', bbox=(4500000,5500000,4500500,5500500), size=(500,500), format='image/jpeg', info_format="text/html", xy=(250,250)) +>>> html_string2 = res2.read().decode("utf-8") +>>> ('lkr_ex' in html_string2) +True +>>> ('gmd_ex' in html_string2) +True + +>>> res3 = wms.getfeatureinfo(layers=['bvv:lkr_ex','bvv:gmd_ex'], srs='EPSG:31468', bbox=(4500000,5500000,4500500,5500500), size=(500,500), format='image/jpeg', query_layers=['bvv:lkr_ex'], info_format="text/html", xy=(250,250)) +>>> wms.request +'http://geoserv.weichand.de:8080/geoserver/wms?SERVICE=WMS&layers=bvv%3Alkr_ex%2Cbvv%3Agmd_ex&styles=&feature_count=20&y=250&query_layers=bvv%3Alkr_ex&service=WMS&srs=EPSG%3A31468&format=image%2Fjpeg&request=GetFeatureInfo&bgcolor=0xFFFFFF&height=500&width=500&version=1.1.1&bbox=4500000%2C5500000%2C4500500%2C5500500&kwargs=%7B%7D&exceptions=application%2Fvnd.ogc.se_xml&x=250&info_format=text%2Fhtml&transparent=FALSE' +>>> html_string3 = res3.read().decode("utf-8") +>>> ('lkr_ex' in html_string3) +True +>>> ('gmd_ex' in html_string3) +False + diff -Nru owslib-0.16.0/tests/_broken/doctests_py3/wmts_geoserver21.txt owslib-0.18.0/tests/_broken/doctests_py3/wmts_geoserver21.txt --- owslib-0.16.0/tests/_broken/doctests_py3/wmts_geoserver21.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests_py3/wmts_geoserver21.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,164 @@ + +Imports + + >>> from __future__ import (absolute_import, division, print_function) + >>> from tests.utils import cast_tuple_int_list, resource_file + >>> from owslib.wmts import WebMapTileService + +Fake a request to a WMTS Server using saved doc from +http://geonode.iwlearn.org/geoserver/gwc/service/wmts?REQUEST=GetCapabilities + + >>> xml = open(resource_file('geoserver21-wmts-cap.xml'), 'rb').read() + >>> wmts = WebMapTileService('url', version='1.0.0', xml=xml) + +Test capabilities +----------------- + >>> wmts.identification.type + 'OGC WMTS' + >>> wmts.identification.version + '1.0.0' + >>> wmts.identification.title + 'Web Map Tile Service - GeoWebCache' + >>> wmts.identification.abstract + + >>> wmts.identification.keywords + [] + >>> wmts.identification.accessconstraints + + >>> wmts.identification.fees + + >>> wmts.restonly + False + +Service Provider: + + >>> wmts.provider.name + 'http://geonode.iwlearn.org/geoserver/gwc/service/wmts' + >>> wmts.provider.url + 'http://geonode.iwlearn.org/geoserver/gwc/service/wmts' + +Check contact info + >>> wmts.provider.contact.name + 'GeoWebCache User' + >>> wmts.provider.contact.position + + +Test available content layers + >>> sorted(list(wmts.contents)) + ['geonode:Basins', 'geonode:ContinentalMargins', 'geonode:Diktas_Project_Area_1', 'geonode:FEOWv1_TNC', 'geonode:GH_Anidamiento_de_Tortugas_Marinas4326', 'geonode:GH_Anidamiento_de_aves4326', 'geonode:GH_Areas_Protegidas4326', 'geonode:GH_Arrecifes_Coralinos4326', 'geonode:GH_Blanqueamiento_Corales4326', 'geonode:GH_Departamentos4326', 'geonode:GH_Descargas4326', 'geonode:GH_Descargas_2007_4326', 'geonode:GH_Desove_Peces4326', 'geonode:GH_Distribucion_de_Manati4326', 'geonode:GH_Est_muestreo4326', 'geonode:GH_Est_muestreo_propuestas4326', 'geonode:GH_Estuarios_y_Lagunas4326', 'geonode:GH_Limites_Administrativos_Pol4326', 'geonode:GH_Manglares4326', 'geonode:GH_Otras_enfermedades_Corales4326', 'geonode:GH_Paises_Pol4326', 'geonode:GH_Paises_Region_Pol4326', 'geonode:GH_Pastos_Marinos4326', 'geonode:GH_Playas_arenosas4326', 'geonode:GH_Sitios_Prioritarios_TNC4326', 'geonode:GH_Usos_suelo_SOTERLAC4326', 'geonode:GH_ecosistemas_terrestres4326', 'geonode:GIS_OTHER_VEC_CASP_OIL_PNT', 'geonode:GIS_OTHER_VEC_CASP_PIPELIN', 'geonode:GIS_OTHER_VEC_ISOLINES', 'geonode:LMEs_64', 'geonode:Longhurst_world_v4_2010', 'geonode:MANGROVES', 'geonode:SEAGRASSES', 'geonode:TB_Aquifers_New', 'geonode:World_Fao_Zones', 'geonode:World_Maritime_Boundaries_v6_1_20110512', 'geonode:World_Seas', 'geonode:XYDjibouti', 'geonode:XYSudan', 'geonode:XYYemen', 'geonode:abc1', 'geonode:abril', 'geonode:area_de_estudio_1', 'geonode:asfalto', 'geonode:bcp_wgs84_0511', 'geonode:giwa_lme', 'geonode:glwd_1', 'geonode:hotspots_revisited_2004_polygons', 'geonode:igrac_tba_WL_201105_projected', 'geonode:mapa_geologico4326', 'geonode:mapa_geologico_fallas4326', 'geonode:mapa_geologico_provincias4326', 'geonode:meow_ecos', 'geonode:red_hidrografica', 'geonode:seaVoX_sea_area_polygons', 'geonode:undersea_features_2008', 'geonode:wribasin'] + +Test TileMatrixSet variants + >>> sorted(wmts.tilematrixsets.keys()) + ['EPSG:4326', 'EPSG:900913', 'GlobalCRS84Pixel', 'GlobalCRS84Scale', 'GoogleCRS84Quad', 'GoogleMapsCompatible'] + >>> wmts.tilematrixsets['GoogleMapsCompatible'].identifier + 'GoogleMapsCompatible' + >>> wmts.tilematrixsets['GoogleMapsCompatible'].crs + 'urn:ogc:def:crs:EPSG::900913' + >>> sorted(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix.keys()) + ['GoogleMapsCompatible:0', 'GoogleMapsCompatible:1', 'GoogleMapsCompatible:10', 'GoogleMapsCompatible:11', 'GoogleMapsCompatible:12', 'GoogleMapsCompatible:13', 'GoogleMapsCompatible:14', 'GoogleMapsCompatible:15', 'GoogleMapsCompatible:16', 'GoogleMapsCompatible:17', 'GoogleMapsCompatible:18', 'GoogleMapsCompatible:19', 'GoogleMapsCompatible:2', 'GoogleMapsCompatible:20', 'GoogleMapsCompatible:3', 'GoogleMapsCompatible:4', 'GoogleMapsCompatible:5', 'GoogleMapsCompatible:6', 'GoogleMapsCompatible:7', 'GoogleMapsCompatible:8', 'GoogleMapsCompatible:9'] + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].identifier + 'GoogleMapsCompatible:0' + >>> int(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].scaledenominator) + 559082264 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].topleftcorner + (-20037508.34, 20037508.0) + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].tilewidth + 256 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].tileheight + 256 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].matrixwidth + 1 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].matrixheight + 1 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].identifier + 'GoogleMapsCompatible:17' + >>> int(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].scaledenominator) + 4265 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].topleftcorner + (-20037508.34, 20037508.0) + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].tilewidth + 256 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].tileheight + 256 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].matrixwidth + 131072 + >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].matrixheight + 131072 + + >>> wmts.tilematrixsets['GlobalCRS84Scale'].identifier + 'GlobalCRS84Scale' + >>> wmts.tilematrixsets['GlobalCRS84Scale'].crs + 'urn:ogc:def:crs:EPSG::4326' + >>> sorted(wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix.keys()) + ['GlobalCRS84Scale:0', 'GlobalCRS84Scale:1', 'GlobalCRS84Scale:10', 'GlobalCRS84Scale:11', 'GlobalCRS84Scale:12', 'GlobalCRS84Scale:13', 'GlobalCRS84Scale:14', 'GlobalCRS84Scale:15', 'GlobalCRS84Scale:16', 'GlobalCRS84Scale:17', 'GlobalCRS84Scale:18', 'GlobalCRS84Scale:19', 'GlobalCRS84Scale:2', 'GlobalCRS84Scale:20', 'GlobalCRS84Scale:3', 'GlobalCRS84Scale:4', 'GlobalCRS84Scale:5', 'GlobalCRS84Scale:6', 'GlobalCRS84Scale:7', 'GlobalCRS84Scale:8', 'GlobalCRS84Scale:9'] + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].identifier + 'GlobalCRS84Scale:0' + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].scaledenominator + 500000000.0 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].topleftcorner + (90.0, -180.0) + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].tilewidth + 256 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].tileheight + 256 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].matrixwidth + 2 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].matrixheight + 1 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].identifier + 'GlobalCRS84Scale:20' + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].scaledenominator + 100.0 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].topleftcorner + (90.0, -180.0) + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].tilewidth + 256 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].tileheight + 256 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].matrixwidth + 5590823 + >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].matrixheight + 2795412 + +Test single item accessor + + >>> wmts['geonode:GH_Areas_Protegidas4326'].title + 'GOH Areas Protegidas' + >>> cast_tuple_int_list(wmts['geonode:GH_Areas_Protegidas4326'].boundingBoxWGS84) + [-92, 12, -84, 18] + >>> wmts['geonode:GH_Areas_Protegidas4326'].id + 'geonode:GH_Areas_Protegidas4326' + >>> wmts['geonode:GH_Areas_Protegidas4326'].styles + {'GH_Areas_Protegidas4326': {'isDefault': True}} + >>> wmts['geonode:GH_Areas_Protegidas4326'].formats + ['image/png', 'image/jpeg'] + >>> sorted(wmts['geonode:GH_Areas_Protegidas4326'].tilematrixsets) + ['EPSG:4326', 'EPSG:900913'] + >>> sorted(wmts['geonode:GH_Areas_Protegidas4326'].tilematrixsetlinks.keys()) + ['EPSG:4326', 'EPSG:900913'] + >>> wmts['geonode:GH_Areas_Protegidas4326'].tilematrixsetlinks['EPSG:4326'] + + >>> sorted(wmts['geonode:GH_Areas_Protegidas4326'].tilematrixsetlinks['EPSG:4326'].tilematrixlimits.keys()) + ['EPSG:4326:0', 'EPSG:4326:1', 'EPSG:4326:10', 'EPSG:4326:11', 'EPSG:4326:12', 'EPSG:4326:13', 'EPSG:4326:14', 'EPSG:4326:15', 'EPSG:4326:16', 'EPSG:4326:17', 'EPSG:4326:18', 'EPSG:4326:19', 'EPSG:4326:2', 'EPSG:4326:20', 'EPSG:4326:3', 'EPSG:4326:4', 'EPSG:4326:5', 'EPSG:4326:6', 'EPSG:4326:7', 'EPSG:4326:8', 'EPSG:4326:9', 'null'] + >>> wmts['geonode:GH_Areas_Protegidas4326'].tilematrixsetlinks['EPSG:4326'].tilematrixlimits['EPSG:4326:14'] + + >>> wmts['geonode:GH_Areas_Protegidas4326'].infoformats + ['text/plain', 'text/html', 'application/vnd.ogc.gml'] + >>> wmts['geonode:GH_Areas_Protegidas4326'].resourceURLs + [] + +Test several layers styles + >>> wmts.contents['geonode:MANGROVES'].styles + {'MANGROVES': {'isDefault': True}} + >>> wmts.contents['geonode:asfalto'].styles + {'asfalto': {'format': 'image/png', 'legend': 'http://www.maps.bob/etopo2/legend.png', 'isDefault': True, 'title': 'TEST Title: hotspots revisited 2004 polygons'}} + >>> wmts.contents['geonode:hotspots_revisited_2004_polygons'].styles + {'hotspots_revisited_2004_polygons': {'title': 'TEST Title: hotspots revisited 2004 polygons', 'abstract': 'TEST Abstract: hotspots revisited 2004 polygons', 'format': 'image/png', 'height': '100', 'width': '100', 'keywords': ['testkeywords1', 'test keywords 2', 'test keywords 3'], 'legend': 'http://www.maps.bob/etopo2/legend.png', 'isDefault': True}} + >>> wmts.contents['geonode:asfalto'].styles + {'asfalto': {'format': 'image/png', 'legend': 'http://www.maps.bob/etopo2/legend.png', 'isDefault': True, 'title': 'TEST Title: hotspots revisited 2004 polygons'}} + +Test operations + # TODO + +Test the gettile methods + # TODO diff -Nru owslib-0.16.0/tests/_broken/doctests_sphinx/sos_20_52N_demo.txt owslib-0.18.0/tests/_broken/doctests_sphinx/sos_20_52N_demo.txt --- owslib-0.16.0/tests/_broken/doctests_sphinx/sos_20_52N_demo.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests_sphinx/sos_20_52N_demo.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,69 @@ +# 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 + +#'\n\n \n \n \n \n \n 2014-07-10T04:31:58.000Z\n \n \n \n \n \n \n 17.2\n \n \n' +>>> 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 -Nru owslib-0.16.0/tests/_broken/doctests_sphinx/sos_20_timeseries_decoder_ioos.txt owslib-0.18.0/tests/_broken/doctests_sphinx/sos_20_timeseries_decoder_ioos.txt --- owslib-0.16.0/tests/_broken/doctests_sphinx/sos_20_timeseries_decoder_ioos.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests_sphinx/sos_20_timeseries_decoder_ioos.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,63 @@ +# 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) + + +>>> 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]) + + +# 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) + + +>>> len(parsed_response.observations) +20 +>>> type(parsed_response.observations[0]) + +>>> type(parsed_response.observations[0].get_result()) + + +>>> measurement_timeseries = parsed_response.observations[0].get_result() +>>> len(measurement_timeseries) +20 diff -Nru owslib-0.16.0/tests/_broken/doctests_sphinx/wmts_demo.txt owslib-0.18.0/tests/_broken/doctests_sphinx/wmts_demo.txt --- owslib-0.16.0/tests/_broken/doctests_sphinx/wmts_demo.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests_sphinx/wmts_demo.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,53 @@ + +Imports + + >>> from __future__ import (absolute_import, division, print_function) + >>> from tests.utils import scratch_file + +Find out what a WMTS has to offer. Service metadata: + + >>> from owslib.wmts import WebMapTileService + >>> wmts = WebMapTileService("http://map1c.vis.earthdata.nasa.gov/wmts-geo/wmts.cgi") + >>> wmts.identification.type + 'OGC WMTS' + >>> wmts.identification.version + '1.0.0' + >>> wmts.identification.title + 'NASA Global Imagery Browse Services for EOSDIS' + >>> bytearray(wmts.identification.abstract, 'utf-8') + bytearray(b'Near real time imagery from multiple NASA instruments') + >>> wmts.identification.keywords + ['World', 'Global'] + +Service Provider: + + >>> wmts.provider.name + 'National Aeronautics and Space Administration' + + >>> wmts.provider.url + 'https://earthdata.nasa.gov/' + +Available Layers: + + >>> len(wmts.contents.keys()) > 0 + True + >>> sorted(list(wmts.contents))[0] + 'AIRS_CO_Total_Column_Day' + +Fetch a tile (using some defaults): + + >>> tile = wmts.gettile(layer='MODIS_Terra_CorrectedReflectance_TrueColor', tilematrixset='EPSG4326_250m', tilematrix='0', row=0, column=0, format="image/jpeg") + >>> out = open(scratch_file('nasa_modis_terra_truecolour.jpg'), 'wb') + >>> bytes_written = out.write(tile.read()) + >>> out.close() + +Test styles for several layers + >>> wmts.contents['MLS_SO2_147hPa_Night'].styles + {'default': {'isDefault': True, 'title': 'default'}} + >>> wmts.contents['MLS_SO2_147hPa_Night'].styles + {'default': {'isDefault': True, 'title': 'default'}} + + Test a WMTS without a ServiceProvider tag in Capababilities XML + + >>> wmts = WebMapTileService('http://data.geus.dk/arcgis/rest/services/OneGeologyGlobal/S071_G2500_OneGeology/MapServer/WMTS/1.0.0/WMTSCapabilities.xml') + diff -Nru owslib-0.16.0/tests/_broken/doctests_sphinx/wps_example_usgs.txt owslib-0.18.0/tests/_broken/doctests_sphinx/wps_example_usgs.txt --- owslib-0.16.0/tests/_broken/doctests_sphinx/wps_example_usgs.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/_broken/doctests_sphinx/wps_example_usgs.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,166 @@ +Inspect a remote WPS and retrieve the supported processes: + + >>> from owslib.wps import WebProcessingService + >>> wps = WebProcessingService('http://cida.usgs.gov/climate/gdp/process/WebProcessingService', verbose=False, skip_caps=True) + >>> wps.getcapabilities() + >>> wps.identification.type + 'WPS' + >>> wps.identification.title + 'Geo Data Portal WPS Processing' + >>> wps.identification.abstract + 'Geo Data Portal WPS Processing' + >>> for operation in wps.operations: + ... operation.name + ... + 'GetCapabilities' + 'DescribeProcess' + 'Execute' + >>> for process in wps.processes: + ... process.identifier, process.title + ... + ('gov.usgs.cida.gdp.wps.algorithm.FeatureCoverageIntersectionAlgorithm', 'Feature Coverage WCS Intersection') + ('gov.usgs.cida.gdp.wps.algorithm.FeatureCoverageOPeNDAPIntersectionAlgorithm', 'Feature Coverage OPeNDAP Intersection') + ('gov.usgs.cida.gdp.wps.algorithm.FeatureCategoricalGridCoverageAlgorithm', 'Feature Categorical Grid Coverage') + ('gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm', 'Feature Weighted Grid Statistics') + ('gov.usgs.cida.gdp.wps.algorithm.FeatureGridStatisticsAlgorithm', 'Feature Grid Statistics') + ('gov.usgs.cida.gdp.wps.algorithm.PRMSParameterGeneratorAlgorithm', 'PRMS Parameter Generator') + >>> + + +Determine how a specific process needs to be invoked - i.e. what are its input parameters, and output result: + + >>> from owslib.wps import printInputOutput + >>> process = wps.describeprocess('gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm') + >>> process.identifier + 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' + >>> process.title + 'Feature Weighted Grid Statistics' + >>> process.abstract + 'This algorithm generates area weighted statistics of a gridded dataset for a set of vector polygon features. Using the bounding-box that encloses ... + >>> for input in process.dataInputs: + ... printInputOutput(input) + ... + identifier=FEATURE_COLLECTION, title=Feature Collection, abstract=A feature collection encoded as a WFS request or one of the supported GML profiles.,... + Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.0.0/feature.xsd + Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.1/feature.xsd + Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.2/feature.xsd + Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.2.1/feature.xsd + Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.0.0/base/feature.xsd + Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.0.1/base/feature.xsd + Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.1.0/base/feature.xsd + Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.1.1/base/feature.xsd + Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.2.1/base/feature.xsd + Default Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.0.0/feature.xsd + minOccurs=1, maxOccurs=1 + identifier=DATASET_URI, title=Dataset URI, abstract=The base data web service URI for the dataset of interest., data type=anyURI + Allowed Value: AnyValue + Default Value: None + minOccurs=1, maxOccurs=1 + identifier=DATASET_ID, title=Dataset Identifier, abstract=The unique identifier for the data type or variable of interest., data type=string + Allowed Value: AnyValue + Default Value: None + minOccurs=1, maxOccurs=2147483647 + identifier=REQUIRE_FULL_COVERAGE, title=Require Full Coverage, abstract=If turned on, the service will require that the dataset of interest .... + Allowed Value: True + Default Value: True + minOccurs=1, maxOccurs=1 + identifier=TIME_START, title=Time Start, abstract=The date to begin analysis., data type=dateTime + Allowed Value: AnyValue + Default Value: None + minOccurs=0, maxOccurs=1 + identifier=TIME_END, title=Time End, abstract=The date to end analysis., data type=dateTime + Allowed Value: AnyValue + Default Value: None + minOccurs=0, maxOccurs=1 + identifier=FEATURE_ATTRIBUTE_NAME, title=Feature Attribute Name, abstract=The attribute that will be used to label column headers in processing output., ... + Allowed Value: AnyValue + Default Value: None + minOccurs=1, maxOccurs=1 + identifier=DELIMITER, title=Delimiter, abstract=The delimiter that will be used to separate columns in the processing output., data type=string + Allowed Value: COMMA + Allowed Value: TAB + Allowed Value: SPACE + Default Value: COMMA + minOccurs=1, maxOccurs=1 + identifier=STATISTICS, title=Statistics, abstract=Statistics that will be returned for each feature in the processing output., data type=string + Allowed Value: MEAN + Allowed Value: MINIMUM + Allowed Value: MAXIMUM + Allowed Value: VARIANCE + Allowed Value: STD_DEV + Allowed Value: SUM + Allowed Value: COUNT + Default Value: None + minOccurs=1, maxOccurs=7 + identifier=GROUP_BY, title=Group By, abstract=If multiple features and statistics are selected, this will change whether the processing output ... + Allowed Value: STATISTIC + Allowed Value: FEATURE_ATTRIBUTE + Default Value: None + minOccurs=1, maxOccurs=1 + identifier=SUMMARIZE_TIMESTEP, title=Summarize Timestep, abstract=If selected, processing output will include columns with summarized statistics ... + Allowed Value: True + Default Value: True + minOccurs=0, maxOccurs=1 + identifier=SUMMARIZE_FEATURE_ATTRIBUTE, title=Summarize Feature Attribute, abstract=If selected, processing output will include a final row of ... + Allowed Value: True + Default Value: True + minOccurs=0, maxOccurs=1 + >>> for output in process.processOutputs: + ... printInputOutput(output) + ... + identifier=OUTPUT, title=Output File, abstract=A delimited text file containing requested process output., data type=ComplexData + Supported Value: mimeType=text/csv, encoding=UTF-8, schema=None + Default Value: mimeType=text/csv, encoding=UTF-8, schema=None + reference=None, mimeType=None + >>> + +Submit a processing request (extraction of a climate index variable over a specific GML polygon, for a given period of time), monitor the execution until complete: + + >>> from owslib.wps import GMLMultiPolygonFeatureCollection + >>> polygon = [(-102.8184, 39.5273), (-102.8184, 37.418), (-101.2363, 37.418), (-101.2363, 39.5273), (-102.8184, 39.5273)] + >>> featureCollection = GMLMultiPolygonFeatureCollection( [polygon] ) + >>> processid = 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' + >>> inputs = [ ("FEATURE_ATTRIBUTE_NAME","the_geom"), + ... ("DATASET_URI", "dods://cida.usgs.gov/qa/thredds/dodsC/derivatives/derivative-days_above_threshold.pr.ncml"), + ... ("DATASET_ID", "ensemble_b1_pr-days_above_threshold"), + ... ("TIME_START","2010-01-01T00:00:00.000Z"), + ... ("TIME_END","2011-01-01T00:00:00.000Z"), + ... ("REQUIRE_FULL_COVERAGE","false"), + ... ("DELIMITER","COMMA"), + ... ("STATISTICS","MEAN"), + ... ("GROUP_BY","STATISTIC"), + ... ("SUMMARIZE_TIMESTEP","false"), + ... ("SUMMARIZE_FEATURE_ATTRIBUTE","false"), + ... ("FEATURE_COLLECTION", featureCollection) + ... ] + >>> output = "OUTPUT" + >>> execution = wps.execute(processid, inputs, output = "OUTPUT") + Executing WPS request... + Execution status=ProcessStarted + >>> from owslib.wps import monitorExecution + >>> monitorExecution(execution) + Checking execution status... (location=http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=6809217153012787208) + Execution status=ProcessSucceeded + Execution status: ProcessSucceeded + Output URL=http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=6809217153012787208OUTPUT.3cbcd666-a912-456f-84a3-6ede450aca95 + +Alternatively, define the feature through an embedded query to a WFS server: + + >>> from owslib.wps import WFSQuery, WFSFeatureCollection + >>> wfsUrl = "http://cida.usgs.gov/climate/gdp/proxy/http://igsarm-cida-gdp2.er.usgs.gov:8082/geoserver/wfs" + >>> query = WFSQuery("sample:CONUS_States", propertyNames=['the_geom',"STATE"], filters=["CONUS_States.508","CONUS_States.469"]) + >>> featureCollection = WFSFeatureCollection(wfsUrl, query) + >>> # same process submission as above + ... + +You can also submit a pre-made request encoded as WPS XML: + + >>> request = open('/Users/cinquini/Documents/workspace-cog/wps/tests/resources/wps_USGSExecuteRequest1.xml','rb').read() + >>> execution = wps.execute(None, [], request=request) + Executing WPS request... + Execution status=ProcessStarted + >>> monitorExecution(execution) + Checking execution status... (location=http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=5103866488472745994) + Execution status=ProcessSucceeded + Execution status: ProcessSucceeded + Output URL=http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=5103866488472745994OUTPUT.f80e2a78-96a9-4343-9777-be60fac5b256 diff -Nru owslib-0.16.0/tests/doctests/csw_geoserver.txt owslib-0.18.0/tests/doctests/csw_geoserver.txt --- owslib-0.16.0/tests/doctests/csw_geoserver.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/csw_geoserver.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ ->>> from __future__ import (absolute_import, division, print_function) ->>> from owslib.csw import CatalogueServiceWeb ->>> c=CatalogueServiceWeb('http://gis.armf.bg:8080/geoserver/csw') ->>> c.getrecords2(typenames='csw:Record') ->>> c.results.get('returned') > 0 -True ->>> c.results.get('nextrecord') > 0 -True ->>> c.results.get('matches') > 0 -True diff -Nru owslib-0.16.0/tests/doctests/csw_linz.txt owslib-0.18.0/tests/doctests/csw_linz.txt --- owslib-0.16.0/tests/doctests/csw_linz.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/csw_linz.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from owslib import fes - >>> from owslib.dif import namespaces - >>> from owslib.csw import CatalogueServiceWeb as cs - >>> from owslib.etree import etree - - >>> c=cs('http://data.linz.govt.nz/services/csw/',timeout=30) - >>> c.identification.title - 'LINZ Data Service' - >>> c.identification.version - '2.0.2' - >>> c.provider.name - 'Land Information New Zealand' - >>> prop = fes.PropertyIsLike('csw:AnyText', 'parcel boundaries') - >>> c.getrecords2([prop], maxrecords=20) - >>> c.results['matches'] - 23 - >>> c.results['returned'] - 20 - >>> c.records['4d8c2d95-4ac2-1aa3-5b81-3cd4eff1ad0f'].title - 'NZ Strata Parcels' - >>> c.records['4d8c2d95-4ac2-1aa3-5b81-3cd4eff1ad0f'].abstract - 'This layer provides the **current** strata parcel polygons and their associated descriptive data as a single layer to facilitate their use independently of other primary parcels or non primary parcels.\n\nStrata parcels are portions of land where the vertical extent is limited. \n\nThe combination of this layer with the primary parcels layer provides all current parcels for New Zealand (i.e. excludes Historic and Pending parcels)\n\nIf you require approved or historic parcels see the [All Parcels Layer](http://data.linz.govt.nz/layer/1571-nz-all-parcels)\n\nThis layer has a nominal accuracy of 0.1-1m in urban areas and 1-100m in rural areas. For more detailed information about parcel accuracies please refer to the [Survey Boundary Marks](http://data.linz.govt.nz/layer/774-nz-survey-boundary-marks) layer which contains accuracies for each parcel node.\n\nThe originating data for parcel/title associations includes some non-official sources where the official data does not support a link. For more information [see](http://www.linz.govt.nz/about-linz/linz-data-service/dataset-information/cadastral-titles-data)' - >>> c.getrecordbyid(['4d8c2d95-4ac2-1aa3-5b81-3cd4eff1ad0f']) - >>> prop = fes.PropertyIsLike("csw:AnyText", "hydro") - >>> c.getrecords2([prop], outputschema='http://www.isotc211.org/2005/gmd-bad') #doctest: +IGNORE_EXCEPTION_DETAIL - Traceback (most recent call last): - File "", line 1, in - ExceptionReport: 'Invalid outputSchema parameter value: http://www.isotc211.org/2005/gmd-bad' - >>> c.response #doctest: +SKIP - >>> prop = fes.PropertyIsLike("csw:AnyText", "hydro") - >>> c.getrecords2([prop], outputschema='http://www.isotc211.org/2005/gmd', maxrecords=2) - >>> c.results['returned'] - 2 - >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].identification.title - 'Unsurveyed area polygon (Hydro, 1:1.5mil and smaller)' - >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].identifier - 'e4625e24-899e-4aed-c9d0-e4e341bf9d4b' - >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].stdname - 'ISO19115' - >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].stdver - '2003/Cor.1:2006' - >>> c.harvest('somefile','someuri') #doctest: +IGNORE_EXCEPTION_DETAIL - Traceback (most recent call last): - File "", line 1, in - ExceptionReport: 'Harvest operations are not supported' - >>> c.response #doctest: +SKIP - '\n\nHarvest operations are not supported' - >>> prop = fes.PropertyIsLike("csw:AnyText", "glacial") - >>> c.getrecords2([prop], outputschema='http://www.opengis.net/cat/csw/csdgm') - >>> c.results['matches'] > 0 - True - >>> c.results['nextrecord'] - 0 - >>> c.getrecords2([prop], outputschema='http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/', maxrecords=2) - >>> c.results['returned'] - 2 - >>> c.results['nextrecord'] - 0 - >>> sort_by=fes.SortBy([fes.SortProperty("dc:title", "ASC")]) - >>> c.getrecords2([prop], outputschema='http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/', maxrecords=2, sortby=sort_by) - >>> c.records['3cb46f76-e8d7-65ac-8b41-055675021f7b'].title - 'NZ Ross Dependency Glacial Lake Polygons (ANT, 1:50k)' diff -Nru owslib-0.16.0/tests/doctests/csw_ngdc.txt owslib-0.18.0/tests/doctests/csw_ngdc.txt --- owslib-0.16.0/tests/doctests/csw_ngdc.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/csw_ngdc.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -Import, setup - - >>> from __future__ import (absolute_import, division, print_function) - >>> from owslib import fes, csw - >>> from owslib.dif import namespaces - - >>> c = csw.CatalogueServiceWeb('http://www.ngdc.noaa.gov/geoportal/csw', timeout=120) - >>> c.identification.title - 'ArcGIS Server Geoportal Extension 10 - OGC CSW 2.0.2 ISO AP' - >>> c.identification.version - '2.0.2' - >>> sorted(c.identification.keywords) - ['Geophysical Metadata', 'NGDC', 'Ocean Metadata', 'Space Weather Metadata'] - >>> c.provider.name - 'NOAA NGDC' - -Get some records - - >>> sos_urn = 'urn:x-esri:specification:ServiceType:sos:url' - >>> aoos_uuid = '1706F520-2647-4A33-B7BF-592FAFDE4B45' - >>> uuid_filter = fes.PropertyIsEqualTo(propertyname='sys.siteuuid', literal="{%s}" % aoos_uuid) - - >>> c.getrecords2([uuid_filter], esn='full', maxrecords=999999) - >>> len(c.records) > 40 - True - >>> 'AOOS SOS' in c.records - True - - >>> aoos_sos = c.records['AOOS SOS'] - >>> aoos_sos.abstract - 'Alaska Ocean Observing System SOS' - >>> sorted([x['url'] for x in aoos_sos.references if x['scheme'] == sos_urn]) - ['http://sos.aoos.org/sos/sos/kvp?service=SOS&request=GetCapabilities&acceptVersions=1.0.0', 'http://sos.aoos.org/sos/sos/kvp?service=SOS&request=GetCapabilities&acceptVersions=1.0.0', 'http://sos.aoos.org/sos/sos/kvp?service=SOS&request=GetCapabilities&acceptVersions=1.0.0'] - >>> c.getService_urls(sos_urn) - ['http://sos.aoos.org/sos/sos/kvp?service=SOS&request=GetCapabilities&acceptVersions=1.0.0'] - - diff -Nru owslib-0.16.0/tests/doctests/csw_nlr.txt owslib-0.18.0/tests/doctests/csw_nlr.txt --- owslib-0.16.0/tests/doctests/csw_nlr.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/csw_nlr.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ - ->>> from __future__ import (absolute_import, division, print_function) ->>> from owslib.csw import CatalogueServiceWeb ->>> from owslib import fes - ->>> c = CatalogueServiceWeb('http://geomatics.nlr.nl/excat/csw') - ->>> c.identification.title -'NLR CSW' - ->>> c.identification.abstract -'NLR CSW: XQuery based catalog service conform to the HTTP protocol binding \n of the OpenGIS Catalogue Service specification version 2.0.2/2.0.1' - ->>> c.identification.keywords -['CSW', 'geospatial', 'catalogue'] - ->>> c.identification.fees -'NONE' - ->>> c.identification.accessconstraints -'NONE' - ->>> c.identification.type -'CSW' - ->>> c.identification.version -'2.0.2' - ->>> c.provider.name -'National Aerospace Laboratory NLR' - ->>> c.provider.site #doctest: +IGNORE_EXCEPTION_DETAIL -Traceback (most recent call last): - File "", line 1, in -AttributeError: 'ServiceProvider' object has no attribute 'site' - ->>> c.provider.url -'http://geomatics.nlr.nl/excat' - ->>> c.provider.uri #doctest: +IGNORE_EXCEPTION_DETAIL -Traceback (most recent call last): - File "", line 1, in -AttributeError: 'ServiceProvider' object has no attribute 'uri' - ->>> c.provider.contact.name -'Rob van Swol' - ->>> c.provider.contact.position -'Senior Scientist NLR-ASSP' - ->>> [op.name for op in c.operations] -['GetCapabilities', 'DescribeRecord', 'GetRecords', 'GetRecordById'] - ->>> grop = c.get_operation_by_name('GetRecords') ->>> grop.name -'GetRecords' - ->>> c.get_operation_by_name('GetRecords-bad') #doctest: +IGNORE_EXCEPTION_DETAIL -Traceback (most recent call last): - File "", line 1, in -KeyError: 'No operation named GetRecords-bad' - ->>> c.describerecord() - ->>> c.getdomain('GetRecords.outputSchema') #doctest: +IGNORE_EXCEPTION_DETAIL -Traceback (most recent call last): - File "", line 1, in -ExceptionReport: 'Operation not supported: GetDomain' - ->>> c.getrecordbyid(['DGFKRYMCWUZSCDRBWRXMIETZE']) - -#>>> c.records['DGFKRYMCWUZSCDRBWRXMIETZE'].title -#'CERISE: Computationally Efficient Radar Image Simulation Environment' diff -Nru owslib-0.16.0/tests/doctests/csw_pycsw_skip_caps.txt owslib-0.18.0/tests/doctests/csw_pycsw_skip_caps.txt --- owslib-0.16.0/tests/doctests/csw_pycsw_skip_caps.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/csw_pycsw_skip_caps.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - -Ensure CSW interaction works when skip_caps=True by defaulting -to default URL (i.e. Capabilities OperationsMetadata is not scanned -for the appropriate URL since skip_caps=True. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from owslib.csw import CatalogueServiceWeb as cs - -Properties - - >>> c = cs('http://demo.pycsw.org/cite/csw', skip_caps=True) - -GetRecords - - >>> c.getrecords2() - >>> c.results.get('returned') > 0 - True - >>> c.results.get('nextrecord') > 0 - True - >>> c.results.get('matches') > 0 - True diff -Nru owslib-0.16.0/tests/doctests/csw_pycsw.txt owslib-0.18.0/tests/doctests/csw_pycsw.txt --- owslib-0.16.0/tests/doctests/csw_pycsw.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/csw_pycsw.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from owslib.csw import CatalogueServiceWeb as cs - - -Properties - - >>> c = cs('http://demo.pycsw.org/cite/csw') - >>> c.updateSequence is not None - True - >>> c.version - '2.0.2' - - >>> c.identification.title - 'pycsw OGC CITE demo and Reference Implementation' - - >>> c.constraints['MaxRecordDefault'].values[0] - '10' - -GetRecords - - >>> c.getrecords2() - >>> c.results.get('returned') > 0 - True - >>> c.results.get('nextrecord') > 0 - True - >>> c.results.get('matches') > 0 - True diff -Nru owslib-0.16.0/tests/doctests/csw_uuid_constrain.txt owslib-0.18.0/tests/doctests/csw_uuid_constrain.txt --- owslib-0.16.0/tests/doctests/csw_uuid_constrain.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/csw_uuid_constrain.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -Imports - >>> from __future__ import (absolute_import, division, print_function) - >>> from owslib.csw import CatalogueServiceWeb as cs - >>> from xml.dom import minidom as md - >>> from owslib import fes, csw - >>> from tests.utils import compare_xml - -Initialize CSW client - - # connect to CSW, explore it's properties - #endpoint = 'http://data.nodc.noaa.gov/geoportal/csw' # NODC Geoportal: collection level - #endpoint = 'http://geodiscover.cgdi.ca/wes/serviceManagerCSW/csw' # NRCAN - #endpoint = 'http://geoport.whoi.edu/gi-cat/services/cswiso' # USGS Woods Hole GI_CAT - #endpoint = 'http://cida.usgs.gov/gdp/geonetwork/srv/en/csw' # USGS CIDA Geonetwork - #endpoint = 'http://www.nodc.noaa.gov/geoportal/csw' # NODC Geoportal: granule level - #endpoint = 'http://cmgds.marine.usgs.gov/geonetwork/srv/en/csw' # USGS Coastal & Marine Program Geonetwork - >>> endpoint = 'http://www.ngdc.noaa.gov/geoportal/csw' # NGDC Geoportal - >>> c = cs(endpoint, timeout=30) - - # define some var - >>> AOOS = '1706F520-2647-4A33-B7BF-592FAFDE4B45' - >>> bbox = [-141,42,-52,84] - - # Test new function getrecords2() - >>> uuid = fes.PropertyIsEqualTo(propertyname='sys.siteuuid', literal='{%s}' % AOOS) - >>> timeRange = fes.PropertyIsBetween(propertyname='apiso:modified', lower='2009-02-01', upper='2015-02-01') - >>> word = fes.PropertyIsLike(propertyname='csw:AnyText', literal='*salinity*', escapeChar='\\', singleChar='?', wildCard='*') - >>> box = fes.BBox(bbox) - - ########################################################## - # Test 1 - # Passing a list of list [[a,c,d],[b,c,d]] - # Translates to (a && c && d) || (b && c && d) - ########################################################## - >>> filter_list = [[uuid, word, timeRange], [bbox, word, timeRange]] - >>> c.getrecords2(filter_list) - >>> c.results == {'matches': 75, 'nextrecord': 11, 'returned': 10} - True - - ########################################################## - # Test 2 - # Passing a list of list [a, b] - # it means a || b - ########################################################## - # The response of this query is chaning to often to be a reliable test. - # >>> filter_list = [uuid, box] - # >>> c.getrecords2(filter_list) - # >>> c.results - # {'matches': 4895, 'nextrecord': 11, 'returned': 10} - - ########################################################## - # Test 3 - # Passing a list of list [[a,b]] - # it means a && b - ########################################################## - >>> filter_list = [[uuid, box]] - >>> c.getrecords2(filter_list) - >>> c.results['matches'] > 0 - True - >>> c.results['returned'] < 11 - True - - ########################################################## - # Test 4 - # Null Check: sys.siteuuid is null - # Passing a list [c] - ########################################################## - >>> filter = fes.PropertyIsNull(propertyname='sys.siteuuid') - >>> c.getrecords2([filter]) - >>> c.results['matches'] < 1 - True - >>> c.results['nextrecord'] == 0 - True - - - ########################################################## - # Test 5 - # construct a request by send the xml string - ########################################################## - >>> sos_search=b''' - ... - ... - ... full - ... - ... - ... - ... - ... apiso:ServiceType - ... *opendap* - ... - ... - ... - ... - ... - ... - ... ''' - >>> c.getrecords2(xml=sos_search) # in about XML it has constraint: maxrecords=10 - >>> c.results['matches'] > 0 - True - >>> c.results['returned'] < 11 - True - >>> c.results['nextrecord'] == 11 - True - - ########################################################## - # Test 6 - # construct a request by setting SAME constraint with Test 1 - # Passing a list of list [[a,b]] - # it means a && b - ########################################################## - >>> dap_filter = fes.PropertyIsLike(propertyname='apiso:ServiceType', literal='*opendap*', escapeChar='\\', singleChar='?', wildCard='*') - >>> filter_list = [[uuid,dap_filter]] - >>> c.getrecords2(filter_list) - >>> c.results['matches'] > 0 - True - >>> c.results['returned'] < 11 - True - >>> c.results['nextrecord'] == 11 - True - diff -Nru owslib-0.16.0/tests/doctests/iso_che.txt owslib-0.18.0/tests/doctests/iso_che.txt --- owslib-0.16.0/tests/doctests/iso_che.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/iso_che.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ - >>> from owslib.etree import etree - >>> from owslib.iso_che import CHE_MD_Metadata - >>> from tests.utils import resource_file - - >>> m = CHE_MD_Metadata(etree.parse(resource_file('iso_che.xml'))) - - >>> m.language - 'ger' - >>> [loc.id for loc in m.locales] - ['DE', 'FR', 'IT', 'EN'] - >>> m.get_default_locale().id - 'DE' - >>> m.identification.title - u'Gew\xe4sserschutzkarte' - >>> m.identification.contact[0].organization - u'Amt f\xfcr Umweltschutz' - >>> m.identification.bbox.minx - 8.396 - >>> m.contact[0].organization - 'Grundbuch- und Vermessungsamt' - >>> m.contact[0].streetname - 'Aabachstrasse' - >>> m.contact[0].streetnumber - '5' - >>> m.contact[0].postbox - '857' - >>> [link.url for link in m.distribution.online] - ['http://www.zugmap.ch/?link=gewaesserschutzkarte'] diff -Nru owslib-0.16.0/tests/doctests/owscontext.txt owslib-0.18.0/tests/doctests/owscontext.txt --- owslib-0.16.0/tests/doctests/owscontext.txt 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/doctests/owscontext.txt 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,47 @@ +Imports + + >>> from __future__ import (absolute_import, division, print_function, unicode_literals) + >>> import os + >>> from owslib.owscontext.core import OwcContext + >>> from tests.utils import resource_file + +Test OWC Atom XML Read + + >>> f = open(resource_file(os.path.join('owc_atom_examples', 'wms_meris.xml')), 'rb').read() + >>> owc = OwcContext.from_atomxml(f) + >>> owc.title + 'Satellite Image and Countries borders Over France and England' + >>> res = owc.resources[0] + >>> res.id + 'http://geoserver.sourceforge.net/html/index.php/' + >>> res.title + 'MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif' + >>> off = res.offerings[0] + >>> off.offering_code + 'http://www.opengis.net/spec/owc-atom/1.0/req/wms' + >>> op = off.operations[0] + >>> op.operations_code + 'GetCapabilities' + >>> op.request_url + 'http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities' + +Test OWC GeoJSON Read + + >>> f = open(resource_file(os.path.join('owc_geojson_examples','owc1.geojson')), 'rb').read().decode('utf-8') + >>> owc = OwcContext.from_json(f) + >>> # bcause json works on pure strings, the doctest unicode results for Python 2.7 would cause errors, I add print() + >>> print(owc.title) + WPS 52North example + >>> res = owc.resources[0] + >>> print(res.id) + http://geoprocessing.demo.52north.org:8080/wps/WebProcessingService/process1/ + >>> print(res.title) + WPS 52 north + >>> off = res.offerings[0] + >>> print(off.offering_code) + http://www.opengis.net/spec/owc-geojson/1.0/req/wps + >>> op = off.operations[0] + >>> print(op.operations_code) + GetCapabilities + >>> print(op.request_url) + http://geoprocessing.demo.52north.org:8080/wps/WebProcessingService?SERVICE=WPS&VERSION=1.0.0&REQUEST=GetCapabilities diff -Nru owslib-0.16.0/tests/doctests/ows_interfaces.txt owslib-0.18.0/tests/doctests/ows_interfaces.txt --- owslib-0.16.0/tests/doctests/ows_interfaces.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/ows_interfaces.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,143 +0,0 @@ -#This test checks that the OWSLib service interfaces are the same across all service type: -#Author: Dominic Lowe, 17th September 2009 -#Part of OWSLib package. - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file - >>> from owslib.csw import CatalogueServiceWeb - >>> from owslib.wms import WebMapService - >>> from owslib.wcs import WebCoverageService - >>> from owslib.wfs import WebFeatureService - >>> from owslib.util import OrderedDict - - -#TODO, we should run all these from local XML documents (as per the WMS and WFS services) - - >>> wmsxml = open(resource_file('wms_JPLCapabilities.xml'), 'rb').read() - >>> wfsxml = open(resource_file('mapserver-wfs-cap.xml'), 'rb').read() - >>> wms = WebMapService('url', version='1.1.1', xml=wmsxml) - >>> wfs = WebFeatureService('url', version='1.0', xml=wfsxml) - >>> wcs=WebCoverageService('http://thredds.ucar.edu/thredds/wcs/grib/NCEP/NAM/CONUS_80km/best', version='1.0.0') - >>> csw= CatalogueServiceWeb('http://data.nodc.noaa.gov/geoportal/csw') - -#Check each service instance conforms to OWSLib interface - >>> csw.alias, wms.alias, wcs.alias, wfs.alias='CSW', 'WMS', 'WCS', 'WFS' - >>> services=[csw, wms, wcs, wfs] - >>> for service in services: - ... type(service) - - - - - -#URL attribute - >>> for service in services: - ... service.url - 'http://data.nodc.noaa.gov/geoportal/csw' - 'url' - 'http://thredds.ucar.edu/thredds/wcs/grib/NCEP/NAM/CONUS_80km/best' - 'url' - -#version attribute - >>> for service in services: - ... service.version - '2.0.2' - '1.1.1' - '1.0.0' - '1.0' - -#Identification object: - >>> for service in services: - ... hasattr(service, 'identification') - True - True - True - True - - -#Check all ServiceIdentification attributes - >>> for service in services: - ... service.identification.type - ... [[attribute, hasattr(service.identification, attribute)] for attribute in ['type', 'version', 'title', 'abstract', 'keywords', 'accessconstraints', 'fees']] - 'CSW' - [['type', True], ['version', True], ['title', True], ['abstract', True], ['keywords', True], ['accessconstraints', True], ['fees', True]] - 'OGC:WMS' - [['type', True], ['version', True], ['title', True], ['abstract', True], ['keywords', True], ['accessconstraints', True], ['fees', True]] - 'OGC:WCS' - [['type', True], ['version', True], ['title', True], ['abstract', True], ['keywords', True], ['accessconstraints', False], ['fees', True]] - 'MapServer WFS' - [['type', True], ['version', True], ['title', True], ['abstract', True], ['keywords', True], ['accessconstraints', True], ['fees', True]] - -#Check all ServiceProvider attributes - >>> for service in services: - ... service.identification.type - ... [[attribute, hasattr(service.provider, attribute)] for attribute in ['name','url','contact']] - 'CSW' - [['name', True], ['url', True], ['contact', True]] - 'OGC:WMS' - [['name', True], ['url', True], ['contact', True]] - 'OGC:WCS' - [['name', True], ['url', True], ['contact', True]] - 'MapServer WFS' - [['name', True], ['url', True], ['contact', False]] - -#Check all operations implement IOperationMetadata - >>> for service in services: - ... service.identification.type - ... for op in service.operations: - ... [[attribute, hasattr(op, attribute)] for attribute in ['name','formatOptions','methods']] - 'CSW' - [['name', True], ['formatOptions', True], ['methods', True]] - [['name', True], ['formatOptions', True], ['methods', True]] - [['name', True], ['formatOptions', True], ['methods', True]] - [['name', True], ['formatOptions', True], ['methods', True]] - [['name', True], ['formatOptions', True], ['methods', True]] - 'OGC:WMS' - [['name', True], ['formatOptions', True], ['methods', True]] - [['name', True], ['formatOptions', True], ['methods', True]] - [['name', True], ['formatOptions', True], ['methods', True]] - 'OGC:WCS' - [['name', True], ['formatOptions', False], ['methods', True]] - [['name', True], ['formatOptions', False], ['methods', True]] - [['name', True], ['formatOptions', False], ['methods', True]] - 'MapServer WFS' - [['name', True], ['formatOptions', True], ['methods', True]] - [['name', True], ['formatOptions', True], ['methods', True]] - [['name', True], ['formatOptions', True], ['methods', True]] - - -#Check all contents implement IContentMetadata as a dictionary -#CSW does not work in this way so use dummy - >>> csw.contents={'dummy':'1'} - >>> for service in services: - ... service.identification.type - ... type(service.contents) - 'CSW' - <... 'dict'> - 'OGC:WMS' - <...OrderedDict'> - 'OGC:WCS' - <... 'dict'> - 'MapServer WFS' - <... 'dict'> - - -#Check any item (WCS coverage, WMS layer etc) from the contents of each service -#Check it conforms to IContentMetadata interface -#CSW does not conform to this -#WCS boundingbox handling is also different (has multiple boundingboxes). TODO: needs harmonising. - - - >>> for service in services: - ... if type(service.contents) in [dict, OrderedDict]: - ... service.identification.type - ... content=service.contents[list(service.contents.keys())[0]] #get random item from contents dictionary -has to be a nicer way to do this! - ... [[attribute, hasattr(content, attribute)] for attribute in ['id','title','boundingBox', 'boundingBoxWGS84', 'crsOptions', 'styles', 'timepositions']] - 'CSW' - [['id', False], ['title', True], ['boundingBox', False], ['boundingBoxWGS84', False], ['crsOptions', False], ['styles', False], ['timepositions', False]] - 'OGC:WMS' - [['id', True], ['title', True], ['boundingBox', True], ['boundingBoxWGS84', True], ['crsOptions', True], ['styles', True], ['timepositions', True]] - 'OGC:WCS' - [['id', True], ['title', True], ['boundingBox', True], ['boundingBoxWGS84', True], ['crsOptions', True], ['styles', True], ['timepositions', True]] - 'MapServer WFS' - [['id', True], ['title', True], ['boundingBox', True], ['boundingBoxWGS84', True], ['crsOptions', True], ['styles', True], ['timepositions', True]] diff -Nru owslib-0.16.0/tests/doctests/sos_10_ndbc_getobservation.txt owslib-0.18.0/tests/doctests/sos_10_ndbc_getobservation.txt --- owslib-0.16.0/tests/doctests/sos_10_ndbc_getobservation.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/sos_10_ndbc_getobservation.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file - >>> from owslib.sos import SensorObservationService - >>> from owslib.ows import OperationsMetadata - >>> from owslib.fes import FilterCapabilities - >>> from owslib.crs import Crs - >>> from datetime import datetime - - -Initialize - - >>> xml = open(resource_file('sos_ndbc_getcapabilities.xml'),'rb').read() - >>> ndbc = SensorObservationService(None, xml=xml) - - -GetObservation - - # Send a funky eventTime - - >>> off = ndbc.offerings[1] - >>> offerings = [off.name] - >>> responseFormat = off.response_formats[0] - >>> observedProperties = [off.observed_properties[0]] - >>> #observedProperties = [ndbc.get_operation_by_name('GetObservation').parameters['observedProperty']['values'][0]] - >>> eventTime = "This is not a valid eventTime!" - >>> response = ndbc.get_observation(offerings=offerings, responseFormat=responseFormat, observedProperties=observedProperties, eventTime=eventTime) #doctest: +IGNORE_EXCEPTION_DETAIL - Traceback (most recent call last): - File "", line 1, in - ServiceException: 'This is not a valid eventTime!' - - # NDBC only supports one offering and one observedProperty at a time - - >>> off = ndbc.offerings[1] - >>> offerings = [off.name] - >>> responseFormat = off.response_formats[0] - >>> observedProperties = [off.observed_properties[0]] - >>> #observedProperties = [ndbc.get_operation_by_name('GetObservation').parameters['observedProperty']['values'][0]] - >>> eventTime = None - - >>> response = ndbc.get_observation(offerings=offerings, responseFormat=responseFormat, observedProperties=observedProperties, eventTime=eventTime) - - -DescribeSensor - - # Send a funky procedure - - >>> procedure = "foobar" - >>> outputFormat = ndbc.get_operation_by_name('DescribeSensor').parameters['outputFormat']['values'][0] - >>> response = ndbc.describe_sensor(procedure=procedure, outputFormat=outputFormat) #doctest: +IGNORE_EXCEPTION_DETAIL - Traceback (most recent call last): - File "", line 1, in - ServiceException: 'foobar' - - # Valid request - - >>> procedure = ndbc.offerings[1].procedures[0] - >>> outputFormat = ndbc.get_operation_by_name('DescribeSensor').parameters['outputFormat']['values'][0] - >>> response = ndbc.describe_sensor(procedure=procedure, outputFormat=outputFormat) diff -Nru owslib-0.16.0/tests/doctests/sos_20_52N_demo.txt owslib-0.18.0/tests/doctests/sos_20_52N_demo.txt --- owslib-0.16.0/tests/doctests/sos_20_52N_demo.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/sos_20_52N_demo.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -# 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 -#'\n\n \n \n \n \n \n 2014-07-10T04:31:58.000Z\n \n \n \n \n \n \n 17.2\n \n \n' ->>> 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 -Nru owslib-0.16.0/tests/doctests/sos_20_bom_gov_au.txt owslib-0.18.0/tests/doctests/sos_20_bom_gov_au.txt --- owslib-0.16.0/tests/doctests/sos_20_bom_gov_au.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/sos_20_bom_gov_au.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -# 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 -Nru owslib-0.16.0/tests/doctests/sos_20_timeseries_decoder_ioos.txt owslib-0.18.0/tests/doctests/sos_20_timeseries_decoder_ioos.txt --- owslib-0.16.0/tests/doctests/sos_20_timeseries_decoder_ioos.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/sos_20_timeseries_decoder_ioos.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -# 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) - - ->>> 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]) - - -# 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) - - ->>> len(parsed_response.observations) -20 ->>> type(parsed_response.observations[0]) - ->>> type(parsed_response.observations[0].get_result()) - - ->>> measurement_timeseries = parsed_response.observations[0].get_result() ->>> len(measurement_timeseries) -20 - diff -Nru owslib-0.16.0/tests/doctests/tms.txt owslib-0.18.0/tests/doctests/tms.txt --- owslib-0.16.0/tests/doctests/tms.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/tms.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -Imports - - >>> from __future__ import (absolute_import, division, print_function, unicode_literals) - >>> from owslib import tms - -You can find a list of servers at -http://svn.osgeo.org/gdal/trunk/gdal/frmts/wms/WMSServerList.txt - -Find out what a TMS has to offer. Service metadata: - - >>> service = tms.TileMapService('http://odims.ospar.org/geoserver/gwc/service/tms/1.0.0', timeout=120) - >>> service.identification.title - 'Tile Map Service' - >>> service.identification.abstract - 'A Tile Map Service served by GeoWebCache' - >>> service.identification.keywords - [] - >>> service.identification.version - '1.0.0' - >>> service.identification.url - 'http://odims.ospar.org/geoserver/gwc/' - >>> len(service.contents) > 0 - True - >>> tm = service.contents['http://odims.ospar.org/geoserver/gwc/service/tms/1.0.0/geonode%3Aospar_offshore_renewables_2010_01@EPSG%3A4326@png'] - >>> tm.title - 'ospar_offshore_renewables_2010_01' - -you can filter the contents by profile and srs: - >>> len(service.items()) - 664 - >>> len(service.items('EPSG:900913')) - 332 - >>> len(service.items(profile='global-mercator')) - 332 - >>> len(service.items('EPSG:900913', profile='global-mercator')) - 332 - >>> len(service.items('EPSG:4326', profile='global-mercator')) - 0 - >>> sorted(service.items('EPSG:4326'))[0] # doctest: +ELLIPSIS - ('http://odims.ospar.org/geoserver/gwc/service/tms/1.0.0/geonode%3AMarine_protected_area__OSPAR____Global_view__polygon_@EPSG%3A4326@gif', ) - -The details of the TileMap are fetched on demand - >>> tm._tile_map == None - True - >>> tm.title - 'ospar_offshore_renewables_2010_01' - >>> tm.abstract - >>> tm._tile_map == None - False - >>> tm.srs - 'EPSG:4326' - >>> tm.extension - 'png' - >>> tm.height - 256 - >>> tm.width - 256 - >>> tm.mimetype - 'image/png' - >>> tm.boundingBox - (-180.0, -90.0, 180.0, 90.0) - >>> tm.origin - (-180.0, -90.0) - - - - -You can get tiles by their x,y,z indices, the title of the tilemap, projection and mime-type - >>> service.gettile(10,10,0, title='bluemarble', srs='EPSG:4326', mimetype='image/png').geturl() #doctest: +SKIP - 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/bluemarble@EPSG%3A4326@png/0/10/10.png' - >>> service.gettile(10,10,1, title='bluemarble', srs='EPSG:4326', mimetype='image/jpeg').geturl() #doctest: +SKIP - 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/bluemarble@EPSG%3A4326@jpeg/1/10/10.jpeg' - -if mimetype is ommited the tile is fetched from the first TileMap found: - >>> service.gettile(10,10,1, title='bluemarble', srs='EPSG:900913').geturl() #doctest: +SKIP - 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/bluemarble@EPSG%3A900913@jpeg/1/10/10.jpeg' - -You can also specify the Tilemap by id: - >>> service.gettile(10,10,0, 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/bluemarble@EPSG%3A900913@jpeg').geturl() #doctest: +SKIP - 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/bluemarble@EPSG%3A900913@jpeg/0/10/10.jpeg' - -An extensive test with: - >>> servers = [ - ... 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0', - ... 'http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0', - ... 'http://osm.omniscale.net/proxy/tms/1.0.0', - ... 'http://apps.esdi-humboldt.cz/mapproxy/tms/1.0.0', - ... 'http://apps.esdi-humboldt.cz/cgi-bin/tilecache/tilecache.cgi/1.0.0', - ... # 'http://tilecache.osgeo.org/wms-c/tilecache.py/1.0.0/', - ... 'http://tileserver.maptiler.com/tms', - ... ] - -# uncomment if you want to test all of the above -# >>> for server in servers: -# ... service = tms.TileMapService(server) -# ... service.identification.title -# ... service.identification.version -# ... len(service.items()) -# ... len(service.items('EPSG:900913')) -# ... len(service.items(profile='global-mercator')) -# ... len(service.items('EPSG:4326')) -# ... for tm in service.contents.values(): -# ... tm.title -# ... tm._tile_map == None -# ... tm.abstract -# ... tm._tile_map -# ... tm.srs -# ... tm.mimetype -# ... tm.extension -# ... tm.boundingBox -# ... tm.origin -# ... tm.type - - - - - - diff -Nru owslib-0.16.0/tests/doctests/util.txt owslib-0.18.0/tests/doctests/util.txt --- owslib-0.16.0/tests/doctests/util.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/util.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from owslib.util import clean_ows_url - -Tests - - >>> clean_ows_url('http//example.org/wms') - 'http//example.org/wms' - >>> clean_ows_url('http//example.org/wms?service=WMS') - 'http//example.org/wms' - >>> clean_ows_url('http//example.org/wms?SERVICE=WMS') - 'http//example.org/wms' - >>> clean_ows_url('http//example.org/wms?SeRvIcE=WMS') - 'http//example.org/wms' - >>> clean_ows_url('http//example.org/wms?SeRvIcE=WMS&version=1.3.0&request=GetCapabilities') - 'http//example.org/wms' - >>> clean_ows_url('http//example.org/wms?foo=bar&SeRvIcE=WMS&version=1.3.0&request=GetCapabilities') - 'http//example.org/wms?foo=bar' - >>> clean_ows_url('http://example.org/wms?map=/path/to/foo.map&SERVICE=WMS&version=1.3.0&request=GetCapabilities') - 'http://example.org/wms?map=%2Fpath%2Fto%2Ffoo.map' - >>> clean_ows_url('http://example.org/wms?map=/path/to/foo.map&foo=bar&&SERVICE=WMS&version=1.3.0&request=GetCapabilities') - 'http://example.org/wms?map=%2Fpath%2Fto%2Ffoo.map&foo=bar' diff -Nru owslib-0.16.0/tests/doctests/wcs_idee.txt owslib-0.18.0/tests/doctests/wcs_idee.txt --- owslib-0.16.0/tests/doctests/wcs_idee.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wcs_idee.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -COWS Web Coverage Service doctest -============================ - -WCS Version 1.0.0 -================= - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import cast_tuple_int_list, scratch_file - >>> from owslib.wcs import WebCoverageService - - >>> wcs=WebCoverageService('http://www.idee.es/wcs/IDEE-WCS-UTM30N/wcsServlet') - >>> wcs.version - '1.0.0' - >>> wcs.url - 'http://www.idee.es/wcs/IDEE-WCS-UTM30N/wcsServlet' - >>> wcs.identification.title - 'WCS UTM30N - MDT Peninsula y Baleares' - >>> wcs.identification.service - 'IDEE-WCS-UTM30N' - >>> wcs.provider.name #doctest: +SKIP - u'Instituto Geogr\xe1fico Nacional' - >>> sorted(wcs.contents.keys()) - ['MDT1000_peninsula_baleares', 'MDT1000_peninsula_baleares_aspecto', 'MDT1000_peninsula_baleares_pendientes', 'MDT25_peninsula_ZIP', 'MDT25_peninsula_aspecto', 'MDT25_peninsula_pendientes', 'MDT500_peninsula_baleares', 'MDT500_peninsula_baleares_aspecto', 'MDT500_peninsula_baleares_pendientes', 'MDT_peninsula_baleares', 'MDT_peninsula_baleares_aspecto', 'MDT_peninsula_baleares_pendientes'] - >>> cvg=wcs['MDT25_peninsula_pendientes'] - >>> cvg.title - 'MDT25 Pendientes Peninsula' - >>> cast_tuple_int_list(cvg.boundingBoxWGS84) - [-8, 35, 3, 43] - >>> cvg.timelimits - [] - >>> sorted(cvg.supportedFormats) - ['AsciiGrid', 'FloatGrid_Zip', 'GeoTIFF'] - >>> sorted(map(lambda x: x.getcode(), cvg.supportedCRS)) - ['EPSG:23028', 'EPSG:23029', 'EPSG:23030', 'EPSG:23030', 'EPSG:23031', 'EPSG:4230', 'EPSG:4326'] - >>> output=wcs.getCoverage(identifier='MDT25_peninsula_pendientes',bbox=(600000,4200000,601000,4201000),crs='EPSG:23030', format='AsciiGrid', resX=25, resY=25) - >>> f=open(scratch_file('test_idee.grd'), 'wb') - >>> bytes_written = f.write(output.read()) - >>> f.close() diff -Nru owslib-0.16.0/tests/doctests/wcs_nsidc.txt owslib-0.18.0/tests/doctests/wcs_nsidc.txt --- owslib-0.16.0/tests/doctests/wcs_nsidc.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wcs_nsidc.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -Web Coverage Service: #This is an example that shows how to the OWSLib wcs client to make requests from the NSIDC WCS. -==================== - -Version 1.1.0 -======== - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from owslib.wcs import WebCoverageService - >>> from tests.utils import resource_file, scratch_file - - >>> xml = open(resource_file('wcs_nsidc.xml')).read() - >>> wcs=WebCoverageService('http://nsidc.org/cgi-bin/atlas_north', version='1.1.0', xml=xml) - >>> wcs.url - 'http://nsidc.org/cgi-bin/atlas_north' - >>> wcs.version - '1.1.0' - >>> wcs.identification.service - 'WCS' - >>> wcs.identification.version - '1.1.0' - >>> wcs.identification.type - 'OGC WCS' - >>> wcs.identification.title - 'Atlas of the Cryosphere: Northern Hemisphere' - >>> wcs.identification.abstract - "The National Snow and Ice Data Center (NSIDC) Atlas of the Cryosphere is a map server that provides data and information pertinent to the frozen regions of Earth, including monthly climatologies of sea ice extent and concentration, snow cover extent, and snow water equivalent, in addition to glacier outlines, permafrost extent and classification, ice sheet elevation and accumulation, and more. In order to support polar projections, the Atlas is divided into two separate map servers: one for the Northern Hemisphere and one for the Southern Hemisphere. In addition to providing map images and source data through Open Geospatial Consortium, Inc. (OGC) protocols (WMS, WFS, and WCS), a dynamic web interface for exploring these data is also available at http://nsidc.org/data/atlas. If you have questions, comments or suggestions, please contact NSIDC User Services at +1.303.492.6199 or nsidc@nsidc.org. The development of this map server application was supported by NASA's Earth Observing System (EOS) Program under contract NAS5-03099 and was developed using MapServer, an Open Source development environment for building spatially-enabled internet applications. To cite the Atlas of the Cryosphere: Maurer, J. 2007. Atlas of the Cryosphere. Boulder, Colorado USA: National Snow and Ice Data Center. Digital media. Available at http://nsidc.org/data/atlas/." - >>> wcs.identification.keywords - ['Arctic', 'Cryosphere', 'Earth Science', 'Ice Extent', 'Ice Sheets', 'Northern Hemisphere', 'Oceans', 'Polar', 'Sea Ice', 'Sea Ice Concentration', 'Snow/Ice', 'Snow Cover', 'Snow Melt', 'Snow Water Equivalent'] - >>> wcs.identification.fees - 'none' - >>> wcs.identification.accessConstraints - 'none' - -#There is no 'ResponsibleParty' information in the NCEP/NAM capabilities document, so wcs.provider is empty. -#but if there was you could do: -#wcs.provider.url -#and.. -#wcs.provider.contact.organization -#wcs.provider.contact.email -#wcs.provider.contact.address -#etc... for region, city, postcode, country - -Print the ids of all layers (actually just the first 3): - >>> sorted(wcs.contents.keys()) - ['greenland_accumulation', 'greenland_bedrock_elevation', 'greenland_elevation', 'greenland_ice_thickness', 'greenland_surface_melt', 'sea_ice_concentration_01', 'sea_ice_concentration_02', 'sea_ice_concentration_03', 'sea_ice_concentration_04', 'sea_ice_concentration_05', 'sea_ice_concentration_06', 'sea_ice_concentration_07', 'sea_ice_concentration_08', 'sea_ice_concentration_09', 'sea_ice_concentration_10', 'sea_ice_concentration_11', 'sea_ice_concentration_12', 'seasonal_snow_classification', 'snow_extent_01', 'snow_extent_02', 'snow_extent_03', 'snow_extent_04', 'snow_extent_05', 'snow_extent_06', 'snow_extent_07', 'snow_extent_08', 'snow_extent_09', 'snow_extent_10', 'snow_extent_11', 'snow_extent_12', 'snow_water_equivalent_01', 'snow_water_equivalent_02', 'snow_water_equivalent_03', 'snow_water_equivalent_04', 'snow_water_equivalent_05', 'snow_water_equivalent_06', 'snow_water_equivalent_07', 'snow_water_equivalent_08', 'snow_water_equivalent_09', 'snow_water_equivalent_10', 'snow_water_equivalent_11', 'snow_water_equivalent_12'] - - -#To further interrogate a single "coverage" get the coverageMetadata object -#You can either do: - >>> cvg= wcs.contents['sea_ice_concentration_09'] #to get it from the dictonary - -#or even simpler you can do: - >>> cvg=wcs['sea_ice_concentration_09'] - - >>> cvg.boundingBoxWGS84 - (-179.999998745864, 34.9037152643753, 178.959571606408, 53.7717181062498) - - >>> len(cvg.timepositions)>1 #The old test kept failing as the response timepositions kept changign on the server - False - - >>> [y for y in (x.getcode() for x in cvg.supportedCRS) if y] - ['EPSG:32661', 'EPSG:4326', 'EPSG:3408', 'EPSG:3410', 'EPSG:3411', 'EPSG:3413', 'EPSG:3571', 'EPSG:3572', 'EPSG:3573', 'EPSG:3574', 'EPSG:3575', 'EPSG:3576', 'EPSG:3973', 'EPSG:3975', 'EPSG:32624', 'EPSG:3857', 'EPSG:900913'] - - >>> cvg.supportedFormats - ['image/tiff'] diff -Nru owslib-0.16.0/tests/doctests/wfs2_generic.txt owslib-0.18.0/tests/doctests/wfs2_generic.txt --- owslib-0.16.0/tests/doctests/wfs2_generic.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wfs2_generic.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -Imports and initialize - - >>> from __future__ import (absolute_import, division, print_function) - >>> from owslib.wfs import WebFeatureService - >>> from tests.utils import resource_file, sorted_url_query - - >>> getcapsin = open(resource_file("wfs_CUZK_GetCapabilities_2_0_0.xml"), 'rb').read() - >>> wfs = WebFeatureService('http://services.cuzk.cz/wfs/inspire-cp-wfs.asp', xml=getcapsin, version='2.0.0') - -Test the capabilities info - >>> wfs.identification.service - 'OGC WFS' - >>> wfs.identification.version - '2.0.0' - >>> wfs.identification.title - 'CZE INSPIRE Download Service - Cadastral Parcels' - >>> wfs.identification.abstract - 'Cadastral Parcels - INSPIRE themes' - >>> sorted(wfs.identification.keywords) - ['Cadastral Parcel Boundaries', 'Cadastral Zoning polygons', 'Cadastral parcel polygons'] - >>> wfs.identification.fees - >>> wfs.identification.accessconstraints - >>> wfs.provider.name - 'Czech Office for Surveying, Mapping and Cadastre' - >>> wfs.provider.url - 'www.cuzk.cz' - >>> wfs.provider.contact.email - >>> wfs.provider.contact.phone - '+420284041550' - >>> wfs.provider.contact.name - >>> wfs.provider.contact.organization - >>> wfs.provider.contact.city - >>> wfs.provider.contact.region - >>> wfs.provider.contact.postcode - >>> wfs.provider.contact.country - -Test the getfeature method - - >>> sorted(wfs.contents.keys()) - ['CP:CadastralBoundary', 'CP:CadastralParcel', 'CP:CadastralZoning'] - - >>> wfs.contents['CP:CadastralBoundary'].crsOptions[0].getcodeurn() - 'urn:ogc:def:crs:EPSG::102067' - - >>> sorted_url_query(wfs.getGETGetFeatureRequest(typename=['CP:CadastralBoundary'], maxfeatures=2)) - ['maxfeatures=2', 'request=GetFeature', 'service=WFS', 'typename=CP%3ACadastralBoundary', 'version=2.0.0'] - - >>> sorted_url_query(wfs.getGETGetFeatureRequest(typename=['CP:CadastralBoundary'], maxfeatures=2, bbox=[15,49,16,51,'urn:ogc:def:crs:EPSG:4326'])) - ['bbox=49%2C15%2C51%2C16%2Curn%3Aogc%3Adef%3Acrs%3AEPSG%3A%3A4326', 'maxfeatures=2', 'request=GetFeature', 'service=WFS', 'typename=CP%3ACadastralBoundary', 'version=2.0.0'] - - >>> sorted_url_query(wfs.getGETGetFeatureRequest(typename=['CP:CadastralBoundary'], maxfeatures=2, bbox=[-685336,-993518,-684996,-993285])) - ['bbox=-685336%2C-993518%2C-684996%2C-993285%2Curn%3Aogc%3Adef%3Acrs%3AEPSG%3A%3A102067', 'maxfeatures=2', 'request=GetFeature', 'service=WFS', 'typename=CP%3ACadastralBoundary', 'version=2.0.0'] diff -Nru owslib-0.16.0/tests/doctests/wfs_USDASSURGO.txt owslib-0.18.0/tests/doctests/wfs_USDASSURGO.txt --- owslib-0.16.0/tests/doctests/wfs_USDASSURGO.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wfs_USDASSURGO.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -# Test ability of OWSLib.wfs to interact with USDA SSURGO WFS 1.0.0 web service -# Contact e-mail: selimnairb@gmail.com - ->>> from __future__ import (absolute_import, division, print_function) ->>> from owslib.wfs import WebFeatureService ->>> wfs_filter = "Geometry -76.766960,39.283611 -76.684120,39.338394 " ->>> wfs = WebFeatureService('http://SDMDataAccess.nrcs.usda.gov/Spatial/SDMWGS84Geographic.wfs', version='1.1.0', timeout=360) ->>> response = wfs.getfeature(typename='mapunitpolyextended', filter=wfs_filter, propertyname=None) ->>> response.read().find(' 0 -True diff -Nru owslib-0.16.0/tests/doctests/wms_getfeatureinfo.txt owslib-0.18.0/tests/doctests/wms_getfeatureinfo.txt --- owslib-0.16.0/tests/doctests/wms_getfeatureinfo.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wms_getfeatureinfo.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ ->>> from owslib.wms import WebMapService ->>> wms = WebMapService('http://geoserv.weichand.de:8080/geoserver/wms') - ->>> res1 = wms.getfeatureinfo(layers=['bvv:lkr_ex'], srs='EPSG:31468', bbox=(4500000,5500000,4500500,5500500), size=(500,500), format='image/jpeg', info_format="text/html", xy=(250,250)) ->>> html_string1 = res1.read().decode("utf-8") ->>> ('lkr_ex' in html_string1) -True ->>> ('gmd_ex' in html_string1) -False - ->>> res2 = wms.getfeatureinfo(layers=['bvv:lkr_ex','bvv:gmd_ex'], srs='EPSG:31468', bbox=(4500000,5500000,4500500,5500500), size=(500,500), format='image/jpeg', info_format="text/html", xy=(250,250)) ->>> html_string2 = res2.read().decode("utf-8") ->>> ('lkr_ex' in html_string2) -True ->>> ('gmd_ex' in html_string2) -True - ->>> res3 = wms.getfeatureinfo(layers=['bvv:lkr_ex','bvv:gmd_ex'], srs='EPSG:31468', bbox=(4500000,5500000,4500500,5500500), size=(500,500), format='image/jpeg', query_layers=['bvv:lkr_ex'], info_format="text/html", xy=(250,250)) ->>> wms.request -'http://geoserv.weichand.de:8080/geoserver/wms?SERVICE=WMS&layers=bvv%3Alkr_ex%2Cbvv%3Agmd_ex&styles=&feature_count=20&y=250&query_layers=bvv%3Alkr_ex&service=WMS&srs=EPSG%3A31468&format=image%2Fjpeg&request=GetFeatureInfo&bgcolor=0xFFFFFF&height=500&width=500&version=1.1.1&bbox=4500000%2C5500000%2C4500500%2C5500500&kwargs=%7B%7D&exceptions=application%2Fvnd.ogc.se_xml&x=250&info_format=text%2Fhtml&transparent=FALSE' ->>> html_string3 = res3.read().decode("utf-8") ->>> ('lkr_ex' in html_string3) -True ->>> ('gmd_ex' in html_string3) -False - diff -Nru owslib-0.16.0/tests/doctests/wms_getmap.txt owslib-0.18.0/tests/doctests/wms_getmap.txt --- owslib-0.16.0/tests/doctests/wms_getmap.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wms_getmap.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from owslib.wms import WebMapService - >>> from owslib.util import ServiceException - -GetMap Tests against live services (pulled from the docstrings) -(images aren't saved) - -MESONET -GetMap 1.1.1 - >>> url = 'http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi' - >>> wms = WebMapService(url, version='1.1.1') - >>> wms.request - 'http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi?service=WMS&request=GetCapabilities&version=1.1.1' - >>> rsp = wms.getmap(layers=['nexrad_base_reflect'], styles=['default'], srs='EPSG:4326', bbox=(-126, 24, -66, 50), size=(250, 250), format='image/jpeg', transparent=True) - >>> type(rsp) - - - -GetMap 1.1.1 ServiceException for an invalid CRS - - >>> try: - ... rsp = wms.getmap(layers=['nexrad_base_reflect'], styles=['default'], srs='EPSG:4328', bbox=(-126, 24, -66, 50), size=(250, 250), format='image/jpeg', transparent=True) - ... except ServiceException as e: - ... assert "msWMSLoadGetMapParams(): WMS server error. Invalid SRS given : SRS must be valid for all requested layers." in str(e) - -GetMap 1.3.0 - - >>> url = 'http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi' - >>> wms = WebMapService(url, version='1.3.0') - >>> rsp = wms.getmap(layers=['nexrad_base_reflect'], styles=['default'], srs='EPSG:4326', bbox=(-126, 24, -66, 50), size=(250, 250), format='image/jpeg', transparent=True) - >>> type(rsp) - - -GetMap 1.3.0 ServiceException for an invalid CRS - >>> try: - ... rsp = wms.getmap(layers=['nexrad_base_reflect'], styles=['default'], srs='EPSG:4328', bbox=(-126, 24, -66, 50), size=(250, 250), format='image/jpeg', transparent=True) - ... except ServiceException as e: - ... assert "msWMSLoadGetMapParams(): WMS server error. Invalid CRS given : CRS must be valid for all requested layers." in str(e) - -National Map - >>> url = 'https://services.nationalmap.gov/ArcGIS/services/geonames/MapServer/WMSServer' - >>> wms = WebMapService(url, version='1.3.0') - >>> rsp = wms.getmap(layers=['3'], styles=['default'], srs='CRS:84', bbox=(-176.646, 17.7016, -64.8017, 71.2854), size=(500, 300), format='image/png', transparent=True) - >>> type(rsp) - - >>> wms.request - 'https://services.nationalmap.gov/arcgis/services/geonames/MapServer/WmsServer?layers=3&styles=default&service=WMS&crs=CRS%3A84&format=image%2Fpng&request=GetMap&bgcolor=0xFFFFFF&height=300&width=500&version=1.3.0&bbox=-176.646%2C17.7016%2C-64.8017%2C71.2854&exceptions=XML&transparent=TRUE' diff -Nru owslib-0.16.0/tests/doctests/wms_JPLCapabilities.txt owslib-0.18.0/tests/doctests/wms_JPLCapabilities.txt --- owslib-0.16.0/tests/doctests/wms_JPLCapabilities.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wms_JPLCapabilities.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,116 +0,0 @@ - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from owslib.wms import WebMapService - >>> from tests.utils import resource_file - >>> import os - -Fake a request to a WMS Server using saved doc from -http://wms.jpl.nasa.gov/wms.cgi. - - >>> xml = open(resource_file('wms_JPLCapabilities.xml'), 'rb').read() - >>> wms = WebMapService('url', version='1.1.1', xml=xml) - -Test capabilities ------------------ - - >>> wms.identification.type - 'OGC:WMS' - >>> wms.identification.version - '1.1.1' - >>> wms.identification.title - 'JPL Global Imagery Service' - >>> wms.identification.abstract - 'WMS Server maintained by JPL, worldwide satellite imagery.' - >>> wms.identification.keywords - ['ImageryBaseMapsEarthCover', 'Imagery', 'BaseMaps', 'EarthCover', 'JPL', 'Jet Propulsion Laboratory', 'Landsat', 'WMS', 'SLD', 'Global'] - >>> wms.identification.accessconstraints - 'Server is load limited' - >>> wms.identification.fees - 'none' - >>> wms.provider.name - 'JPL' - >>> wms.provider.url - 'http://OnEarth.jpl.nasa.gov/index.html' - -Check contact info (some of it is missing) - >>> wms.provider.contact.name - 'Lucian Plesea' - >>> wms.provider.contact.email - 'lucian.plesea@jpl.nasa.gov' - >>> wms.provider.contact.address - >>> wms.provider.contact.city - >>> wms.provider.contact.country - >>> wms.provider.contact.region - >>> wms.provider.contact.postcode - >>> wms.provider.contact.organization - 'JPL' - >>> wms.provider.contact.position - - -Test available content layers - >>> isinstance(wms.items(), list) - True - >>> type(wms.contents) - - -NOTE: Not sure this dictionary interface is right...?? - - >>> sorted(wms.contents.keys()) - ['BMNG', 'daily_afternoon', 'daily_planet', 'gdem', 'global_mosaic', 'global_mosaic_base', 'huemapped_srtm', 'modis', 'srtm_mag', 'srtmplus', 'us_colordem', 'us_elevation', 'us_landsat_wgs84', 'us_ned', 'worldwind_dem'] - - >>> sorted([wms[layer].id for layer in wms.contents]) - ['BMNG', 'daily_afternoon', 'daily_planet', 'gdem', 'global_mosaic', 'global_mosaic_base', 'huemapped_srtm', 'modis', 'srtm_mag', 'srtmplus', 'us_colordem', 'us_elevation', 'us_landsat_wgs84', 'us_ned', 'worldwind_dem'] - - -Test single item accessor - - >>> wms['global_mosaic'].title - 'WMS Global Mosaic, pan sharpened' - - >>> wms['global_mosaic'].keywords - [] - -['GlobalMosaic', 'Imagery', 'BaseMaps', 'EarthCover', 'JPL', 'Jet Propulsion Laboratory', 'Landsat', 'WMS', 'SLD', 'Global'] - - >>> wms['global_mosaic'].boundingBox - - >>> wms['global_mosaic'].boundingBoxWGS84 - (-180.0, -60.0, 180.0, 84.0) - - >>> sorted(wms['global_mosaic'].crsOptions) - ['AUTO:42003', 'EPSG:4326'] - - - >>> x = wms['global_mosaic'].styles - >>> x == {'pseudo_bright': {'title': 'Pseudo-color image (Uses IR and Visual bands, 542 mapping), gamma 1.5'}, 'pseudo': {'title': '(default) Pseudo-color image, pan sharpened (Uses IR and Visual bands, 542 mapping), gamma 1.5'}, 'visual': {'title': 'Real-color image, pan sharpened (Uses the visual bands, 321 mapping), gamma 1.5'}, 'pseudo_low': {'title': 'Pseudo-color image, pan sharpened (Uses IR and Visual bands, 542 mapping)'}, 'visual_low': {'title': 'Real-color image, pan sharpened (Uses the visual bands, 321 mapping)'}, 'visual_bright': {'title': 'Real-color image (Uses the visual bands, 321 mapping), gamma 1.5'}} - True - -Expect a KeyError for invalid names - - >>> wms['utterly bogus'].title - Traceback (most recent call last): - ... - KeyError: 'No content named utterly bogus' - -Test operations - - >>> sorted([op.name for op in wms.operations]) - ['GetCapabilities', 'GetMap', 'GetTileService'] - - >>> x = wms.getOperationByName('GetMap').methods - >>> x == [{'type': 'Get', 'url': 'http://wms.jpl.nasa.gov/wms.cgi?'}] - True - - >>> wms.getOperationByName('GetMap').formatOptions - ['image/jpeg', 'image/png', 'image/geotiff', 'image/tiff', 'application/vnd.google-earth.kml+xml'] - -Test exceptions - - >>> wms.exceptions - ['application/vnd.ogc.se_xml'] - -Lastly, test the getcapabilities and getmap methods - - >>> wms = WebMapService('http://giswebservices.massgis.state.ma.us/geoserver/wms', version='1.1.1') diff -Nru owslib-0.16.0/tests/doctests/wmts_geoserver21.txt owslib-0.18.0/tests/doctests/wmts_geoserver21.txt --- owslib-0.16.0/tests/doctests/wmts_geoserver21.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wmts_geoserver21.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,164 +0,0 @@ - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import cast_tuple_int_list, resource_file - >>> from owslib.wmts import WebMapTileService - -Fake a request to a WMTS Server using saved doc from -http://geonode.iwlearn.org/geoserver/gwc/service/wmts?REQUEST=GetCapabilities - - >>> xml = open(resource_file('geoserver21-wmts-cap.xml'), 'rb').read() - >>> wmts = WebMapTileService('url', version='1.0.0', xml=xml) - -Test capabilities ------------------ - >>> wmts.identification.type - 'OGC WMTS' - >>> wmts.identification.version - '1.0.0' - >>> wmts.identification.title - 'Web Map Tile Service - GeoWebCache' - >>> wmts.identification.abstract - - >>> wmts.identification.keywords - [] - >>> wmts.identification.accessconstraints - - >>> wmts.identification.fees - - >>> wmts.restonly - False - -Service Provider: - - >>> wmts.provider.name - 'http://geonode.iwlearn.org/geoserver/gwc/service/wmts' - >>> wmts.provider.url - 'http://geonode.iwlearn.org/geoserver/gwc/service/wmts' - -Check contact info - >>> wmts.provider.contact.name - 'GeoWebCache User' - >>> wmts.provider.contact.position - - -Test available content layers - >>> sorted(list(wmts.contents)) - ['geonode:Basins', 'geonode:ContinentalMargins', 'geonode:Diktas_Project_Area_1', 'geonode:FEOWv1_TNC', 'geonode:GH_Anidamiento_de_Tortugas_Marinas4326', 'geonode:GH_Anidamiento_de_aves4326', 'geonode:GH_Areas_Protegidas4326', 'geonode:GH_Arrecifes_Coralinos4326', 'geonode:GH_Blanqueamiento_Corales4326', 'geonode:GH_Departamentos4326', 'geonode:GH_Descargas4326', 'geonode:GH_Descargas_2007_4326', 'geonode:GH_Desove_Peces4326', 'geonode:GH_Distribucion_de_Manati4326', 'geonode:GH_Est_muestreo4326', 'geonode:GH_Est_muestreo_propuestas4326', 'geonode:GH_Estuarios_y_Lagunas4326', 'geonode:GH_Limites_Administrativos_Pol4326', 'geonode:GH_Manglares4326', 'geonode:GH_Otras_enfermedades_Corales4326', 'geonode:GH_Paises_Pol4326', 'geonode:GH_Paises_Region_Pol4326', 'geonode:GH_Pastos_Marinos4326', 'geonode:GH_Playas_arenosas4326', 'geonode:GH_Sitios_Prioritarios_TNC4326', 'geonode:GH_Usos_suelo_SOTERLAC4326', 'geonode:GH_ecosistemas_terrestres4326', 'geonode:GIS_OTHER_VEC_CASP_OIL_PNT', 'geonode:GIS_OTHER_VEC_CASP_PIPELIN', 'geonode:GIS_OTHER_VEC_ISOLINES', 'geonode:LMEs_64', 'geonode:Longhurst_world_v4_2010', 'geonode:MANGROVES', 'geonode:SEAGRASSES', 'geonode:TB_Aquifers_New', 'geonode:World_Fao_Zones', 'geonode:World_Maritime_Boundaries_v6_1_20110512', 'geonode:World_Seas', 'geonode:XYDjibouti', 'geonode:XYSudan', 'geonode:XYYemen', 'geonode:abc1', 'geonode:abril', 'geonode:area_de_estudio_1', 'geonode:asfalto', 'geonode:bcp_wgs84_0511', 'geonode:giwa_lme', 'geonode:glwd_1', 'geonode:hotspots_revisited_2004_polygons', 'geonode:igrac_tba_WL_201105_projected', 'geonode:mapa_geologico4326', 'geonode:mapa_geologico_fallas4326', 'geonode:mapa_geologico_provincias4326', 'geonode:meow_ecos', 'geonode:red_hidrografica', 'geonode:seaVoX_sea_area_polygons', 'geonode:undersea_features_2008', 'geonode:wribasin'] - -Test TileMatrixSet variants - >>> sorted(wmts.tilematrixsets.keys()) - ['EPSG:4326', 'EPSG:900913', 'GlobalCRS84Pixel', 'GlobalCRS84Scale', 'GoogleCRS84Quad', 'GoogleMapsCompatible'] - >>> wmts.tilematrixsets['GoogleMapsCompatible'].identifier - 'GoogleMapsCompatible' - >>> wmts.tilematrixsets['GoogleMapsCompatible'].crs - 'urn:ogc:def:crs:EPSG::900913' - >>> sorted(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix.keys()) - ['GoogleMapsCompatible:0', 'GoogleMapsCompatible:1', 'GoogleMapsCompatible:10', 'GoogleMapsCompatible:11', 'GoogleMapsCompatible:12', 'GoogleMapsCompatible:13', 'GoogleMapsCompatible:14', 'GoogleMapsCompatible:15', 'GoogleMapsCompatible:16', 'GoogleMapsCompatible:17', 'GoogleMapsCompatible:18', 'GoogleMapsCompatible:19', 'GoogleMapsCompatible:2', 'GoogleMapsCompatible:20', 'GoogleMapsCompatible:3', 'GoogleMapsCompatible:4', 'GoogleMapsCompatible:5', 'GoogleMapsCompatible:6', 'GoogleMapsCompatible:7', 'GoogleMapsCompatible:8', 'GoogleMapsCompatible:9'] - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].identifier - 'GoogleMapsCompatible:0' - >>> int(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].scaledenominator) - 559082264 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].topleftcorner - (-20037508.34, 20037508.0) - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].tilewidth - 256 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].tileheight - 256 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].matrixwidth - 1 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:0'].matrixheight - 1 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].identifier - 'GoogleMapsCompatible:17' - >>> int(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].scaledenominator) - 4265 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].topleftcorner - (-20037508.34, 20037508.0) - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].tilewidth - 256 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].tileheight - 256 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].matrixwidth - 131072 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['GoogleMapsCompatible:17'].matrixheight - 131072 - - >>> wmts.tilematrixsets['GlobalCRS84Scale'].identifier - 'GlobalCRS84Scale' - >>> wmts.tilematrixsets['GlobalCRS84Scale'].crs - 'urn:ogc:def:crs:EPSG::4326' - >>> sorted(wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix.keys()) - ['GlobalCRS84Scale:0', 'GlobalCRS84Scale:1', 'GlobalCRS84Scale:10', 'GlobalCRS84Scale:11', 'GlobalCRS84Scale:12', 'GlobalCRS84Scale:13', 'GlobalCRS84Scale:14', 'GlobalCRS84Scale:15', 'GlobalCRS84Scale:16', 'GlobalCRS84Scale:17', 'GlobalCRS84Scale:18', 'GlobalCRS84Scale:19', 'GlobalCRS84Scale:2', 'GlobalCRS84Scale:20', 'GlobalCRS84Scale:3', 'GlobalCRS84Scale:4', 'GlobalCRS84Scale:5', 'GlobalCRS84Scale:6', 'GlobalCRS84Scale:7', 'GlobalCRS84Scale:8', 'GlobalCRS84Scale:9'] - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].identifier - 'GlobalCRS84Scale:0' - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].scaledenominator - 500000000.0 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].topleftcorner - (90.0, -180.0) - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].tilewidth - 256 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].tileheight - 256 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].matrixwidth - 2 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:0'].matrixheight - 1 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].identifier - 'GlobalCRS84Scale:20' - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].scaledenominator - 100.0 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].topleftcorner - (90.0, -180.0) - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].tilewidth - 256 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].tileheight - 256 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].matrixwidth - 5590823 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['GlobalCRS84Scale:20'].matrixheight - 2795412 - -Test single item accessor - - >>> wmts['geonode:GH_Areas_Protegidas4326'].title - 'GOH Areas Protegidas' - >>> cast_tuple_int_list(wmts['geonode:GH_Areas_Protegidas4326'].boundingBoxWGS84) - [-92, 12, -84, 18] - >>> wmts['geonode:GH_Areas_Protegidas4326'].id - 'geonode:GH_Areas_Protegidas4326' - >>> wmts['geonode:GH_Areas_Protegidas4326'].styles - {'GH_Areas_Protegidas4326': {'isDefault': True}} - >>> wmts['geonode:GH_Areas_Protegidas4326'].formats - ['image/png', 'image/jpeg'] - >>> sorted(wmts['geonode:GH_Areas_Protegidas4326'].tilematrixsets) - ['EPSG:4326', 'EPSG:900913'] - >>> sorted(wmts['geonode:GH_Areas_Protegidas4326'].tilematrixsetlinks.keys()) - ['EPSG:4326', 'EPSG:900913'] - >>> wmts['geonode:GH_Areas_Protegidas4326'].tilematrixsetlinks['EPSG:4326'] - - >>> sorted(wmts['geonode:GH_Areas_Protegidas4326'].tilematrixsetlinks['EPSG:4326'].tilematrixlimits.keys()) - ['EPSG:4326:0', 'EPSG:4326:1', 'EPSG:4326:10', 'EPSG:4326:11', 'EPSG:4326:12', 'EPSG:4326:13', 'EPSG:4326:14', 'EPSG:4326:15', 'EPSG:4326:16', 'EPSG:4326:17', 'EPSG:4326:18', 'EPSG:4326:19', 'EPSG:4326:2', 'EPSG:4326:20', 'EPSG:4326:3', 'EPSG:4326:4', 'EPSG:4326:5', 'EPSG:4326:6', 'EPSG:4326:7', 'EPSG:4326:8', 'EPSG:4326:9', 'null'] - >>> wmts['geonode:GH_Areas_Protegidas4326'].tilematrixsetlinks['EPSG:4326'].tilematrixlimits['EPSG:4326:14'] - - >>> wmts['geonode:GH_Areas_Protegidas4326'].infoformats - ['text/plain', 'text/html', 'application/vnd.ogc.gml'] - >>> wmts['geonode:GH_Areas_Protegidas4326'].resourceURLs - [] - -Test several layers styles - >>> wmts.contents['geonode:MANGROVES'].styles - {'MANGROVES': {'isDefault': True}} - >>> wmts.contents['geonode:asfalto'].styles - {'asfalto': {'format': 'image/png', 'legend': 'http://www.maps.bob/etopo2/legend.png', 'isDefault': True, 'title': 'TEST Title: hotspots revisited 2004 polygons'}} - >>> wmts.contents['geonode:hotspots_revisited_2004_polygons'].styles - {'hotspots_revisited_2004_polygons': {'title': 'TEST Title: hotspots revisited 2004 polygons', 'abstract': 'TEST Abstract: hotspots revisited 2004 polygons', 'format': 'image/png', 'height': '100', 'width': '100', 'keywords': ['testkeywords1', 'test keywords 2', 'test keywords 3'], 'legend': 'http://www.maps.bob/etopo2/legend.png', 'isDefault': True}} - >>> wmts.contents['geonode:asfalto'].styles - {'asfalto': {'format': 'image/png', 'legend': 'http://www.maps.bob/etopo2/legend.png', 'isDefault': True, 'title': 'TEST Title: hotspots revisited 2004 polygons'}} - -Test operations - # TODO - -Test the gettile methods - # TODO diff -Nru owslib-0.16.0/tests/doctests/wmts_SFSWorldWMTSCapabilities.txt owslib-0.18.0/tests/doctests/wmts_SFSWorldWMTSCapabilities.txt --- owslib-0.16.0/tests/doctests/wmts_SFSWorldWMTSCapabilities.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wmts_SFSWorldWMTSCapabilities.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,240 +0,0 @@ - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import cast_tuple_int_list, resource_file - >>> from owslib.wmts import WebMapTileService - -Fake a request to a WMTS Server using saved doc from -http://server.caris.com/spatialfusionserver/services/ows/wmts/World/1.0.0/WMTSCapabilities.xml - - >>> xml = open(resource_file('sfs-wmts-cap-world.xml'), 'rb').read() - >>> wmts = WebMapTileService('url', version='1.0.0', xml=xml) - -Test capabilities ------------------ - >>> wmts.identification.type - 'WMTS' - >>> wmts.identification.version - '1.0.0' - >>> wmts.identification.title - - >>> wmts.identification.abstract - - >>> wmts.identification.keywords - [] - >>> wmts.identification.accessconstraints - 'None' - >>> wmts.identification.fees - 'conditions unknown' - -Test service metadata URL (RESTful API) - >>> wmts.serviceMetadataURL - 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World/1.0.0/WMTSCapabilities.xml' - -Service Provider: - - >>> wmts.provider.name - 'CARIS' - - >>> wmts.provider.url - -Check contact info - >>> wmts.provider.contact.name - 'Andy Hoggarth' - >>> wmts.provider.contact.position - 'Marketing & Sales Manager' - >>> wmts.provider.contact.phone - '1 (506) 459-3849' - >>> wmts.provider.contact.address - '115 Waggoners Lane' - >>> wmts.provider.contact.region - 'New Brunswick' - >>> wmts.provider.contact.email - 'info@caris.com' - >>> wmts.provider.contact.city - 'Fredericton' - >>> wmts.provider.contact.postcode - 'E3B 2L4' - >>> wmts.provider.contact.country - 'Canada' - -Test available content layers - - >>> sorted(list(wmts.contents)) - ['Ocean', 'World'] - -Test TileMatrixSet variants - - >>> sorted(wmts.tilematrixsets.keys()) - ['GlobalCRS84Scale', 'GoogleMapsCompatible'] - >>> wmts.tilematrixsets['GoogleMapsCompatible'].identifier - 'GoogleMapsCompatible' - >>> wmts.tilematrixsets['GoogleMapsCompatible'].crs - 'urn:ogc:def:crs:EPSG:6.18:3:3857' - >>> sorted(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix.keys()) - ['0', '1', '10', '11', '12', '13', '14', '15', '16', '17', '2', '3', '4', '5', '6', '7', '8', '9'] - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].identifier - '0' - >>> int(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].scaledenominator) - 559082264 - >>> cast_tuple_int_list(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].topleftcorner) - [-20037508, -20037508] - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].tilewidth - 256 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].tileheight - 256 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].matrixwidth - 1 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['0'].matrixheight - 1 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].identifier - '17' - >>> int(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].scaledenominator) - 4265 - >>> cast_tuple_int_list(wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].topleftcorner) - [-20037508, -20037508] - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].tilewidth - 256 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].tileheight - 256 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].matrixwidth - 131072 - >>> wmts.tilematrixsets['GoogleMapsCompatible'].tilematrix['17'].matrixheight - 131072 - - >>> wmts.tilematrixsets['GlobalCRS84Scale'].identifier - 'GlobalCRS84Scale' - >>> wmts.tilematrixsets['GlobalCRS84Scale'].crs - 'urn:ogc:def:crs:OGC:1.3:CRS84' - >>> sorted(wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix.keys()) - ['0', '1', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2', '20', '3', '4', '5', '6', '7', '8', '9'] - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].identifier - '0' - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].scaledenominator - 500000000.0 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].topleftcorner - (90.0, -180.0) - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].tilewidth - 256 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].tileheight - 256 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].matrixwidth - 2 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['0'].matrixheight - 1 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].identifier - '20' - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].scaledenominator - 100.0 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].topleftcorner - (90.0, -180.0) - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].tilewidth - 256 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].tileheight - 256 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].matrixwidth - 2097152 - >>> wmts.tilematrixsets['GlobalCRS84Scale'].tilematrix['20'].matrixheight - 1048576 - -Test single item accessor - - >>> wmts['World'].title - 'World' - >>> cast_tuple_int_list(wmts['World'].boundingBoxWGS84) - [-179, -90, 179, 83] - >>> wmts['World'].id - 'World' - >>> wmts['World'].styles - {'default': {'isDefault': True}} - >>> wmts['World'].formats - ['image/png'] - >>> sorted(wmts['World'].tilematrixsets) - ['GlobalCRS84Scale', 'GoogleMapsCompatible'] - >>> sorted(wmts['World'].tilematrixsetlinks.keys()) - ['GlobalCRS84Scale', 'GoogleMapsCompatible'] - >>> wmts['World'].infoformats - ['application/gml+xml; version=3.1'] - >>> wmts['World'].resourceURLs[0] == {'resourceType': 'tile', 'template': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World/World/default/{tileMatrixSet}/{tileMatrix}/{tileRow}/{tileCol}.png', 'format': 'image/png'} - True - >>> wmts['World'].resourceURLs[1] == {'resourceType': 'FeatureInfo', 'template': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World/World/default/{tileMatrixSet}/{tileMatrix}/{tileRow}/{tileCol}/{j}/{i}.xml', 'format': 'application/gml+xml; version=3.1'} - True - - >>> wmts['Ocean'].title - 'Ocean' - >>> cast_tuple_int_list(wmts['Ocean'].boundingBoxWGS84) - [-179, -85, 179, 89] - >>> wmts['Ocean'].id - 'Ocean' - >>> wmts['Ocean'].styles - {'default': {'isDefault': True}} - >>> wmts['Ocean'].formats - ['image/png'] - >>> sorted(wmts['Ocean'].tilematrixsets) - ['GlobalCRS84Scale', 'GoogleMapsCompatible'] - >>> sorted(wmts['Ocean'].tilematrixsetlinks.keys()) - ['GlobalCRS84Scale', 'GoogleMapsCompatible'] - >>> wmts['Ocean'].infoformats - ['application/gml+xml; version=3.1'] - >>> wmts['Ocean'].resourceURLs[0] == {'resourceType': 'tile', 'template': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World/Ocean/default/{tileMatrixSet}/{tileMatrix}/{tileRow}/{tileCol}.png', 'format': 'image/png'} - True - >>> wmts['Ocean'].resourceURLs[1] == {'resourceType': 'FeatureInfo', 'template': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World/Ocean/default/{tileMatrixSet}/{tileMatrix}/{tileRow}/{tileCol}/{j}/{i}.xml', 'format': 'application/gml+xml; version=3.1'} - True - -Test themes - >>> list(wmts.themes.keys()) - ['Earth'] - >>> wmts.themes['Earth'].title - 'Earth' - >>> wmts.themes['Earth'].identifier - 'Earth' - >>> wmts.themes['Earth'].abstract - - >>> sorted(wmts.themes['Earth'].layerRefs) - ['Ocean', 'World'] - - - -Expect a KeyError for invalid names - - >>> wmts['utterly bogus'].title - Traceback (most recent call last): - ... - KeyError: 'No content named utterly bogus' - -Test operations - - >>> sorted([op.name for op in wmts.operations]) - ['GetCapabilities', 'GetFeatureInfo', 'GetTile'] - - >>> x = wmts.getOperationByName('GetFeatureInfo').methods - >>> x == [{'type': 'Get', 'url': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World', 'constraints': []}] - True - - >>> x = wmts.getOperationByName('GetTile').methods - >>> x == [{'type' : 'Get', 'url': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World', 'constraints': []}] - True - - >>> x = wmts.getOperationByName('GetCapabilities').methods - >>> x == [{'type' : 'Get', 'url': 'http://server.caris.com/spatialfusionserver/services/ows/wmts/World', 'constraints': []}] - True - - -Test the gettile methods - >>> try: - ... from io import BytesIO as ImageIO - ... except ImportError: - ... from cStringIO import StringIO as ImageIO - >>> try: - ... from PIL import Image - ... except: - ... pass - ... else: - ... rq = wmts.buildTileRequest(layer='World', tilematrix='0', row=0, column=0) - ... assert rq == 'SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=World&STYLE=default&TILEMATRIXSET=GlobalCRS84Scale&TILEMATRIX=0&TILEROW=0&TILECOL=0&FORMAT=image%2Fpng' - ... tile000 = wmts.gettile(layer='World', tilematrix='0', row=0, column=0) - ... im = ImageIO(tile000.read()) - ... image = Image.open(im) - ... assert image.size == (256, 256) - diff -Nru owslib-0.16.0/tests/doctests/wmts.txt owslib-0.18.0/tests/doctests/wmts.txt --- owslib-0.16.0/tests/doctests/wmts.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wmts.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import scratch_file - -Find out what a WMTS has to offer. Service metadata: - - >>> from owslib.wmts import WebMapTileService - >>> wmts = WebMapTileService("http://map1c.vis.earthdata.nasa.gov/wmts-geo/wmts.cgi") - >>> wmts.identification.type - 'OGC WMTS' - >>> wmts.identification.version - '1.0.0' - >>> wmts.identification.title - 'NASA Global Imagery Browse Services for EOSDIS' - >>> bytearray(wmts.identification.abstract, 'utf-8') - bytearray(b'Near real time imagery from multiple NASA instruments') - >>> wmts.identification.keywords - ['World', 'Global'] - -Service Provider: - - >>> wmts.provider.name - 'National Aeronautics and Space Administration' - - >>> wmts.provider.url - 'https://earthdata.nasa.gov/' - -Available Layers: - - >>> len(wmts.contents.keys()) > 0 - True - >>> sorted(list(wmts.contents))[0] - 'AIRS_CO_Total_Column_Day' - -Fetch a tile (using some defaults): - - >>> tile = wmts.gettile(layer='MODIS_Terra_CorrectedReflectance_TrueColor', tilematrixset='EPSG4326_250m', tilematrix='0', row=0, column=0, format="image/jpeg") - >>> out = open(scratch_file('nasa_modis_terra_truecolour.jpg'), 'wb') - >>> bytes_written = out.write(tile.read()) - >>> out.close() - -Test styles for several layers - >>> wmts.contents['MLS_SO2_147hPa_Night'].styles - {'default': {'isDefault': True, 'title': 'default'}} - >>> wmts.contents['MLS_SO2_147hPa_Night'].styles - {'default': {'isDefault': True, 'title': 'default'}} - - Test a WMTS without a ServiceProvider tag in Capababilities XML - - >>> wmts = WebMapTileService('http://data.geus.dk/arcgis/rest/services/OneGeologyGlobal/S071_G2500_OneGeology/MapServer/WMTS/1.0.0/WMTSCapabilities.xml') - diff -Nru owslib-0.16.0/tests/doctests/wps_describeprocess_bbox.txt owslib-0.18.0/tests/doctests/wps_describeprocess_bbox.txt --- owslib-0.16.0/tests/doctests/wps_describeprocess_bbox.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_describeprocess_bbox.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -Python doctest file to simulate a WPS DescribeProcess invocation. -This test is testing the BoundingBox process of the Emu service (https://github.com/bird-house/emu). -This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file - >>> from owslib.wps import WebProcessingService, printInputOutput - -Initialize WPS client - - >>> wps = WebProcessingService('http://localhost:8094/wps',skip_caps=True) - -Execute fake invocation of DescribeProcess operation by parsing cached response from Emu service - - >>> xml = open(resource_file('wps_bbox_DescribeProcess.xml'), 'rb').read() - >>> process = wps.describeprocess('bbox', xml=xml) - -Check process description - - >>> process.identifier - 'bbox' - >>> process.title - 'Bounding Box' - -Check process inputs - - >>> for input in process.dataInputs: - ... print('Process input:') - ... printInputOutput(input) - ... - Process input: - identifier=bbox, title=Bounding Box, abstract=None, data type=BoundingBoxData - Supported Value: EPSG:4326 - Supported Value: EPSG:3035 - Default Value: EPSG:4326 - minOccurs=1, maxOccurs=1 - - -Check process outputs - - >>> for output in process.processOutputs: - ... print('Process output:') - ... printInputOutput(output) - ... - Process output: - identifier=bbox, title=Bounding Box, abstract=None, data type=BoundingBoxData - Supported Value: EPSG:4326 - Default Value: EPSG:4326 - reference=None, mimeType=None diff -Nru owslib-0.16.0/tests/doctests/wps_describeprocess_ceda.txt owslib-0.18.0/tests/doctests/wps_describeprocess_ceda.txt --- owslib-0.16.0/tests/doctests/wps_describeprocess_ceda.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_describeprocess_ceda.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -Python doctest file to simulate a WPS DescribeProcess invocation. -This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file - >>> from owslib.wps import WebProcessingService, printInputOutput - -Initialize WPS client - - >>> wps = WebProcessingService('http://ceda-wps2.badc.rl.ac.uk/wps',skip_caps=True) - -Execute fake invocation of DescribeProcess operation by parsing cached response from USGS service - - >>> xml = open(resource_file('wps_CEDADescribeProcess.xml'), 'rb').read() - >>> process = wps.describeprocess('Doubleit', xml=xml) - -Check process description - - >>> process.identifier - 'DoubleIt' - >>> process.title - 'Doubles the input number and returns value' - >>> process.abstract - 'This is test process used to demonstrate how the WPS and the WPS User Interface work. The process accepts an integer or floating point number and returns some XML containing the input number double.' - -Check process inputs - - >>> for input in process.dataInputs: - ... print('Process input:') - ... printInputOutput(input) - ... - Process input: - identifier=NumberToDouble, title=NumberToDouble, abstract=NumberToDouble, data type=LiteralData - Any value allowed - Default Value: None - minOccurs=1, maxOccurs=-1 - - -Check process outputs - - >>> for output in process.processOutputs: - ... print('Process output:') - ... printInputOutput(output) - ... - Process output: - identifier=OutputXML, title=OutputXML, abstract=OutputXML, data type=ComplexData - Supported Value: mimeType=text/XML, encoding=UTF-8, schema=NONE - Default Value: None - reference=None, mimeType=None diff -Nru owslib-0.16.0/tests/doctests/wps_describeprocess_usgs.txt owslib-0.18.0/tests/doctests/wps_describeprocess_usgs.txt --- owslib-0.16.0/tests/doctests/wps_describeprocess_usgs.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_describeprocess_usgs.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ -Python doctest file to simulate a WPS DescribeProcess invocation. -This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file - >>> from owslib.wps import WebProcessingService, printInputOutput - -Initialize WPS client - - >>> wps = WebProcessingService('http://cida.usgs.gov/gdp/process/WebProcessingService',skip_caps=True) - -Execute fake invocation of DescribeProcess operation by parsing cached response from USGS service - - >>> xml = open(resource_file('wps_USGSDescribeProcess.xml'), 'rb').read() - >>> process = wps.describeprocess('gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm', xml=xml) - -Check process description - - >>> process.identifier - 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' - >>> process.title - 'Feature Weighted Grid Statistics' - >>> process.abstract - 'This algorithm generates area weighted statistics of a gridded dataset for a set of vector polygon features. Using the bounding-box that encloses the feature data and the time range, if provided, a subset of the gridded dataset is requested from the remote gridded data server. Polygon representations are generated for cells in the retrieved grid. The polygon grid-cell representations are then projected to the feature data coordinate reference system. The grid-cells are used to calculate per grid-cell feature coverage fractions. Area-weighted statistics are then calculated for each feature using the grid values and fractions as weights. If the gridded dataset has a time range the last step is repeated for each time step within the time range or all time steps if a time range was not supplied.' - -Check process inputs - >>> for input in process.dataInputs: - ... print('Process input:') - ... printInputOutput(input, indent='') - ... - Process input: - identifier=FEATURE_COLLECTION, title=Feature Collection, abstract=A feature collection encoded as a WFS request or one of the supported GML profiles., data type=ComplexData - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.0.0/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.1/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.2/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.2.1/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.0.0/base/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.0.1/base/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.1.0/base/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.1.1/base/feature.xsd - Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.2.1/base/feature.xsd - Default Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.0.0/feature.xsd - minOccurs=1, maxOccurs=1 - Process input: - identifier=DATASET_URI, title=Dataset URI, abstract=The base data web service URI for the dataset of interest., data type=anyURI - Any value allowed - Default Value: None - minOccurs=1, maxOccurs=1 - Process input: - identifier=DATASET_ID, title=Dataset Identifier, abstract=The unique identifier for the data type or variable of interest., data type=string - Any value allowed - Default Value: None - minOccurs=1, maxOccurs=2147483647 - Process input: - identifier=REQUIRE_FULL_COVERAGE, title=Require Full Coverage, abstract=If turned on, the service will require that the dataset of interest fully cover the polygon analysis zone data., data type=boolean - Any value allowed - Default Value: True - minOccurs=1, maxOccurs=1 - Process input: - identifier=TIME_START, title=Time Start, abstract=The date to begin analysis., data type=dateTime - Any value allowed - Default Value: None - minOccurs=0, maxOccurs=1 - Process input: - identifier=TIME_END, title=Time End, abstract=The date to end analysis., data type=dateTime - Any value allowed - Default Value: None - minOccurs=0, maxOccurs=1 - Process input: - identifier=FEATURE_ATTRIBUTE_NAME, title=Feature Attribute Name, abstract=The attribute that will be used to label column headers in processing output., data type=string - Any value allowed - Default Value: None - minOccurs=1, maxOccurs=1 - Process input: - identifier=DELIMITER, title=Delimiter, abstract=The delimiter that will be used to separate columns in the processing output., data type=string - Allowed Value: COMMA - Allowed Value: TAB - Allowed Value: SPACE - Default Value: COMMA - minOccurs=1, maxOccurs=1 - Process input: - identifier=STATISTICS, title=Statistics, abstract=Statistics that will be returned for each feature in the processing output., data type=string - Allowed Value: MEAN - Allowed Value: MINIMUM - Allowed Value: MAXIMUM - Allowed Value: VARIANCE - Allowed Value: STD_DEV - Allowed Value: WEIGHT_SUM - Allowed Value: COUNT - Default Value: None - minOccurs=1, maxOccurs=7 - Process input: - identifier=GROUP_BY, title=Group By, abstract=If multiple features and statistics are selected, this will change whether the processing output columns are sorted according to statistics or feature attributes., data type=string - Allowed Value: STATISTIC - Allowed Value: FEATURE_ATTRIBUTE - Default Value: None - minOccurs=1, maxOccurs=1 - Process input: - identifier=SUMMARIZE_TIMESTEP, title=Summarize Timestep, abstract=If selected, processing output will include columns with summarized statistics for all feature attribute values for each timestep, data type=boolean - Any value allowed - Default Value: True - minOccurs=0, maxOccurs=1 - Process input: - identifier=SUMMARIZE_FEATURE_ATTRIBUTE, title=Summarize Feature Attribute, abstract=If selected, processing output will include a final row of statistics summarizing all timesteps for each feature attribute value, data type=boolean - Any value allowed - Default Value: True - minOccurs=0, maxOccurs=1 - - -Check process outputs - >>> for output in process.processOutputs: - ... print('Process output:') - ... printInputOutput(output, indent='') - ... - Process output: - identifier=OUTPUT, title=Output File, abstract=A delimited text file containing requested process output., data type=ComplexData - Supported Value: mimeType=text/csv, encoding=UTF-8, schema=None - Default Value: mimeType=text/csv, encoding=UTF-8, schema=None - reference=None, mimeType=None diff -Nru owslib-0.16.0/tests/doctests/wps_execute_invalid_request.txt owslib-0.18.0/tests/doctests/wps_execute_invalid_request.txt --- owslib-0.16.0/tests/doctests/wps_execute_invalid_request.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_execute_invalid_request.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -Python doctest file to simulate a WPS Execute invocation with INVALID arguments. -This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, setup_logging - >>> from owslib.wps import WebProcessingService - >>> logger = setup_logging('INFO') - -Initialize WPS client - - >>> wps = WebProcessingService('http://cida.usgs.gov/gdp/process/WebProcessingService') - -Submit fake invocation of Execute operation using cached HTTP request and response - >>> request = open(resource_file('wps_USGSExecuteInvalidRequest.xml'), 'rb').read() - >>> response = open(resource_file('wps_USGSExecuteInvalidRequestResponse.xml'), 'rb').read() - >>> execution = wps.execute(None, [], request=request, response=response) - Executing WPS request... - Execution status=ProcessFailed - Percent completed=0 - Status message=None - owslib.wps.WPSException : ... - - >>> execution.isComplete() - True - -Display errors - >>> for ex in execution.errors: - ... ex.code, ex.locator, ex.text - ... - (None, None, 'Attribute null not found in feature collection') diff -Nru owslib-0.16.0/tests/doctests/wps_execute.txt owslib-0.18.0/tests/doctests/wps_execute.txt --- owslib-0.16.0/tests/doctests/wps_execute.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_execute.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -Python doctest file to simulate a WPS Execute invocation. -This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, setup_logging - >>> from owslib.wps import WebProcessingService - >>> logger = setup_logging('INFO') - -Initialize WPS client - - >>> wps = WebProcessingService('http://cida.usgs.gov/gdp/process/WebProcessingService') - -Execute fake invocation of Execute operation using cached HTTP request and response - - >>> request = open(resource_file('wps_USGSExecuteRequest1.xml'), 'rb').read() - >>> response = open(resource_file('wps_USGSExecuteResponse1a.xml'), 'rb').read() - >>> execution = wps.execute(None, [], request=request, response=response) - Executing WPS request... - Execution status=ProcessStarted - Percent completed=0 - Status message=None - >>> execution.status - 'ProcessStarted' - >>> execution.isComplete() - False - -Simulate end of process - - >>> response = open(resource_file('wps_USGSExecuteResponse1b.xml'), 'rb').read() - >>> execution.checkStatus(sleepSecs=0, response=response) - Execution status=ProcessSucceeded - Percent completed=0 - Status message=Process successful - >>> execution.status - 'ProcessSucceeded' - >>> execution.isComplete() - True - -Display location of process output - >>> for output in execution.processOutputs: - ... output.reference - ... - 'http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=1318528582026OUTPUT.601bb3d0-547f-4eab-8642-7c7d2834459e' diff -Nru owslib-0.16.0/tests/doctests/wps_getcapabilities_52n.txt owslib-0.18.0/tests/doctests/wps_getcapabilities_52n.txt --- owslib-0.16.0/tests/doctests/wps_getcapabilities_52n.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_getcapabilities_52n.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -Python doctest file to simulate a WPS GetCapabilities invocation. -This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file - >>> from owslib.wps import WebProcessingService - -Initialize WPS client - - >>> wps = WebProcessingService('http://geoprocessing.demo.52north.org:8080/52n-wps-webapp-3.3.1/WebProcessingService', skip_caps=True) - -Execute fake invocation of GetCapabilities operation by parsing cached response from 52North service - - >>> xml = open(resource_file('wps_52nCapabilities.xml'), 'rb').read() - >>> wps.getcapabilities(xml=xml) - -Check WPS description - - >>> wps.identification.type - 'WPS' - -Check available operations - >>> for operation in wps.operations: - ... print(operation.name) - ... - GetCapabilities - DescribeProcess - Execute - - -Check high level process descriptions - >>> for process in wps.processes: - ... process.identifier, process.title - ... - ('org.n52.wps.server.algorithm.test.MultiReferenceInputAlgorithm', 'for testing multiple inputs by reference') - ('org.n52.wps.server.algorithm.test.EchoProcess', 'Echo process') - ('org.n52.wps.server.algorithm.test.MultiReferenceBinaryInputAlgorithm', 'for testing multiple binary inputs by reference') - ('org.n52.wps.server.algorithm.test.LongRunningDummyTestClass', 'org.n52.wps.server.algorithm.test.LongRunningDummyTestClass') - ('org.n52.wps.server.algorithm.JTSConvexHullAlgorithm', 'org.n52.wps.server.algorithm.JTSConvexHullAlgorithm') - ('org.n52.wps.server.algorithm.test.MultipleComplexInAndOutputsDummyTestClass', 'org.n52.wps.server.algorithm.test.MultipleComplexInAndOutputsDummyTestClass') - ('org.n52.wps.server.algorithm.test.DummyTestClass', 'org.n52.wps.server.algorithm.test.DummyTestClass') diff -Nru owslib-0.16.0/tests/doctests/wps_getcapabilities_ceda.txt owslib-0.18.0/tests/doctests/wps_getcapabilities_ceda.txt --- owslib-0.16.0/tests/doctests/wps_getcapabilities_ceda.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_getcapabilities_ceda.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -Python doctest file to simulate a WPS GetCapabilities invocation. -This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file - >>> from owslib.wps import WebProcessingService - -Initialize WPS client - - >>> wps = WebProcessingService('http://ceda-wps2.badc.rl.ac.uk/wps', skip_caps=True) - -Execute fake invocation of GetCapabilities operation by parsing cached response from USGS service - - >>> xml = open(resource_file('wps_CEDACapabilities.xml'), 'rb').read() - >>> wps.getcapabilities(xml=xml) - -Check WPS description - - >>> wps.identification.type - 'WPS' - >>> wps.identification.title - 'WPS Pylons Test Server' - >>> wps.identification.abstract - -Check available operations - >>> for operation in wps.operations: - ... print(operation.name) - ... - GetCapabilities - DescribeProcess - Execute - - -Check high level process descriptions - >>> for process in wps.processes: - ... process.identifier, process.title - ... - ('CDMSSubsetVariable', 'Writes a text file and returns an output.') - ('NCDumpIt', 'Calls ncdump on the input file path and writes it to an output file.') - ('TestDap', 'Writes a text file and returns an output.') - ('CDMSDescribeVariableDomain', 'Writes a text file and returns an output.') - ('CFCheck', 'Writes a text file and returns an output.') - ('DoubleIt', 'Doubles the input number and returns value') - ('SimplePlot', 'Creates a simple map plot.') - ('CDMSListDatasets', 'Writes a text file and returns an output.') - ('CDMSListVariables', 'Writes a text file and returns an output.') - ('WCSWrapper', 'Web Coverage Service Wrapper Process') - ('GetWeatherStations', 'Writes a text file with one weather station per line') - ('ListPPFileHeader', 'Writes a text file that contains a listing of pp-records in a file.') - ('TakeAges', 'A test process to last a long time.') - ('CMIP5FileFinder', 'Writes a test file of matched CMIP5 files.') - ('SubsetPPFile', 'Filters a PP-file to generate a new subset PP-file.') - ('ExtractUKStationData', 'ExtractUKStationData') - ('CDOWrapper1', 'Writes a text file and returns an output.') - ('MMDNCDiff', 'MMDNCDiff') - ('PlotRotatedGrid', 'Creates a plot - to show we can plot a rotated grid.') - ('MMDAsync', 'Writes a text file and returns an output.') - ('MashMyDataMultiplier', 'Writes a text file and returns an output.') - ('Delegator', 'Writes a text file and returns an output.') - ('ExArchProc1', 'Writes a text file and returns an output.') - ('CDOShowInfo', 'Writes a text file and returns an output.') - ('PostTest', 'Writes a text file and returns an output.') - ('StatusTestProcess', 'An process to test status responses') - ('WaitForFileDeletionCached', 'An asynchronous job that waits for a file to be deleted') - ('WaitForAllFilesToBeDeleted', 'An asynchronous job that waits for a number of files to be deleted') - ('AsyncTest', 'Does an asynchronous test job run') - ('SyncTest1', 'Just creates a file.') - ('WaitForFileDeletion', 'An asynchronous job that waits for a file to be deleted') - ('ProcessTemplate', 'Writes a text file and returns an output.') diff -Nru owslib-0.16.0/tests/doctests/wps_getcapabilities_usgs.txt owslib-0.18.0/tests/doctests/wps_getcapabilities_usgs.txt --- owslib-0.16.0/tests/doctests/wps_getcapabilities_usgs.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_getcapabilities_usgs.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -Python doctest file to simulate a WPS GetCapabilities invocation. -This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file - >>> from owslib.wps import WebProcessingService - -Initialize WPS client - - >>> wps = WebProcessingService('http://cida.usgs.gov/gdp/process/WebProcessingService', skip_caps=True) - -Execute fake invocation of GetCapabilities operation by parsing cached response from USGS service - - >>> xml = open(resource_file('wps_USGSCapabilities.xml'), 'rb').read() - >>> wps.getcapabilities(xml=xml) - -Check WPS description - >>> wps.updateSequence is not None - True - >>> wps.identification.type - 'WPS' - >>> wps.identification.title - 'Geo Data Portal WPS Implementation' - >>> wps.identification.abstract - 'A Geo Data Portal Service based on the 52north implementation of WPS 1.0.0' - -Check available operations - >>> for operation in wps.operations: - ... print(operation.name) - ... - GetCapabilities - DescribeProcess - Execute - -Check high level process descriptions - >>> for process in wps.processes: - ... process.identifier, process.title - ... - ('gov.usgs.cida.gdp.wps.algorithm.filemanagement.ReceiveFiles', 'gov.usgs.cida.gdp.wps.algorithm.filemanagement.ReceiveFiles') - ('gov.usgs.cida.gdp.wps.algorithm.discovery.CalculateWCSCoverageInfo', 'gov.usgs.cida.gdp.wps.algorithm.discovery.CalculateWCSCoverageInfo') - ('gov.usgs.cida.gdp.wps.algorithm.communication.EmailWhenFinishedAlgorithm', 'gov.usgs.cida.gdp.wps.algorithm.communication.EmailWhenFinishedAlgorithm') - ('gov.usgs.cida.gdp.wps.algorithm.communication.GeoserverManagementAlgorithm', 'gov.usgs.cida.gdp.wps.algorithm.communication.GeoserverManagementAlgorithm') - ('gov.usgs.cida.gdp.wps.algorithm.discovery.GetWcsCoverages', 'gov.usgs.cida.gdp.wps.algorithm.discovery.GetWcsCoverages') - ('gov.usgs.cida.gdp.wps.algorithm.filemanagement.GetWatersGeom', 'gov.usgs.cida.gdp.wps.algorithm.filemanagement.GetWatersGeom') - ('gov.usgs.cida.gdp.wps.algorithm.discovery.ListOpendapGrids', 'gov.usgs.cida.gdp.wps.algorithm.discovery.ListOpendapGrids') - ('gov.usgs.cida.gdp.wps.algorithm.filemanagement.CreateNewShapefileDataStore', 'gov.usgs.cida.gdp.wps.algorithm.filemanagement.CreateNewShapefileDataStore') - ('gov.usgs.cida.gdp.wps.algorithm.discovery.GetGridTimeRange', 'gov.usgs.cida.gdp.wps.algorithm.discovery.GetGridTimeRange') diff -Nru owslib-0.16.0/tests/doctests/wps_request10.txt owslib-0.18.0/tests/doctests/wps_request10.txt --- owslib-0.16.0/tests/doctests/wps_request10.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_request10.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -Python doctest file to test generation of a WPS request from input arguments. -The specific request involves a FeatureWeightedGridStatisticsAlgorithm process over a WFS feature. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml - >>> from owslib.wps import WPSExecution, WFSFeatureCollection, WFSQuery - >>> from owslib.etree import etree - -Supply process input arguments - - >>> wfsUrl = "http://igsarm-cida-gdp2.er.usgs.gov:8082/geoserver/wfs" - >>> query = WFSQuery("sample:CONUS_States", propertyNames=['the_geom',"STATE"], filters=["CONUS_States.508","CONUS_States.469"]) - >>> method = 'POST' - >>> featureCollection = WFSFeatureCollection(wfsUrl, query, wfsMethod=method) - >>> processid = 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' - >>> inputs = [ ("FEATURE_ATTRIBUTE_NAME","STATE"), - ... ("DATASET_URI", "dods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncml"), - ... ("DATASET_ID", "ccsm3_a1b_tmax"), - ... ("DATASET_ID", "ccsm3_a1b_pr"), - ... ("DATASET_ID", "ccsm3_a1fi_tmax"), - ... ("TIME_START","1960-01-01T00:00:00.000Z"), - ... ("TIME_END","1960-12-31T00:00:00.000Z"), - ... ("REQUIRE_FULL_COVERAGE","true"), - ... ("DELIMITER","COMMA"), - ... ("STATISTICS","MEAN"), - ... ("STATISTICS","MINIMUM"), - ... ("STATISTICS","MAXIMUM"), - ... ("STATISTICS","WEIGHT_SUM"), - ... ("STATISTICS","VARIANCE"), - ... ("STATISTICS","STD_DEV"), - ... ("STATISTICS","COUNT"), - ... ("GROUP_BY","STATISTIC"), - ... ("SUMMARIZE_TIMESTEP","true"), - ... ("SUMMARIZE_FEATURE_ATTRIBUTE","true"), - ... ("FEATURE_COLLECTION", featureCollection) - ... ] - >>> output = "OUTPUT" - - # build XML request for WPS process execution - >>> execution = WPSExecution() - >>> requestElement = execution.buildRequest(processid, inputs, output=output) - >>> request = etree.tostring( requestElement ) - -Compare to cached XML request - - >>> _request = open(resource_file('wps_USGSExecuteRequest4.xml'), 'rb').read() - >>> compare_xml(request, _request) - True - diff -Nru owslib-0.16.0/tests/doctests/wps_request11_bbox.txt owslib-0.18.0/tests/doctests/wps_request11_bbox.txt --- owslib-0.16.0/tests/doctests/wps_request11_bbox.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_request11_bbox.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -Python doctest file to test generation of a WPS request from input arguments. -The specific request involves a "bbox" process submitted to the Emu WPS service -(https://github.com/bird-house/emu). - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml - >>> from owslib.wps import WebProcessingService, WPSExecution, BoundingBoxDataInput - >>> from owslib.etree import etree - -Process input/output arguments - - >>> processid = "bbox" - >>> bbox = BoundingBoxDataInput([51.9, 7.0, 53.0, 8.0]) - >>> inputs = [ ("bbox", bbox)] - -Build XML request for WPS process execution - - >>> execution = WPSExecution() - >>> requestElement = execution.buildRequest(processid, inputs) - >>> request = etree.tostring( requestElement ) - -Compare to cached XML request - - >>> _request = open(resource_file('wps_EmuExecuteRequest11.xml'), 'rb').read() - >>> compare_xml(request, _request) - True diff -Nru owslib-0.16.0/tests/doctests/wps_request2.txt owslib-0.18.0/tests/doctests/wps_request2.txt --- owslib-0.16.0/tests/doctests/wps_request2.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_request2.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -Python doctest file to test generation of a WPS request from input arguments. -The specific request involves a FeatureWeightedGridStatisticsAlgorithm process over a WFS feature. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml - >>> from owslib.wps import WPSExecution, WFSFeatureCollection, WFSQuery - >>> from owslib.etree import etree - -Supply process input arguments - - >>> wfsUrl = "http://igsarm-cida-gdp2.er.usgs.gov:8082/geoserver/wfs" - >>> query = WFSQuery("sample:CONUS_States", propertyNames=['the_geom',"STATE"], filters=["CONUS_States.508","CONUS_States.469"]) - >>> featureCollection = WFSFeatureCollection(wfsUrl, query) - >>> processid = 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' - >>> inputs = [ ("FEATURE_ATTRIBUTE_NAME","STATE"), - ... ("DATASET_URI", "dods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncml"), - ... ("DATASET_ID", "ccsm3_a1b_tmax"), - ... ("DATASET_ID", "ccsm3_a1b_pr"), - ... ("DATASET_ID", "ccsm3_a1fi_tmax"), - ... ("TIME_START","1960-01-01T00:00:00.000Z"), - ... ("TIME_END","1960-12-31T00:00:00.000Z"), - ... ("REQUIRE_FULL_COVERAGE","true"), - ... ("DELIMITER","COMMA"), - ... ("STATISTICS","MEAN"), - ... ("STATISTICS","MINIMUM"), - ... ("STATISTICS","MAXIMUM"), - ... ("STATISTICS","WEIGHT_SUM"), - ... ("STATISTICS","VARIANCE"), - ... ("STATISTICS","STD_DEV"), - ... ("STATISTICS","COUNT"), - ... ("GROUP_BY","STATISTIC"), - ... ("SUMMARIZE_TIMESTEP","true"), - ... ("SUMMARIZE_FEATURE_ATTRIBUTE","true"), - ... ("FEATURE_COLLECTION", featureCollection) - ... ] - >>> output = "OUTPUT" - - # build XML request for WPS process execution - >>> execution = WPSExecution() - >>> requestElement = execution.buildRequest(processid, inputs, output=output) - >>> request = etree.tostring( requestElement ) - -Compare to cached XML request - - >>> _request = open(resource_file('wps_USGSExecuteRequest2.xml'), 'rb').read() - >>> compare_xml(request, _request) - True - diff -Nru owslib-0.16.0/tests/doctests/wps_request3.txt owslib-0.18.0/tests/doctests/wps_request3.txt --- owslib-0.16.0/tests/doctests/wps_request3.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_request3.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -Python doctest file to test generation of a WPS request from input arguments. -The specific request involves a FeatureWeightedGridStatisticsAlgorithm process over a multi-polygon feature. - -Import python modules - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml - >>> from owslib.wps import GMLMultiPolygonFeatureCollection, WebProcessingService, WPSExecution - >>> from owslib.etree import etree - -Supply process input arguments - - >>> polygon = [(-102.8184, 39.5273), (-102.8184, 37.418), (-101.2363, 37.418), (-101.2363, 39.5273), (-102.8184, 39.5273)] - >>> featureCollection = GMLMultiPolygonFeatureCollection( [polygon] ) - >>> processid = 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' - >>> inputs = [ ("FEATURE_ATTRIBUTE_NAME","the_geom"), - ... ("DATASET_URI", "dods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncml"), - ... ("DATASET_ID", "ccsm3_a1b_tmax"), - ... ("TIME_START","1960-01-01T00:00:00.000Z"), - ... ("TIME_END","1960-12-31T00:00:00.000Z"), - ... ("REQUIRE_FULL_COVERAGE","true"), - ... ("DELIMITER","COMMA"), - ... ("STATISTICS","MEAN"), - ... ("STATISTICS","MINIMUM"), - ... ("STATISTICS","MAXIMUM"), - ... ("STATISTICS","WEIGHT_SUM"), - ... ("STATISTICS","VARIANCE"), - ... ("STATISTICS","STD_DEV"), - ... ("STATISTICS","COUNT"), - ... ("GROUP_BY","STATISTIC"), - ... ("SUMMARIZE_TIMESTEP","false"), - ... ("SUMMARIZE_FEATURE_ATTRIBUTE","false"), - ... ("FEATURE_COLLECTION", featureCollection) - ... ] - >>> output = "OUTPUT" - - # build XML request for WPS process execution - >>> execution = WPSExecution() - >>> requestElement = execution.buildRequest(processid, inputs, output=output) - >>> request = etree.tostring( requestElement ) - -Compare to cached XML request - - >>> _request = open(resource_file('wps_USGSExecuteRequest3.xml'), 'rb').read() - >>> compare_xml(request, _request) - True - diff -Nru owslib-0.16.0/tests/doctests/wps_request4.txt owslib-0.18.0/tests/doctests/wps_request4.txt --- owslib-0.16.0/tests/doctests/wps_request4.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_request4.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -Python doctest file to test generation of a WPS request from input arguments. -The specific request involves a "reprojectImage" process submitted to the PML WPS service. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml - >>> from owslib.wps import WebProcessingService, WPSExecution - >>> from owslib.etree import etree - -Process input/ouutput arguments - - >>> processid = "reprojectImage" - >>> inputs = [ ("inputImage","http://rsg.pml.ac.uk/wps/testdata/elev_srtm_30m.img"), - ... ("outputSRS", "EPSG:4326") ] - >>> output = "outputImage" - - # build XML request for WPS process execution - >>> execution = WPSExecution() - >>> requestElement = execution.buildRequest(processid, inputs, output=output) - >>> request = etree.tostring( requestElement ) - -Compare to cached XML request - - >>> _request = open(resource_file('wps_PMLExecuteRequest4.xml'), 'rb').read() - >>> compare_xml(request, _request) - True diff -Nru owslib-0.16.0/tests/doctests/wps_request5.txt owslib-0.18.0/tests/doctests/wps_request5.txt --- owslib-0.16.0/tests/doctests/wps_request5.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_request5.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -Python doctest file to test generation of a WPS request from input arguments. -The specific request involves a "reprojectCoords" process submitted to the PML WPS service. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml - >>> from owslib.wps import WebProcessingService, WPSExecution - >>> from owslib.etree import etree - -Process input/ouutput arguments - - >>> processid = "reprojectCoords" - >>> inputs = [ ("coords","http://rsg.pml.ac.uk/wps/testdata/coords.txt"), - ... ("outputSRS", "EPSG:32630"), - ... ("inputSRS","EPSG:4326") ] - - # build XML request for WPS process execution - >>> execution = WPSExecution() - >>> requestElement = execution.buildRequest(processid, inputs) - >>> request = etree.tostring( requestElement ) - -Compare to cached XML request - - >>> _request = open(resource_file('wps_PMLExecuteRequest5.xml'), 'rb').read() - >>> compare_xml(request, _request) - True diff -Nru owslib-0.16.0/tests/doctests/wps_request6.txt owslib-0.18.0/tests/doctests/wps_request6.txt --- owslib-0.16.0/tests/doctests/wps_request6.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_request6.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -Python doctest file to test generation of a WPS request from input arguments. -The specific request involves a "v.net.path" process submitted to the PML WPS service. - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml - >>> from owslib.wps import WebProcessingService, WPSExecution - >>> from owslib.etree import etree - -Process input/ouutput arguments - - >>> processid = "v.net.path" - >>> inputs = [ ("input","http://rsg.pml.ac.uk/wps/example/graph.gml"), - ... ("file","1 -960123.1421801624 4665723.56559387 -101288.65106088226 5108200.011823481")] - -Build XML request for WPS process execution - - >>> execution = WPSExecution() - >>> requestElement = execution.buildRequest(processid, inputs) - >>> request = etree.tostring( requestElement ) - -Compare to cached XML request - - >>> _request = open(resource_file('wps_PMLExecuteRequest6.xml'), 'rb').read() - >>> compare_xml(request, _request) - True diff -Nru owslib-0.16.0/tests/doctests/wps_request7.txt owslib-0.18.0/tests/doctests/wps_request7.txt --- owslib-0.16.0/tests/doctests/wps_request7.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_request7.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -Python doctest file to test generation of a WPS request from input arguments. -The specific request involves a "wordcount" process submitted to the Emu WPS service (https://github.com/bird-house/emu). - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml - >>> from owslib.wps import WebProcessingService, WPSExecution, ComplexDataInput - >>> from owslib.etree import etree - -Process input/ouutput arguments - - >>> processid = "wordcount" - >>> textdoc = ComplexDataInput("http://emu.readthedocs.org/en/latest/index.html") - >>> inputs = [ ("text",textdoc),] - -Build XML request for WPS process execution - - >>> execution = WPSExecution() - >>> requestElement = execution.buildRequest(processid, inputs) - >>> request = etree.tostring( requestElement ) - -Compare to cached XML request - - >>> _request = open(resource_file('wps_EmuExecuteRequest7.xml'), 'rb').read() - >>> compare_xml(request, _request) - True diff -Nru owslib-0.16.0/tests/doctests/wps_request8.txt owslib-0.18.0/tests/doctests/wps_request8.txt --- owslib-0.16.0/tests/doctests/wps_request8.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_request8.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -Python doctest file to test generation of a WPS request from input arguments. -The specific request involves a "wordcount" process submitted to the Emu WPS service (https://github.com/bird-house/emu). - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml - >>> from owslib.wps import WebProcessingService, WPSExecution, ComplexDataInput - >>> from owslib.etree import etree - -Process input/ouutput arguments - - >>> processid = "wordcount" - >>> textdoc = ComplexDataInput("Alice was beginning to get very tired ...") - >>> inputs = [ ("text",textdoc),] - -Build XML request for WPS process execution - - >>> execution = WPSExecution() - >>> requestElement = execution.buildRequest(processid, inputs) - >>> request = etree.tostring( requestElement ) - -Compare to cached XML request - - >>> _request = open(resource_file('wps_EmuExecuteRequest8.xml'), 'rb').read() - >>> compare_xml(request, _request) - True diff -Nru owslib-0.16.0/tests/doctests/wps_request9.txt owslib-0.18.0/tests/doctests/wps_request9.txt --- owslib-0.16.0/tests/doctests/wps_request9.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_request9.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -Python doctest file to test generation of a WPS request from input arguments. -The specific request involves a "helloworld" process submitted to the Emu WPS service (https://github.com/bird-house/emu). - -Imports - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml - >>> from owslib.wps import WebProcessingService, WPSExecution, ComplexDataInput - >>> from owslib.etree import etree - -Process input/ouutput arguments - - >>> processid = "helloworld" - >>> inputs = [ ("user", 'Pingu')] - -Build XML request for WPS process execution - - >>> execution = WPSExecution() - >>> requestElement = execution.buildRequest(processid, inputs) - >>> request = etree.tostring( requestElement ) - -Compare to cached XML request - - >>> _request = open(resource_file('wps_EmuExecuteRequest9.xml'), 'rb').read() - >>> compare_xml(request, _request) - True diff -Nru owslib-0.16.0/tests/doctests/wps_response6.txt owslib-0.18.0/tests/doctests/wps_response6.txt --- owslib-0.16.0/tests/doctests/wps_response6.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/doctests/wps_response6.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -Instantiate WPS - - >>> from __future__ import (absolute_import, division, print_function) - >>> from tests.utils import resource_file, compare_xml, setup_logging - >>> from owslib.wps import WebProcessingService - >>> logger = setup_logging('INFO') - -Build WPS object; service has been down for some time so skip caps here - - >>> wps = WebProcessingService('http://rsg.pml.ac.uk/wps/vector.cgi', skip_caps=True) - -Execute face WPS invocation - - >>> request = open(resource_file('wps_PMLExecuteRequest6.xml'), 'rb').read() - >>> response = open(resource_file('wps_PMLExecuteResponse6.xml'), 'rb').read() - >>> - >>> execution = wps.execute(None, [], request=request, response=response) - Executing WPS request... - Execution status=ProcessSucceeded - Percent completed=0 - Status message=PyWPS Process v.net.path successfully calculated - -Check execution result - >>> execution.status - 'ProcessSucceeded' - >>> execution.url - 'http://rsg.pml.ac.uk/wps/vector.cgi' - >>> execution.statusLocation - 'http://rsg.pml.ac.uk/wps/wpsoutputs/pywps-132084838963.xml' - >>> execution.serviceInstance - 'http://rsg.pml.ac.uk/wps/vector.cgi?service=WPS&request=GetCapabilities&version=1.0.0' - >>> execution.version - '1.0.0' - >>> output = execution.processOutputs[0] - - >>> output.identifier - 'output' - - >>> output.title - 'Name for output vector map' - - >>> output.mimeType - 'text/xml' - - >>> output.dataType - 'ComplexData' - - >>> output.reference - - >>> response = output.data[0] - >>> should_return = '''\n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t -960123.14218016264665723.56559387\n\t\t\t\t\t -101288.65106088225108200.011823481\n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t -960123.142180162365548,4665723.565593870356679,0 -960123.142180162365548,4665723.565593870356679,0 -960123.142180162598379,4665723.565593870356679,0 -960123.142180162598379,4665723.565593870356679,0 -711230.141176006174646,4710278.48552671354264,0 -711230.141176006174646,4710278.48552671354264,0 -623656.677859728806652,4848552.374973464757204,0 -623656.677859728806652,4848552.374973464757204,0 -410100.337491964863148,4923834.82589447684586,0 -410100.337491964863148,4923834.82589447684586,0 -101288.651060882242746,5108200.011823480948806,0 -101288.651060882242746,5108200.011823480948806,0 -101288.651060882257298,5108200.011823480948806,0 -101288.651060882257298,5108200.011823480948806,0\n\t\t\t\t\t 1\n\t\t\t\t\t 1\n\t\t\t\t\t 0\n\t\t\t\t\t 0\n\t\t\t\t\t 0\n\t\t\t\t\t 1002619.181\n\t\t\t\t\t 0\n\t\t\t\t\t 0\n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t''' - >>> compare_xml(should_return, response) - True diff -Nru owslib-0.16.0/tests/resources/csw_dov_getrecordbyid.xml owslib-0.18.0/tests/resources/csw_dov_getrecordbyid.xml --- owslib-0.16.0/tests/resources/csw_dov_getrecordbyid.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/csw_dov_getrecordbyid.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,844 @@ + + + + + 6c39d716-aecc-4fbc-bac8-4f05a49a78d5 + + + + + + + + + + + + + + + dataset + + + + + Vlaamse overheid - Vlaamse MilieuMaatschappij - Afdeling Operationeel Waterbeheer + + + + + + + Koning Albert II-laan 20 bus 16 + + + Brussel + + + 1000 + + + België + + + info@vmm.be + + + + + + + https://www.vmm.be + + + + + + + + + + + + 2018-02-21T16:14:24 + + + ISO 19115/2003/Cor.1:2006 + + + GDI-Vlaanderen Best Practices - versie 1.0 + + + + + + + 31370 + + + EPSG + + + + + + + + + + + 5710 + + + EPSG + + + + + + + + + + + http://www.opengis.net/def/crs/EPSG/0/3043 + + + EPSG + + + + + + + + + + + Grondwatermeetnetten + + + Grondwatermeetnetten beschikbaar op DOV + + + + + 2002-05-22 + + + + + + + + + + 2002-05-22 + + + + + + + + + + A64F073B-9FBE-91DD-36FDE7462BBAFA61 + + + DOV-be + + + + + + + In de Databank Ondergrond Vlaanderen zijn verschillende grondwatermeetnetten opgenomen. Deze meetnetten staan in functie van uitgebreide monitoringprogramma’s met de bedoeling een goed beeld te krijgen van de beschikbare grondwaterkwantiteit en grondwaterkwaliteit van de watervoerende lagen in Vlaanderen. + + + Het doel van de meetnetten is inzicht krijgen in de kwaliteit en kwantiteit van de watervoerende lagen in de ondergrond van Vlaanderen. Algemeen kan gesteld worden dat de grondwatermeetnetten een belangrijk beleidsinstrument vormen : + * ter onderbouwing van het te voeren grondwaterbeleid; + * ter onderbouwing van het te voeren bodembeleid; + * met het oog op het onderling afstemmen van het grond- en oppervlaktewaterbeheer; + * ter ondersteuning bij het adviseren van vergunningsaanvragen voor grondwaterwinning; + * bij het beantwoorden van juridische vragen; + * bij de berekening van de effecten van peilverlagingen; + * … . + + + + + + + + Vlaamse overheid - Vlaamse MilieuMaatschappij - Afdeling Operationeel Waterbeheer + + + + + + + Koning Albert II-laan 20 bus 16 + + + Brussel + + + 1000 + + + België + + + info@vmm.be + + + + + + + https://www.vmm.be + + + + + + + + + + + + + + Databank Ondergrond Vlaanderen (DOV) + + + + + + + +32 9 240 75 93 + + + + + + + Technologiepark Gebouw 905 + + + Zwijnaarde + + + 9052 + + + België + + + dov@vlaanderen.be + + + + + + + https://www.dov.vlaanderen.be + + + + + + + + + + + + + + https://www.dov.vlaanderen.be/geonetwork/srv/eng/resources.get?uuid=6c39d716-aecc-4fbc-bac8-4f05a49a78d5&fname=meetnet2_s.png + + + thumbnail + + + png + + + + + + + https://www.dov.vlaanderen.be/geonetwork/srv/eng/resources.get?uuid=6c39d716-aecc-4fbc-bac8-4f05a49a78d5&fname=meetnet2.png + + + large_thumbnail + + + png + + + + + + + Geologie + + + + + + + + GEMET - INSPIRE thema's, versie 1.0 + + + + + 2008-06-01 + + + + + + + + + + + + + + grondwater + + + meetnet(werk) + + + + + + + + GEMET - Concepten, versie 2.4 + + + + + 2010-01-13 + + + + + + + + + + + + + + Vlaams Gewest + + + + + + + + Vlaamse regio's + + + + + 2013-09-25 + + + + + + + + + + + + + + Toegevoegd GDI-Vl + + + Herbruikbaar + + + Vlaamse Open data + + + Kosteloos + + + Lijst M&R INSPIRE + + + Metadata INSPIRE-conform + + + Metadata GDI-Vl-conform + + + + + GDI-Vlaanderen Trefwoorden + + + + + 2014-02-26 + + + + + + + + + + + + + + Ondergrond + + + DOV + + + Vlaanderen + + + monitoring + + + meetnetten + + + Kaderrichtlijn Water + + + Decreet Integraal waterbeleid + + + + + DOV + + + + + 2010-12-01 + + + + + + + + + + + + + + Zie 'Overige beperkingen' + + + + + + + Bij het gebruik van de informatie die DOV aanbiedt, dient steeds volgende standaardreferentie gebruikt te worden: Databank Ondergrond Vlaanderen - (vermelding van de beheerder en de specifieke geraadpleegde gegevens) - Geraadpleegd op dd/mm/jjjj, op https://www.dov.vlaanderen.be + + + Volgende aansprakelijkheidsbepalingen gelden: https://www.dov.vlaanderen.be/page/disclaimer + + + + + + Data beschikbaar voor hergebruik volgens de Modellicentie Gratis Hergebruik. Toelichting beschikbaar op https://www.dov.vlaanderen.be/page/gebruiksvoorwaarden-dov-services + + + + + + + + + + + + + + + + + + + 10000 + + + + + + + + + + + + + geoscientificInformation + + + + + + + 2.549 + + + 5.902 + + + 50.697 + + + 51.495 + + + + + + + + + Vlaanderen + + + + + + + + + + 1900-01-01 + 2999-01-01T00:00:00 + + + + + + + + https://www.dov.vlaanderen.be/page/grondwatermeetnet + + + + + + + true + + + + + Grondwatermeetnetten (objectencatalogus) + + + + + 2017-06-29 + + + + + + + + 1 + + + + + + + + + + + GML + + + 2.1.2 + + + + + + + + + Databank Ondergrond Vlaanderen (DOV) + + + + + + + +32 9 240 75 93 + + + + + + + Technologiepark Gebouw 905 + + + Zwijnaarde + + + 9052 + + + België + + + dov@vlaanderen.be + + + + + + + https://www.dov.vlaanderen.be + + + + + + + + + + + + + + Gratis + + + + + + + + + + + https://www.dov.vlaanderen.be/geoserver/ows?SERVICE=WMS& + + + OGC:WMS + + + gw_meetnetten:meetnetten + + + WMS-endpoint Grondwatermeetnetten + + + + + + + https://www.dov.vlaanderen.be/geoserver/ows?SERVICE=WMS&version=1.3.0&request=GetCapabilities + + + OGC:WMS-1.3.0-http-get-capabilities + + + gw_meetnetten:meetnetten + + + WMS-capabilities Grondwatermeetnetten + + + + + + + https://www.dov.vlaanderen.be/geoserver/ows?SERVICE=WMS&version=1.3.0&request=GetMap + + + OGC:WMS-1.3.0-http-get-map + + + gw_meetnetten:meetnetten + + + WMS-map Grondwatermeetnetten + + + + + + + https://www.dov.vlaanderen.be/geoserver/wfs? + + + OGC:WFS + + + gw_meetnetten:meetnetten + + + WFS-endpoint Grondwatermeetnetten + + + + + + + https://www.dov.vlaanderen.be/geoserver/wfs?SERVICE=WFS&version=1.1.0&request=GetCapabilities + + + OGC:WFS-1.1.0-http-get-capabilities + + + gw_meetnetten:meetnetten + + + WFS-capabilities Grondwatermeetnetten + + + + + + + https://www.dov.vlaanderen.be/geoserver/wfs?SERVICE=WFS&version=1.1.0&request=GetFeature + + + OGC:WFS-1.1.0-http-get-feature + + + gw_meetnetten:meetnetten + + + WFS-getfeature Grondwatermeetnetten + + + + + + + https://www.dov.vlaanderen.be/geoserver/wms/kml?layers=gw_meetnetten:meetnetten + + + GLG:KML-2.0-http-get-map + + + gw_meetnetten:meetnetten + + + KML Grondwatermeetnetten + + + + + + + https://www.dov.vlaanderen.be/bodemverkenner + + + WWW:LINK-1.0-http--related + + + DOV bodemverkenner + + + Link naar DOV bodemverkenner applicatie + + + + + + + + + + + + + + + + + + + + + + + + VERORDENING (EU) Nr. 1089/2010 VAN DE COMMISSIE van 23 november 2010 ter uitvoering van Richtlijn 2007/2/EG van het Europees Parlement en de Raad betreffende de interoperabiliteit van verzamelingen ruimtelijke gegevens en van diensten met betrekking tot ruimtelijke gegevens + + + + + 2010-12-08 + + + + + + + + + + Zie vermelde specificatie + + + true + + + + + + + + + Lijst met de verschillende meetnetten in DOV: +» meetnet 0: oorsprong/beheerder onbekend - (niet in service opgenomen); +» meetnet 1: meetputten VMM afdeling Operationeel Waterbeheer - primair meetnet, vooral diepere meetputten, gebruikt voor kwantiteitsbeheer, kwalitatieve toestandsmonitoring en operationele monitoring; +» meetnet 2: meetputten VMM afdeling Operationeel Waterbeheer - vooral diepere meetputten (initieel onderdeel van het primair meetnet) met onzekere kwaliteit van meetgegevens en beschikbare putinfo - zijn indicatief maar worden niet weerhouden in het kader van rapporteringsverplichtingen - (niet in service opgenomen); +» meetnet 3: meetputten VMM afdeling Operationeel Waterbeheer - gebruikt voor tijdelijke projecten; +» meetnet 4: meetputten van andere Vlaamse en Belgische overheden of instanties - (niet in service opgenomen); +» meetnet 5: meetputten van drinkwater­maatschappijen - (niet in service opgenomen); +» meetnet 6: meetputten van privé-bedrijven - (niet in service opgenomen); +» meetnet 7: grondwaterwinningsputten (pompputten) - (niet in service opgenomen); +» meetnet 8: meetputten VMM afdeling Operationeel Waterbeheer – freatisch meetnet, vooral ondiepe meetputten in de eerste watervoerende laag, gebruikt voor kwalitatieve toestandsmonitoring en operationele monitoring; +» meetnet 9: meetputten van het Instituut voor Natuur- en Bosonderzoek (INBO) en andere natuur­organisaties; +» meetnet 10: putten die worden aangelegd in de VLAREM rubriek 55 (Verticale boringen ten behoeve van de aanleg van peilputten en voor andere doeleinden, andere dan deze bedoeld in de rubrieken 53, 54 en 55.2; diepteboringen) - (niet in service opgenomen). + + + + + + + + diff -Nru owslib-0.16.0/tests/resources/csw_geobretagne_mdmetadata.xml owslib-0.18.0/tests/resources/csw_geobretagne_mdmetadata.xml --- owslib-0.16.0/tests/resources/csw_geobretagne_mdmetadata.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/csw_geobretagne_mdmetadata.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,760 @@ + + + + 955c3e47-411e-4969-b61b-3556d1b9f879 + + + fre + + + + + + + + + + + + Jeu de données + + + + + DIRECTION GENERALE DES FINANCES PUBLIQUES BUREAU GF-3A + + + + + + + bureau.gf3a@dgfip.finances.gouv.fr + + + + + + + + + + + + 2018-07-30T14:19:40 + + + ISO 19115 + + + 1.0 + + + + + + + + + + + + + + RGF93 / CC48 (EPSG:3948) + + + EPSG + + + 7.4 + + + + + + + + + + + RGF93 / CC50 (EPSG:3950) + + + EPSG + + + 7.4 + + + + + + + + + + + RGF93 / Lambert-93 (EPSG:2154) + + + EPSG + + + 7.4 + + + + + + + + + + + Cadastre 2018 en Bretagne + + + + + 2018-09-01 + + + + + + + + + + https://geobretagne.fr/geonetwork/apps/georchestra/?uuid=363e3a8e-d0ce-497d-87a9-2a2d58d82772 + + + + + + + Le plan du cadastre est un document administratif qui propose l’unique plan parcellaire à grande échelle couvrant le territoire national. +Le plan du cadastre d’une commune est découpé en sections, elles-mêmes pouvant être découpées en subdivisions de sections, communément appelées « feuilles de plan ». +- La section cadastrale est une portion du territoire communal dont le périmètre est généralement constitué par des limites présentant un caractère relativement stable sur le terrain (route, chemins, cours d’eau…). +- La parcelle est l’unité cadastrale de base. C’est un terrain d’un seul tenant situé dans un même lieudit et appartenant à un même propriétaire. +- Le plan du cadastre au format vecteur est issu majoritairement de numérisation du plan cadastral papier ou raster réalisée dans le cadre de conventions avec les collectivités territoriales. Dans une moindre mesure, il a été confectionné directement au format numérique dans le cadre de la production de plans cadastraux neufs (procédure du remaniement prévue par la loi n° 78-645 du 18 juillet 1974) ou d’aménagements fonciers agricoles et forestiers (communément désignés sous le terme « remembrements »). +Les plans cadastraux au format vecteur en France métropolitaine sont actuellement géoréférencés dans le système légal (RGF93) à l’aide des projections « coniques conformes 9 zones ». Le géoréférencement des plans vecteur a pu être obtenu : +- lors de leur confection (cas des plans cadastraux très récents) ; +- après transformation de leurs coordonnées exprimées dans la projection Lambert zones ; +- lors de leur vectorisation (cas des plans non initialement géoréférencés) + + + Le but premier du plan cadastral est d'identifier, de localiser et représenter la propriété foncière, ainsi que de servir à l'assise de la fiscalité locale des propriétés non bâties. Par suite, l’article 110 de la loi n° 2009-526 du 12 mai 2009, abrogé et recodifié par l'Ordonnance n° 2010-1232 du 21 octobre 2010 à l'article L127-10 -I du Code de l'environnement dispose qu'en matière de découpage parcellaire et de représentation du bâti, le plan cadastral est la donnée de référence. + + + + + + + + DIRECTION GENERALE DES FINANCES PUBLIQUES + + + DGFIP Bretagne + + + + + + + bureau.gf3a@dgfip.finances.gouv.fr + + + + + Logo + + + + + + + + + + + + + + + + + DIRECTION GENERALE DES FINANCES PUBLIQUES / bureau GF-3A + + + DGFIP Bretagne + + + + + + + + + + + + + + + France + + + + + + + + + + + bâtiments + + + adresses + + + parcelles cadastrales + + + hydrographie + + + réseaux de transport + + + unités administratives + + + référentiels de coordonnées + + + + + + + + + + bâtis + + + sections + + + parcelles + + + cadastre + + + cadastrale + + + + + + + + + + référentiels : cadastre + + + + + + + + GéoBretagne v 2.0 + + + + + 2014-01-13 + + + + + + + + + + geonetwork.thesaurus.external.theme.geobretagne + + + + + + + + + + + Parcelles cadastrales + + + + + + + + INSPIRE themes + + + + + 2008-06-01 + + + + + + + + + + geonetwork.thesaurus.external.theme.inspire-theme + + + + + + + + + + + cadastre + + + bâtiment + + + + + + + + GEMET + + + + + 2012-07-20 + + + + + + + + + + geonetwork.thesaurus.external.theme.gemet + + + + + + + + + + + le plan cadastral décrit les limites apparentes de la propriété. + + + « En dépit des efforts et diligences mis en oeuvre pour en vérifier la fiabilité, le partenaire fournisseur n’est pas en mesure de garantir l’exactitude, la mise à jour, l’intégrité, l’exhaustivité des données et en particulier que les données sont exemptes d'erreurs, notamment de localisation, d’identification ou d’actualisation ou d’imprécisions. Les données ne sont pas fournies en vue d'une utilisation particulière et aucune garantie quant à leur aptitude à un usage particulier n'est apportée par le partenaire fournisseur. En conséquence, les utilisateurs utilisent les données sous leur responsabilité pleine et entière, à leurs risques et périls, sans recours possible contre le partenaire fournisseur dont la responsabilité ne saurait être engagée du fait d’un dommage résultant directement ou indirectement de l’utilisation de ces données. En particulier, il appartient aux utilisateurs d’apprécier, sous leur seule responsabilité : o l'opportunité d'utiliser les données ; o la compatibilité des fichiers avec leurs systèmes informatiques ; o l’adéquation des données à leurs besoins ; o qu’ils disposent de la compétence suffisante pour utiliser les données ; o l’opportunité d’utiliser la documentation ou les outils d’analyse fournis ou préconisés, en relation avec l’utilisation des données, le cas échéant. Le fournisseur partenaire n’est en aucune façon responsable des éléments extérieurs aux données et notamment des outils d’analyse, matériels, logiciels, réseaux..., utilisés pour consulter et/ou traiter les données, même s’il a préconisé ces éléments. L’utilisateur veille à vérifier que l’actualité des informations mises à disposition est compatible avec l’usage qu’il en fait. » + + + + + + + + + Usage libre sous réserve des mentions obligatoires sur tout document de diffusion : "Source : DGFIP" + + + + + + + + + + + + 500 + + + + + + + fre + + + + + + planningCadastre + + + + + Bretagne + + + + + -5.23515625 + + + -1.1921875 + + + 46.755859375 + + + 49.30468750000001 + + + + + + + + + + + ISO 3166 alpha 3 + + + + + 2019-02-19 + + + + + + + + + + FXX + + + + + + + + + La légende du plan cadastral est consultable sur: http://www.cadastre.gouv.fr/scpc/pdf/legendes/FR_fr/Legende%20du%20plan%20sur%20internet.pdf + + + + + + + false + + + + + + + + + + DXF + + + 12.0 + + + DXF-PCI + + + + + + + AUTODESK + + + + + + + + + + + + + + EDIGEO + + + 1.0 + + + NF Z 52-000 + + + + + + + AFNOR + + + + + + + + + + + + + + Jpeg + + + (ISO/IEC 10918-4:1999) + + + + + + + ISO organisation internationale de normalisation + + + + + + + + + + + + + + gif + + + 89a + + + + + + + CompuServe + + + + + + + + + + + + + + + + DIRECTION GENERALE DES FINANCES PUBLIQUES + + + + + + + bureau.gf3a@dgfip.finances.gouv.fr + + + + + + + + + + + + + + cas courant 9.5€/feuille pour les commandes volumineuses voir prochainement conditions sur site + + + + + + + + + + + http://www.cadastre.gouv.fr + + + WWW:LINK-1.0-http--link + + + SCPC + + + Service de consultation du plan cadastral + + + + + + + + + + + http://www.impots.gouv.fr/portal/dgi/public/popup;jsessionid=YEKIOSL2VA1SFQFIEIQCFFA?pageId=collectivites&espId=3&typePage=cpr02&docOid=documentstandard_6522&temNvlPopUp=true + + + WWW:LINK-1.0-http--related + + + SCPC + + + Lien officiel de description des données + + + + + + + + + + + + + + + + + + + + + + + + INSPIRE Data Specification on Cadastral Parcels - Guidelines v 3.0.1 + + + + + 2010-11-30 + + + + + + + + + + 1.2 + + + INSPIRE + + + + + + + Ressource concernée par INSPIRE +Degré de conformité de la ressource par rapport aux spécifications visées d'Inspire Conforme + + + false + + + + + + + + + Les plans cadastraux au format vecteur gérés et exportés par les services de la DGFiP ont été confectionnées à partir de levers terrain. Selon les feuilles de plan, les conditions de vectorisation et de géoréférencement sont diverses. Ces informations sont disponibles sur les fiches de chacune des communes. + +Les plans cadastraux sont de plusieurs types : + +- plans dits « mis à jour » : ce sont des plans cadastraux mis à jour à partir de la trame des plans cadastraux napoléoniens. Ce ne sont pas des plans réguliers. Ces feuilles de plan sont identifiables par leur section à lettre unique (par exemple « section A »). Les échelles des feuilles de plan peuvent être variables et sont principalement aux échelles suivantes : 1/1250, 1/2500 et 1/5000 ; + +- plans dits « réguliers » : ce sont des plans qui ont été confectionnés lors de la rénovation du cadastre sans reprendre la trame des plans napoléoniens. Parmi ces plans, l’on distingue deux catégories : + +- les plans dits « renouvelés » : ce sont des plans qui n’ont pas fait l’objet lors de leur confection d’une délimitation contradictoire des propriétés sur le terrain ; + +- les plans « refaits » qui ont quant à eux fait l’objet d’une délimitation contradictoire des propriétés ; + +Lorsque le plan cadastral n’est plus en mesure de répondre aux besoins (notamment en raison de son échelle ou de son imprécision éventuelle), il peut être refait selon la procédure du « remaniement » prévue par la loi n° 78-645 du 18 juillet 1974. + +Les plans cadastraux résultant d’opérations d’aménagements fonciers sont appelés « plans remembrés ». + +L’identifiant d’une feuille de plan est de la forme : « DDCCCPPPSSNN » où : + +- « DD » est le numéro du département ; + +- « CCC » le code INSEE de la commune ; + +- « PPP » le préfixe de section. Par défaut ce préfixe est égale à « 000 » sauf dans les cas suivants : + +- en cas d’absorption de commune, ce préfixe a pour valeur le code INSEE de la commune absorbée ; + +- en cas de communes à arrondissements, ce préfixe contient le code de l’arrondissement (pour Paris de 101 à 120, pour Lyon de 381 à 389, pour Marseille de 201 à 216, dans le cas de la ville de Toulouse il s’agit du code de quartier prenant les valeurs de 801 à 846) + +- « SS » est la désignation de la section « cadastrale » (en cas de lettre de section unique, la lettre de section est précédée du chiffre « 0 » par exemple « section 0A ») ; + +- « NN » est le numéro de la feuille (« 01 » par défaut) + + + + + + + + + + + + + + DGFiP Bureau GF-3A + + + + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/csw_10entries.xml owslib-0.18.0/tests/resources/owc_atom_examples/csw_10entries.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/csw_10entries.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/csw_10entries.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,537 @@ + + + + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/0006276a-4f6e-47c1-94bb-f604245fac57 + Compusult CSW + An ATOM record version of Compusult's CSW using OWS-Context + Web Enterprise Suite + 2013-01-02T15:24:24.446-03:30 + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/http://ows-9.compusult.net/wes/serviceManagerCSW/csw/9496276a-4f6e-47c1-94bb-f604245fac57 + gml:AbstractFeature + + 2013-01-02T15:24:24.446-03:30 + + interactive-instruments + + Compusult Limited + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + + + + + + + full + + + + csw:Record/@id + 9496276a-4f6e-47c1-94bb-f604245fac57 + + + + + + + + + + + + + + + + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/f26a459a-b141-48cd-ab15-ea5eeaddeea0 + tds:AircraftHangarGeopoint + + 2013-01-02T15:24:24.446-03:30 + + interactive-instruments + + Compusult Limited + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + + + + + + + full + + + + csw:Record/@id + f26a459a-b141-48cd-ab15-ea5eeaddeea0 + + + + + + + + + + + + + + + + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/971d101a-c95d-481f-af52-a30b5d378c10 + tds:AircraftHangarGeosurface + + 2013-01-02T15:24:24.446-03:30 + + interactive-instruments + + Compusult Limited + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + + + + + + + full + + + + csw:Record/@id + 971d101a-c95d-481f-af52-a30b5d378c10 + + + + + + + + + + + + + + + + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/73afa126-de25-4dc2-952d-2a403d248cb6 + tds:AmphitheatreGeosurface + + 2013-01-02T15:24:24.446-03:30 + + interactive-instruments + + Compusult Limited + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + + + + + + + full + + + + csw:Record/@id + 73afa126-de25-4dc2-952d-2a403d248cb6 + + + + + + + + + + + + + + + + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/eb3d21b9-a855-4d3d-9e3c-6d61df8cb5aa + tds:ApronGeosurface + + 2013-01-02T15:24:24.446-03:30 + + interactive-instruments + + Compusult Limited + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + + + + + + + full + + + + csw:Record/@id + eb3d21b9-a855-4d3d-9e3c-6d61df8cb5aa + + + + + + + + + + + + + + + + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/e441301b-eccb-4536-b992-3e48c1745474 + tds:BridgeGeocurve + + 2013-01-02T15:24:24.446-03:30 + + interactive-instruments + + Compusult Limited + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + + + + + + + full + + + + csw:Record/@id + e441301b-eccb-4536-b992-3e48c1745474 + + + + + + + + + + + + + + + + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/ff1bfa9a-b476-42d8-90ed-3be0b1436162 + tds:BrushGeosurface + + 2013-01-02T15:24:24.446-03:30 + + interactive-instruments + + Compusult Limited + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + + + + + + + full + + + + csw:Record/@id + ff1bfa9a-b476-42d8-90ed-3be0b1436162 + + + + + + + + + + + + + + + + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/b8bc014f-b272-410f-9176-3156fbcc3837 + tds:BuildingGeopoint + + 2013-01-02T15:24:24.446-03:30 + + interactive-instruments + + Compusult Limited + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + + + + + + + full + + + + csw:Record/@id + b8bc014f-b272-410f-9176-3156fbcc3837 + + + + + + + + + + + + + + + + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/d6ec724b-858f-46ef-8d54-12734a665ee3 + tds:BuildingGeosurface + + 2013-01-02T15:24:24.446-03:30 + + interactive-instruments + + Compusult Limited + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + + + + + + + full + + + + csw:Record/@id + d6ec724b-858f-46ef-8d54-12734a665ee3 + + + + + + + + + + + + + + + + + http://ows-9.compusult.net/wes/serviceManagerCSW/csw/c68b9261-85c3-4266-9f1c-7ccd7498434d + tds:BuiltUpAreaGeosurface + + 2013-01-02T15:24:24.446-03:30 + + interactive-instruments + + Compusult Limited + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + + + + + + + full + + + + csw:Record/@id + c68b9261-85c3-4266-9f1c-7ccd7498434d + + + + + + + + + + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/geotiff.xml owslib-0.18.0/tests/resources/owc_atom_examples/geotiff.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/geotiff.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/geotiff.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,30 @@ + + + + http://www.opengis.net/owc/1.0/examples/geotiff + GeoTIFF Example + + GeoTIFF Example + + + Joan Masó + + 2012-11-04T17:26:23Z + + ftp://ftp.remotesensing.org/pub/geotiff/samples/gdal_eg/cea.txt + GeoTIFF Example + 2011-11-01T00:00:00Z + CREAF + GeoTIFF Example coming from ftp://ftp.remotesensing.org/pub/geotiff/samples/gdal_eg + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/gmlcov.xml owslib-0.18.0/tests/resources/owc_atom_examples/gmlcov.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/gmlcov.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/gmlcov.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,75 @@ + + + + http://www.opengis.net/owc/1.0/examples/gmlcov + GMLCOV Example + + GMLCOV Example + + + Joan Masó + + 2012-11-04T17:26:23Z + + http://www.opengis.net/spec/owc-atom/1.0/req/gmlcov/1 + GMLCOV Example + 2011-11-01T00:00:00Z + CREAF + GMLCOV example + + + + + + -90 -180 + 90 180 + + + + + + + 0 0 + 202 259 + + + Lat Long + + + + + + ftp://ftp.remotesensing.org/pub/geotiff/samples/gdal_eg/cea.tif + + image/tiff + + + + + + + Gray Channel + + + + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/gml_road.xml owslib-0.18.0/tests/resources/owc_atom_examples/gml_road.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/gml_road.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/gml_road.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,68 @@ + + + + http://www.opengis.net/owc/1.0/examples/gml + + Context Example :: Examples of GML + 2012-02-21T11:58:23Z + + John Doe + JohnDoe@example.com + http://example.com/~johndoe + + ACME Project + + ACME OWS Context Server + + + Copyright (c) 2012. Some rights reserved. This feed + licensed under a Creative Commons Attribution 3.0 License. + + + + -90.0 -180.0 + 90.0 180.0 + + + 2009-01-23T09:08:56.000Z/2009-01-23T09:14:08.000Z + + + + http://www.opengis.net/owc/1.0/examples/gml/1 + + Some Useful Road + + 2012-05-10T14:35:00.400Z + + + Some Useful Road + + + + + + + + + 300 200 + 350 222 + + + 4.1 + M30 + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/meris.atom owslib-0.18.0/tests/resources/owc_atom_examples/meris.atom --- owslib-0.16.0/tests/resources/owc_atom_examples/meris.atom 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/meris.atom 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,97 @@ + + + + GeoServer Web Map Service + http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&/ + A compliant implementation of WMS plus most of the SLD extension (dynamic styling). Can also generate PDF, SVG, KML, GeoRSS + 2012-10-12T19:11:19Z + ESA + + OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) + + + Terradue Srl. + Copyright (c) 2012. Some rights reserved. This feed is + licensed under a Creative Commons Attribution 3.0 License. + + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + + + http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&/ + MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif + + GeoServer Administrator + info@genesi-dec.eu + http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS& + + ESA + 2012-10-12T19:11:19Z + Fee:NONE / Contraints:NONE + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + <br/> + <img border='1' align='right' height='100'src='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&BBOX=-2,45,8,55&WIDTH=100&HEIGHT=100&LAYERS=385d7d71-650a-414b-b8c7-739e2c0b5e76:MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif&STYLES=raster&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'/> + + <br/> + This resource is available from a OGC WMS Service (version 1.1.1) and it contains the following access points: + <ul> + <li> + <a href='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&BBOX=-2,45,8,55SRS=EPSG:4326&WIDTH=500&HEIGHT=500&LAYERS=385d7d71-650a-414b-b8c7-739e2c0b5e76:MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'> + GetMap </a> request in image/png (atom:link[@rel="enclosure"]) + </li> + + <li> + <a href='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities'> + GetCapabilities </a> request (atom:link[@rel="via"]) + </li> + </li> + </ul> + Generated from session 385d7d71-650a-414b-b8c7-739e2c0b5e76 on Mon Sep 10 17:49:17 UTC 2012 + <p style='font-size:small'>OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) by Terradue Srl.</p> + + + + + + raster + Default Raster + A sample style that draws a raster, good for displaying imagery + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/meris_borders_users.atom owslib-0.18.0/tests/resources/owc_atom_examples/meris_borders_users.atom --- owslib-0.16.0/tests/resources/owc_atom_examples/meris_borders_users.atom 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/meris_borders_users.atom 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,196 @@ + + + Satellite Image and Countries borders over France and England and the list of OGC users + https://github.com/Terradue/trax/tree/master/owc/bin/../examples/meris_borders_users.atom/ + Two WMS layers from different servers giving an operational setting + 2012-10-12T19:00:53 + Terradue srl. + + OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) + + + Terradue Srl. + Copyright (c) 2012. Some rights reserved. This feed is + licensed under a Creative Commons Attribution 3.0 License. + + + + + http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&/ + MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif + + GeoServer Administrator + info@genesi-dec.eu + http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS& + + ESA + 2012-10-12T19:00:27Z + Fee:NONE / Contraints:NONE + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + <br/> + <img border='1' align='right' height='100'src='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&BBOX=-2,45,8,55&WIDTH=100&HEIGHT=100&LAYERS=385d7d71-650a-414b-b8c7-739e2c0b5e76:MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif&STYLES=raster&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'/> + + <br/> + This resource is available from a OGC WMS Service (version 1.1.1) and it contains the following access points: + <ul> + <li> + <a href='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&BBOX=-2,45,8,55SRS=EPSG:4326&WIDTH=500&HEIGHT=500&LAYERS=385d7d71-650a-414b-b8c7-739e2c0b5e76:MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'> + GetMap </a> request in image/png (atom:link[@rel="enclosure"]) + </li> + + <li> + <a href='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities'> + GetCapabilities </a> request (atom:link[@rel="via"]) + </li> + </li> + </ul> + Generated from session 385d7d71-650a-414b-b8c7-739e2c0b5e76 on Mon Sep 10 17:49:17 UTC 2012 + <p style='font-size:small'>OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) by Terradue Srl.</p> + + + + + + raster + Default Raster + A sample style that draws a raster, good for displaying imagery + + + + + + http://nsidc.org/cgi-bin/atlas_north?/ + countries + + NSIDC User Services + nsidc@nsidc.org + http://nsidc.org/cgi-bin/atlas_north? + + Socioeconomic Data and Applications Center + National Snow and Ice Data Center + 2012-10-12T19:00:28Z + Fee:none / Contraints:none + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + + + <br/> + <img border='1' align='right' height='100'src='http://nsidc.org/cgi-bin/atlas_north?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&BBOX=-2,45,8,55&WIDTH=100&HEIGHT=100&LAYERS=country_borders&STYLES=&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'/> + + <b><a href='http://sedac.ciesin.columbia.edu'>Socioeconomic Data and Applications Center</a></b> + + <img src='http://sedac.ciesin.columbia.edu/images/logo.jpg' hspace='20' align='left' width='53' height='60'> + + <br/> + This resource is available from a OGC WMS Service (version 1.1.1) and it contains the following access points: + <ul> + <li> + <a href='http://nsidc.org/cgi-bin/atlas_north?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&BBOX=-2,45,8,55SRS=EPSG:4326&WIDTH=500&HEIGHT=500&LAYERS=country_borders&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'> + GetMap </a> request in image/png (atom:link[@rel="enclosure"]) + </li> + + <li> + <a href='http://nsidc.org/cgi-bin/atlas_north?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities'> + GetCapabilities </a> request (atom:link[@rel="via"]) + </li> + </li> + <li> + DataURL is available <a href='http://sedac.ciesin.columbia.edu/gpw/global.jsp?file=gpwv3&data=c_ntlbnd&type=shp&year=2000'> + shapefile + </a> + </li> + </ul> + Center for International Earth Science Information Network (CIESIN), Columbia University; and Centro Internacional de Agricultura Tropical (CIAT). 2005. Gridded Population of the World Version 3 (GPWv3): National Boundaries. Palisades, NY, USA: Socioeconomic Data and Applications Center (SEDAC), Columbia University. Available at http://sedac.ciesin.columbia.edu/gpw. 19 January 2007. Background: National boundaries derived from the Gridded Population of the World (GPW) country-level land area grids at 2.5 arc-minute resolution. Permanent ice and all but large lakes have been merged with neighbouring polygons to make a layer more appropriate for cartographic visualization of the data. Does not include Antarctica. + <p style='font-size:small'>OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) by Terradue Srl.</p> + + + + + + + + http://meet.opengeospatial.org:8080/geoserver/wfstopp:member_map/ + OGC members + + Raj Singh + + + + Open Geospatial Consortium + 2012-10-12T19:00:50Z + Fee:NONE / Contraints:NONE + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + <br/> + This resource is available from a OGC WFS Service (version 1.1.0) and it contains the following access points: + <ul> + <li> + <a href='http://meet.opengeospatial.org:8080/geoserver/wfs?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&BBOX=45,-2,55,8&OUTPUTFORMAT=text/xml; subtype=gml/3.1.1&TYPENAME=topp:member_map&MAXFEATURES=10'> + GetFeature </a> request in text/xml; subtype=gml/3.1.1 (atom:link[@rel="enclosure"]) + </li> + + <li> + <a href='http://meet.opengeospatial.org:8080/geoserver/wfs?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetCapabilities'> + GetCapabilities </a> request (atom:link[@rel="via"]) + </li> + </li> + <li> + <a href='http://meet.opengeospatial.org:8080/geoserver/wfs?SERVICE=WFS&VERSION=1.1.0&REQUEST=describeFeatureType&TYPENAME=topp:member_map'> + Describe Feature </a> request for topp:member_map (atom:link[@rel="describedby"]) + </li> + </ul> + + <p style='font-size:small'>OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) by Terradue Srl.</p> + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/meris_noauthor.xml owslib-0.18.0/tests/resources/owc_atom_examples/meris_noauthor.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/meris_noauthor.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/meris_noauthor.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,92 @@ + + + + GeoServer Web Map Service + http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&/ + A compliant implementation of WMS plus most of the SLD extension (dynamic styling). Can also generate PDF, SVG, KML, GeoRSS + 2012-10-12T19:11:19Z + ESA + + OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) + + + Terradue Srl. + Copyright (c) 2012. Some rights reserved. This feed is + licensed under a Creative Commons Attribution 3.0 License. + + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + + + http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&/ + MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif + ESA + 2012-10-12T19:11:19Z + Fee:NONE / Contraints:NONE + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + <br/> + <img border='1' align='right' height='100'src='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&BBOX=-2,45,8,55&WIDTH=100&HEIGHT=100&LAYERS=385d7d71-650a-414b-b8c7-739e2c0b5e76:MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif&STYLES=raster&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'/> + + <br/> + This resource is available from a OGC WMS Service (version 1.1.1) and it contains the following access points: + <ul> + <li> + <a href='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&BBOX=-2,45,8,55SRS=EPSG:4326&WIDTH=500&HEIGHT=500&LAYERS=385d7d71-650a-414b-b8c7-739e2c0b5e76:MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'> + GetMap </a> request in image/png (atom:link[@rel="enclosure"]) + </li> + + <li> + <a href='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities'> + GetCapabilities </a> request (atom:link[@rel="via"]) + </li> + </li> + </ul> + Generated from session 385d7d71-650a-414b-b8c7-739e2c0b5e76 on Mon Sep 10 17:49:17 UTC 2012 + <p style='font-size:small'>OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) by Terradue Srl.</p> + + + + + + raster + Default Raster + A sample style that draws a raster, good for displaying imagery + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/meris_noprofile.xml owslib-0.18.0/tests/resources/owc_atom_examples/meris_noprofile.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/meris_noprofile.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/meris_noprofile.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,94 @@ + + + GeoServer Web Map Service + http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&/ + A compliant implementation of WMS plus most of the SLD extension (dynamic styling). Can also generate PDF, SVG, KML, GeoRSS + 2012-10-12T19:11:19Z + ESA + + OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) + + + Terradue Srl. + Copyright (c) 2012. Some rights reserved. This feed is + licensed under a Creative Commons Attribution 3.0 License. + + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + + + http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&/ + MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif + + GeoServer Administrator + info@genesi-dec.eu + http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS& + + ESA + 2012-10-12T19:11:19Z + Fee:NONE / Contraints:NONE + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + <br/> + <img border='1' align='right' height='100'src='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&BBOX=-2,45,8,55&WIDTH=100&HEIGHT=100&LAYERS=385d7d71-650a-414b-b8c7-739e2c0b5e76:MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif&STYLES=raster&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'/> + + <br/> + This resource is available from a OGC WMS Service (version 1.1.1) and it contains the following access points: + <ul> + <li> + <a href='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&BBOX=-2,45,8,55SRS=EPSG:4326&WIDTH=500&HEIGHT=500&LAYERS=385d7d71-650a-414b-b8c7-739e2c0b5e76:MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'> + GetMap </a> request in image/png (atom:link[@rel="enclosure"]) + </li> + + <li> + <a href='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities'> + GetCapabilities </a> request (atom:link[@rel="via"]) + </li> + </li> + </ul> + Generated from session 385d7d71-650a-414b-b8c7-739e2c0b5e76 on Mon Sep 10 17:49:17 UTC 2012 + <p style='font-size:small'>OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) by Terradue Srl.</p> + + + + + + raster + Default Raster + A sample style that draws a raster, good for displaying imagery + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/road.xsd owslib-0.18.0/tests/resources/owc_atom_examples/road.xsd --- owslib-0.16.0/tests/resources/owc_atom_examples/road.xsd 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/road.xsd 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/sea_ice_extent_01.atom owslib-0.18.0/tests/resources/owc_atom_examples/sea_ice_extent_01.atom --- owslib-0.16.0/tests/resources/owc_atom_examples/sea_ice_extent_01.atom 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/sea_ice_extent_01.atom 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,179 @@ + + + + Atlas of the Cryosphere: Southern Hemisphere + http://nsidc.org/cgi-bin/atlas_south?/ + The National Snow and Ice Data Center (NSIDC) Atlas of the Cryosphere is a map server that provides data and information pertinent to the frozen regions of Earth, including monthly climatologies of sea ice extent and concentration, snow cover extent, and snow water equivalent, in addition to glacier outlines, ice sheet elevation and accumulation, and more. In order to support polar projections, the Atlas is divided into two separate map servers: one for the Northern Hemisphere and one for the Southern Hemisphere. In addition to providing map images and source data through Open Geospatial Consortium, Inc. (OGC) protocols (WMS, WFS, and WCS), a dynamic web interface for exploring these data is also available at http://nsidc.org/data/atlas. If you have questions, comments or suggestions, please contact NSIDC User Services at +1.303.492.6199 or nsidc@nsidc.org. The development of this map server application was supported by NASA's Earth Observing System (EOS) Program under contract NAS5-03099 and was developed using MapServer, an Open Source development environment for building spatially-enabled internet applications. To cite the Atlas of the Cryosphere: Maurer, J. 2007. Atlas of the Cryosphere. Boulder, Colorado USA: National Snow and Ice Data Center. Digital media. Available at http://nsidc.org/data/atlas/. + 2012-10-12T19:10:48Z + National Snow and Ice Data Center + + OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) + + + Terradue Srl. + Copyright (c) 2012. Some rights reserved. This feed is + licensed under a Creative Commons Attribution 3.0 License. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://nsidc.org/cgi-bin/atlas_south?/ + sea ice extent, January (1979-2007) + + NSIDC User Services + nsidc@nsidc.org + http://nsidc.org/cgi-bin/atlas_south? + + National Snow and Ice Data Center + National Snow and Ice Data Center + 2012-10-12T19:10:48Z + Fee:none / Contraints:none + + + + + -90 -178.854 -90 180 76.4039 180 76.4039 -178.854 -90 -178.854 + + + + + + + + + + + + <br/> + <img border='1' align='right' height='100'src='http://nsidc.org/cgi-bin/atlas_south?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&BBOX=-178.854,-90,180,76.4039&WIDTH=215&HEIGHT=100&LAYERS=sea_ice_extent_01&STYLES=default&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'/> + + <b><a href='http://nsidc.org'>National Snow and Ice Data Center</a></b> + + <img src='http://nsidc.org/images/logo_nsidc_115x90.gif' hspace='20' align='left' width='115' height='90'> + + <br/> + This resource is available from a OGC WMS Service (version 1.1.1) and it contains the following access points: + <ul> + <li> + <a href='http://nsidc.org/cgi-bin/atlas_south?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&BBOX=-178.854,-90,180,76.4039SRS=EPSG:4326&WIDTH=1078&HEIGHT=500&LAYERS=sea_ice_extent_01&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'> + GetMap </a> request in image/png (atom:link[@rel="enclosure"]) + </li> + + <li> + <a href='http://nsidc.org/cgi-bin/atlas_south?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities'> + GetCapabilities </a> request (atom:link[@rel="via"]) + </li> + </li> + <li> + MetadataURL is available <a href='http://nsidc.org/cgi-bin/get_metadata.pl?id=nsidc-0192&format=fgdc'> + FGDC - text/html + </a> + </li> + <li> + DataURL is available <a href='ftp://sidads.colorado.edu/pub/DATASETS/seaice/polar-stereo/trends-climatologies/monthly-means/mean.jan.1979-2007.s'> + flat binary (1-byte unsigned integers, 316 columns by 332 rows) + </a> + </li> + </ul> + Stroeve, J. and W. Meier. 1999, updated 2008. Sea Ice Trends and Climatologies from SMMR and SSM/I. Boulder, Colorado USA: National Snow and Ice Data Center. Digital media. Available at http://nsidc.org/data/smmr_ssmi_ancillary/monthly_means.html. Accessed 27 June 2008. Compiled from: Cavalieri, D., C. Parkinson, P. Gloersen, and H. J. Zwally. 1996. Sea ice concentrations from Nimbus-7 SMMR and DMSP SSM/I passive microwave data. Boulder, Colorado USA: National Snow and Ice Data Center. Digital media. Available at http://nsidc.org/data/nsidc-0051.html. Background: Sea ice extent includes all areas where sea ice concentration is greater than or equal to 15%. Monthly climatologies of sea ice concentration represent mean ice concentration percentages for each month over the entire time period 1979-2007, which is generated from passive microwave brightness temperature data derived from Nimbus-7 Scanning Multichannel Microwave Radiometer (SMMR) and Defense Meteorological Satellite Program (DMSP) -F8, -F11 and -F13 Special Sensor Microwave/Imager (SSM/I) radiances at a grid cell size of 25 x 25 km using the NASA Team algorithm developed by the Oceans and Ice Branch, Laboratory for Hydrospheric Processes at NASA Goddard Space Flight Center (GSFC). + <p style='font-size:small'>OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) by Terradue Srl.</p> + + + + + + default + default + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/wcs_kml.xml owslib-0.18.0/tests/resources/owc_atom_examples/wcs_kml.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/wcs_kml.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/wcs_kml.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,1314 @@ + + + + http://www.opengis.net/owc/1.0/examples/wcs1-raj + Context Example :: Web Coverage Service + + Raj Singh + + 2012-11-05T11:25:23Z + + + + + 18.548652 -72.3627630648135 + 18.592594 -72.2677392817456 + + + + https://portal.opengeospatial.org/wiki/OWS9/Ows9Data#tomas.kml + Tomas_Storm_44_Category_2_2011_KML_converted_from_CSV for OWS-9 + 2012-12-06T14:56:00Z + OGC + + Raj Singh + + Raj Singh with TextMate from NASA data + https://portal.opengeospatial.org/wiki/OWS9/Ows9Data#tomas.kml:_Tomas_Storm_44_Category_2_2011_KML_converted_from_CSV for OWS-9 + + + 18.548652 -72.3627630648135 + 18.592594 -72.2677392817456 + + + + KML example + + + + + Tomas - Category 2 Tropical Storm + this csv file using csv2kml]]> + + 25 + + + 2010-10-26T18:00:00 + + + + -37,5,0 + + + + 25 + + + 2010-10-27T00:00:00 + + + + -38.5,5.3,0 + + + + 25 + + + 2010-10-27T06:00:00 + + + + -40,5.5,0 + + + + 25 + + + 2010-10-27T12:00:00 + + + + -41.5,5.8,0 + + + + 25 + + + 2010-10-27T18:00:00 + + + + -43,6,0 + + + + 30 + + + 2010-10-28T00:00:00 + + + + -44.8,6.4,0 + + + + 30 + + + 2010-10-28T06:00:00 + + + + -46.8,6.8,0 + + + + 30 + + + 2010-10-28T12:00:00 + + + + -48.6,7.2,0 + + + + 30 + + + 2010-10-28T18:00:00 + + + + -50.4,7.7,0 + + + + 30 + + + 2010-10-29T00:00:00 + + + + -52.2,8.3,0 + + + + 30 + + + 2010-10-29T06:00:00 + + + + -53.7,9,0 + + + + 35 + + + 2010-10-29T12:00:00 + + + + -55.3,9.8,0 + + + + 45 + + + 2010-10-29T18:00:00 + + + + -56.8,10.8,0 + + + + 55 + + + 2010-10-30T00:00:00 + + + + -57.8,11.9,0 + + + + 60 + + + 2010-10-30T06:00:00 + + + + -58.9,12.7,0 + + + + 60 + + + 2010-10-30T09:00:00 + + + + -59.5,13,0 + + + + 65 + + + 2010-10-30T12:00:00 + + + + -60.1,13.1,0 + + + + 80 + + + 2010-10-30T18:00:00 + + + + -61,13.3,0 + + + + 85 + + + 2010-10-30T20:00:00 + + + + -61.2,13.4,0 + + + + 85 + + + 2010-10-31T00:00:00 + + + + -61.7,13.5,0 + + + + 85 + + + 2010-10-31T06:00:00 + + + + -62.4,13.8,0 + + + + 80 + + + 2010-10-31T12:00:00 + + + + -63.3,14,0 + + + + 65 + + + 2010-10-31T18:00:00 + + + + -64.4,14.2,0 + + + + 55 + + + 2010-11-01T00:00:00 + + + + -65.8,14.1,0 + + + + 45 + + + 2010-11-01T06:00:00 + + + + -67.1,13.9,0 + + + + 40 + + + 2010-11-01T12:00:00 + + + + -68.2,13.6,0 + + + + 40 + + + 2010-11-01T18:00:00 + + + + -69.2,13.5,0 + + + + 40 + + + 2010-11-02T00:00:00 + + + + -70.3,13.5,0 + + + + 45 + + + 2010-11-02T06:00:00 + + + + -71.4,13.5,0 + + + + 40 + + + 2010-11-02T12:00:00 + + + + -72.5,13.5,0 + + + + 35 + + + 2010-11-02T18:00:00 + + + + -73.4,13.6,0 + + + + 30 + + + 2010-11-03T00:00:00 + + + + -73.9,13.8,0 + + + + 30 + + + 2010-11-03T06:00:00 + + + + -74.3,14,0 + + + + 30 + + + 2010-11-03T12:00:00 + + + + -74.7,14.3,0 + + + + 35 + + + 2010-11-03T18:00:00 + + + + -75.1,14.7,0 + + + + 40 + + + 2010-11-04T00:00:00 + + + + -75.5,15.1,0 + + + + 40 + + + 2010-11-04T06:00:00 + + + + -75.9,15.5,0 + + + + 45 + + + 2010-11-04T12:00:00 + + + + -76.2,15.9,0 + + + + 50 + + + 2010-11-04T18:00:00 + + + + -76.2,16.4,0 + + + + 60 + + + 2010-11-05T00:00:00 + + + + -75.7,17,0 + + + + 70 + + + 2010-11-05T06:00:00 + + + + -75.2,17.7,0 + + + + 75 + + + 2010-11-05T12:00:00 + + + + -74.7,18.7,0 + + + + 70 + + + 2010-11-05T18:00:00 + + + + -74,19.7,0 + + + + 60 + + + 2010-11-06T00:00:00 + + + + -73.1,20.4,0 + + + + 60 + + + 2010-11-06T06:00:00 + + + + -71.8,21.4,0 + + + + 60 + + + 2010-11-06T07:00:00 + + + + -71.6,21.7,0 + + + + 60 + + + 2010-11-06T07:30:00 + + + + -71.6,21.7,0 + + + + 60 + + + 2010-11-06T12:00:00 + + + + -70.9,22.6,0 + + + + 65 + + + 2010-11-06T18:00:00 + + + + -70.3,23.8,0 + + + + 70 + + + 2010-11-07T00:00:00 + + + + -69.8,24.9,0 + + + + 65 + + + 2010-11-07T06:00:00 + + + + -69.6,25.4,0 + + + + 60 + + + 2010-11-07T12:00:00 + + + + -69.5,25.7,0 + + + + 50 + + + 2010-11-07T18:00:00 + + + + -69.3,26,0 + + + + 50 + + + 2010-11-08T00:00:00 + + + + -68.5,26,0 + + + + 50 + + + 2010-11-08T06:00:00 + + + + -67.5,25.8,0 + + + + 50 + + + 2010-11-08T12:00:00 + + + + -66.2,25.6,0 + + + + 45 + + + 2010-11-08T18:00:00 + + + + -64.5,25.8,0 + + + + 45 + + + 2010-11-09T00:00:00 + + + + -62.3,26.5,0 + + + + 45 + + + 2010-11-09T06:00:00 + + + + -60.4,27.9,0 + + + + 45 + + + 2010-11-09T12:00:00 + + + + -58.6,29.4,0 + + + + 45 + + + 2010-11-09T18:00:00 + + + + -56.9,31,0 + + + + 45 + + + 2010-11-10T00:00:00 + + + + -55.4,33.3,0 + + + + 45 + + + 2010-11-10T06:00:00 + + + + -54,36,0 + + + + 35 + + + 2010-11-10T12:00:00 + + + + -53.5,39,0 + + + + 35 + + + 2010-11-10T18:00:00 + + + + -53.5,42,0 + + + + + + + + + http://ows9.csiss.gmu.edu/cgi-bin/ows9/gmuwcs + George Mason University Web Coverage Service version 2.0 for OWS-9 + 2006-01-01T00:00:00Z + GMU + + Yuanzheng Shao + + Raj Singh with OxygenXML + https://portal.opengeospatial.org/wiki/OWS9/OICoverageServices#GMU_WCS + Airport imagery + + + 18.548652 -72.3627630648135 + 18.592594 -72.2677392817456 + + + + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/wfs_100entries.xml owslib-0.18.0/tests/resources/owc_atom_examples/wfs_100entries.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/wfs_100entries.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/wfs_100entries.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,2443 @@ + + + + XtraServer WFS - interactive instruments + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?/ + + Bob Simth + + 2012-02-03T12:00:30Z + interactive-instruments + + OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) + + + Terradue Srl. + Copyright (c) 2012. Some rights reserved. This feed is + licensed under a Creative Commons Attribution 3.0 License. + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?gml:AbstractFeature/ + gml:AbstractFeature + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:AerodromeBoundaryGeocurve/ + tds:AerodromeBoundaryGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:AircraftHangarGeopoint/ + tds:AircraftHangarGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:AircraftHangarGeosurface/ + tds:AircraftHangarGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:AmphitheatreGeosurface/ + tds:AmphitheatreGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ApronGeosurface/ + tds:ApronGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:BridgeGeocurve/ + tds:BridgeGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:BrushGeosurface/ + tds:BrushGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:BuildingGeopoint/ + tds:BuildingGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:BuildingGeosurface/ + tds:BuildingGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:BuiltUpAreaGeosurface/ + tds:BuiltUpAreaGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:CableGeocurve/ + tds:CableGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:CampSiteGeosurface/ + tds:CampSiteGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:CaravanParkGeosurface/ + tds:CaravanParkGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:CemeteryGeopoint/ + tds:CemeteryGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:CemeteryGeosurface/ + tds:CemeteryGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:CisternGeopoint/ + tds:CisternGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ControlTowerGeopoint/ + tds:ControlTowerGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ControlTowerGeosurface/ + tds:ControlTowerGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:CropLandGeosurface/ + tds:CropLandGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:CulvertGeocurve/ + tds:CulvertGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:DamGeosurface/ + tds:DamGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:DishAerialGeopoint/ + tds:DishAerialGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:DisposalSiteGeosurface/ + tds:DisposalSiteGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:DitchGeocurve/ + tds:DitchGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:DitchGeosurface/ + tds:DitchGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:DriveInTheatreGeosurface/ + tds:DriveInTheatreGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:EmbankmentGeocurve/ + tds:EmbankmentGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:EmbankmentGeosurface/ + tds:EmbankmentGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ExtractionMineGeopoint/ + tds:ExtractionMineGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ExtractionMineGeosurface/ + tds:ExtractionMineGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:FenceGeocurve/ + tds:FenceGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:FordGeocurve/ + tds:FordGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ForestGeocurve/ + tds:ForestGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ForestGeosurface/ + tds:ForestGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:GolfCourseGeosurface/ + tds:GolfCourseGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:GrainStorageStructureGeopoint/ + tds:GrainStorageStructureGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:GrainStorageStructureGeosurface/ + tds:GrainStorageStructureGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:GrandstandGeopoint/ + tds:GrandstandGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:GrandstandGeosurface/ + tds:GrandstandGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:GrasslandGeosurface/ + tds:GrasslandGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:GreenhouseGeopoint/ + tds:GreenhouseGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:GreenhouseGeosurface/ + tds:GreenhouseGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:HelipadGeopoint/ + tds:HelipadGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:HoldingPenGeopoint/ + tds:HoldingPenGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:HoldingPenGeosurface/ + tds:HoldingPenGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:InlandWaterbodyGeosurface/ + tds:InlandWaterbodyGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:LandAerodromeGeosurface/ + tds:LandAerodromeGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:LandSubjectToInundationGeosurface/ + tds:LandSubjectToInundationGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:LandWaterBoundaryGeocurve/ + tds:LandWaterBoundaryGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:MarshGeosurface/ + tds:MarshGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:MilitaryInstallationGeopoint/ + tds:MilitaryInstallationGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:MilitaryInstallationGeosurface/ + tds:MilitaryInstallationGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:MobileHomeParkGeosurface/ + tds:MobileHomeParkGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ParkGeosurface/ + tds:ParkGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ParkingGarageGeopoint/ + tds:ParkingGarageGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ParkingGarageGeosurface/ + tds:ParkingGarageGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:PowerStationGeopoint/ + tds:PowerStationGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:PowerStationGeosurface/ + tds:PowerStationGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:PowerSubstationGeopoint/ + tds:PowerSubstationGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:PowerSubstationGeosurface/ + tds:PowerSubstationGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:PublicSquareGeosurface/ + tds:PublicSquareGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:RacetrackGeocurve/ + tds:RacetrackGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:RailwayGeocurve/ + tds:RailwayGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:RailwaySidetrackGeocurve/ + tds:RailwaySidetrackGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:RailwayYardGeosurface/ + tds:RailwayYardGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:RiverGeocurve/ + tds:RiverGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:RiverGeosurface/ + tds:RiverGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:RoadGeocurve/ + tds:RoadGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:RoadInterchangeGeopoint/ + tds:RoadInterchangeGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:RunwayGeosurface/ + tds:RunwayGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SaltEvaporatorGeosurface/ + tds:SaltEvaporatorGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SettlingPondGeosurface/ + tds:SettlingPondGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SewageTreatmentPlantGeopoint/ + tds:SewageTreatmentPlantGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SewageTreatmentPlantGeosurface/ + tds:SewageTreatmentPlantGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ShoppingComplexGeosurface/ + tds:ShoppingComplexGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ShorelineConstructionGeocurve/ + tds:ShorelineConstructionGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ShorelineConstructionGeosurface/ + tds:ShorelineConstructionGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SmokestackGeopoint/ + tds:SmokestackGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SoilSurfaceRegionGeosurface/ + tds:SoilSurfaceRegionGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SportsGroundGeosurface/ + tds:SportsGroundGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:StadiumGeosurface/ + tds:StadiumGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:StopwayGeosurface/ + tds:StopwayGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:StorageDepotGeosurface/ + tds:StorageDepotGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:StorageTankGeopoint/ + tds:StorageTankGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:StorageTankGeosurface/ + tds:StorageTankGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SurfaceBunkerGeopoint/ + tds:SurfaceBunkerGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SurfaceBunkerGeosurface/ + tds:SurfaceBunkerGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SwampGeosurface/ + tds:SwampGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:SwimmingPoolGeosurface/ + tds:SwimmingPoolGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:TaxiwayGeosurface/ + tds:TaxiwayGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:ThicketGeosurface/ + tds:ThicketGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:TidalWaterGeosurface/ + tds:TidalWaterGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:TowerGeopoint/ + tds:TowerGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:TunnelGeocurve/ + tds:TunnelGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:VanishingPointGeopoint/ + tds:VanishingPointGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:VehicleLotGeosurface/ + tds:VehicleLotGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:WallGeocurve/ + tds:WallGeocurve + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:WaterTowerGeopoint/ + tds:WaterTowerGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:WaterTreatmentBedGeosurface/ + tds:WaterTreatmentBedGeosurface + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + http://services.interactive-instruments.de/xsprojects/ows9-tds/services/ltds/wfs?tds:WaterWellGeopoint/ + tds:WaterWellGeopoint + interactive-instruments + 2012-02-03T12:00:30Z + Fee: / Contraints: + + + + + -90 -180 -90 180 90 180 90 -180 -90 -180 + + + + + + + + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/wms_gml_hurricane_tomas.xml owslib-0.18.0/tests/resources/owc_atom_examples/wms_gml_hurricane_tomas.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/wms_gml_hurricane_tomas.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/wms_gml_hurricane_tomas.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,569 @@ + + + + http://www.opengis.net/owc/1.0/examples/Hurricane-Tomas + Hurricane Tomas + + Roger Brackin + + 2013-01-06T01:10:42Z + + + + + -1.417726 -90.540890 33.238194 -90.540890 33.238194 -22.622864 -1.417726 -22.622864 + + + + + + Web Map Service Layer + Web Map Service Layer + 2013-01-06T01:10:42Z + Web Map Service Layer + + + + + + + + Track Analysis + Track Analysis + 2013-01-06T01:10:42Z + Track Analysis + + + + + + + 5.000000 -76.318245 + 28.485352 -37.000000 + + + + + + + 5.000000 -37.000000 + + + + + + + 5.300000 -38.500000 + + + + + + + 5.500000 -40.000000 + + + + + + + 5.800000 -41.500000 + + + + + + + 6.000000 -43.000000 + + + + + + + 6.400000 -44.799999 + + + + + + + 6.800000 -46.799999 + + + + + + + 7.200000 -48.599998 + + + + + + + 7.700000 -50.400001 + + + + + + + 8.500000 -52.000000 + + + + + + + 9.300000 -53.700001 + + + + + + + 10.000000 -55.299999 + + + + + + + 10.800000 -56.799999 + + + + + + + 11.900000 -57.799999 + + + + + + + 12.700000 -58.900002 + + + + + + + 13.100000 -60.099998 + + + + + + + 13.300000 -61.000000 + + + + + + + 13.500000 -61.700001 + + + + + + + 13.800000 -62.400002 + + + + + + + 14.000000 -63.299999 + + + + + + + 14.200000 -64.400002 + + + + + + + 14.100000 -65.800003 + + + + + + + 13.900000 -67.099998 + + + + + + + 13.600000 -68.199997 + + + + + + + 13.400000 -69.199997 + + + + + + + 13.500000 -70.300003 + + + + + + + 13.500000 -71.300003 + + + + + + + 13.400000 -72.699997 + + + + + + + 13.500000 -73.400002 + + + + + + + 13.700000 -73.900002 + + + + + + + 14.000000 -74.300003 + + + + + + + 14.300000 -74.699997 + + + + + + + 14.800000 -75.199997 + + + + + + + 15.100000 -75.500000 + + + + + + + 15.600000 -76.000000 + + + + + + + 15.900000 -76.099998 + + + + + + + 16.299999 -76.199997 + + + + + + + 17.000000 -75.699997 + + + + + + + 17.700001 -75.199997 + + + + + + + 18.700001 -74.699997 + + + + + + + 19.799999 -73.900002 + + + + + + + 20.400000 -73.099998 + + + + + + + 21.400000 -71.800003 + + + + + + + 22.600000 -70.900001 + + + + + + + 23.799999 -70.300003 + + + + + + + 24.900000 -69.699997 + + + + + + + 25.299999 -69.599998 + + + + + + + 25.799999 -69.599998 + + + + + + + 26.000000 -69.500000 + + + + + + + 5.000000 -37.000000 5.300000 -38.500000 5.500000 -40.000000 5.800000 -41.500000 6.000000 -43.000000 6.400000 -44.799999 6.800000 -46.799999 7.200000 -48.599998 7.700000 -50.400001 8.500000 -52.000000 9.300000 -53.700001 10.000000 -55.299999 + + + + + + + 10.000000 -55.299999 10.800000 -56.799999 + + + + + + + 10.800000 -56.799999 11.900000 -57.799999 12.700000 -58.900002 13.100000 -60.099998 + + + + + + + 13.100000 -60.099998 13.300000 -61.000000 13.500000 -61.700001 13.800000 -62.400002 + + + + + + + 13.800000 -62.400002 14.000000 -63.299999 + + + + + + + 14.000000 -63.299999 14.200000 -64.400002 14.100000 -65.800003 + + + + + + + 14.100000 -65.800003 13.900000 -67.099998 13.600000 -68.199997 13.400000 -69.199997 13.500000 -70.300003 13.500000 -71.300003 13.400000 -72.699997 13.500000 -73.400002 13.700000 -73.900002 + + + + + + + 13.700000 -73.900002 14.000000 -74.300003 14.300000 -74.699997 14.800000 -75.199997 + + + + + + + 14.800000 -75.199997 15.100000 -75.500000 15.600000 -76.000000 15.900000 -76.099998 16.299999 -76.199997 17.000000 -75.699997 17.700001 -75.199997 + + + + + + + 17.700001 -75.199997 18.700001 -74.699997 19.799999 -73.900002 20.400000 -73.099998 21.400000 -71.800003 + + + + + + + 21.400000 -71.800003 22.600000 -70.900001 23.799999 -70.300003 + + + + + + + 23.799999 -70.300003 24.900000 -69.699997 25.299999 -69.599998 25.799999 -69.599998 + + + + + + + 25.799999 -69.599998 26.000000 -69.500000 + + + + + + + + + 16.378206 -64.400002 16.377872 -64.439362 16.376865 -64.478722 16.375191 -64.518051 16.372849 -64.557335 16.369835 -64.596580 16.366154 -64.635757 16.365955 -64.637550 16.364424 -64.673515 16.362080 -64.712807 16.359066 -64.752045 16.355387 -64.791222 16.351042 -64.830322 16.346029 -64.869347 16.340355 -64.908264 16.334019 -64.947067 16.327021 -64.985756 16.319368 -65.024300 16.311060 -65.062698 16.302097 -65.100952 16.292488 -65.139015 16.287222 -65.158470 16.284134 -65.194054 16.279240 -65.237465 16.273262 -65.280586 16.266230 -65.323372 16.262953 -65.340614 16.261251 -65.355690 16.255276 -65.398804 16.248240 -65.441582 16.240179 -65.483986 16.231117 -65.526001 16.221085 -65.567574 16.213642 -65.595482 16.211851 -65.604271 16.208431 -65.619148 16.205379 -65.638496 16.197514 -65.681183 16.188604 -65.723480 16.178688 -65.765350 16.171028 -65.794449 16.169634 -65.801506 16.164429 -65.824699 16.162867 -65.835121 16.155254 -65.878113 16.146555 -65.920715 16.136803 -65.962898 16.128340 -65.995674 16.127813 -65.998444 16.120546 -66.031868 16.113325 -66.074730 16.104897 -66.117661 16.095365 -66.160179 16.085033 -66.201187 16.077343 -66.237946 16.075983 -66.243675 16.071651 -66.270981 16.063557 -66.314255 16.054310 -66.357117 16.043949 -66.399544 16.041965 -66.406815 16.036432 -66.434548 16.035698 -66.437759 16.031241 -66.468033 16.023542 -66.511643 16.014645 -66.554871 16.004581 -66.597687 15.993386 -66.640022 15.981097 -66.681870 15.979786 -66.685928 15.974646 -66.707787 15.963451 -66.750122 15.951162 -66.791962 15.937813 -66.833260 15.923442 -66.873978 15.908092 -66.914101 15.891801 -66.953575 15.874613 -66.992394 15.856571 -67.030518 15.837720 -67.067932 15.818102 -67.104599 15.797767 -67.140518 15.776758 -67.175659 15.755124 -67.210022 15.732910 -67.243591 15.710164 -67.276344 15.686934 -67.308289 15.663266 -67.339417 15.639207 -67.369720 15.614806 -67.399216 15.590105 -67.427887 15.565152 -67.455757 15.539991 -67.482819 15.514668 -67.509079 15.489224 -67.534569 15.463705 -67.559288 15.438145 -67.583260 15.415730 -67.603645 15.413483 -67.605995 15.389341 -67.630409 15.365126 -67.654099 15.340868 -67.677071 15.316607 -67.699356 15.309547 -67.705650 15.289410 -67.726235 15.266496 -67.748901 15.250155 -67.764549 15.238087 -67.777794 15.216383 -67.800774 15.194567 -67.823090 15.172676 -67.844757 15.150741 -67.865768 15.128800 -67.886162 15.107929 -67.905006 15.094532 -67.918892 15.076203 -67.937248 15.062288 -67.953911 15.043580 -67.975494 15.024722 -67.996498 15.005746 -68.016937 15.003645 -68.019127 15.011312 -68.037422 15.023994 -68.071335 15.035384 -68.105774 15.045465 -68.140694 15.054229 -68.176025 15.061668 -68.211723 15.067783 -68.247734 15.072568 -68.283996 15.076026 -68.320465 15.078161 -68.357063 15.078739 -68.382843 15.082436 -68.404625 15.087220 -68.440887 15.090680 -68.477356 15.092815 -68.513954 15.093408 -68.540405 15.096991 -68.561523 15.101779 -68.597786 15.105237 -68.634254 15.107374 -68.670868 15.107981 -68.697998 15.111450 -68.718445 15.116237 -68.754715 15.119695 -68.791176 15.121832 -68.827789 15.122455 -68.855598 15.125813 -68.875382 15.130599 -68.911659 15.134056 -68.948128 15.136194 -68.984741 15.136831 -69.013237 15.140076 -69.032349 15.144862 -69.068619 15.148319 -69.105095 15.150457 -69.141708 15.151110 -69.170891 15.154240 -69.189331 15.159026 -69.225609 15.162484 -69.262077 15.164621 -69.298706 15.165400 -69.333412 15.167755 -69.347290 15.172542 -69.383575 15.176001 -69.420052 15.178139 -69.456673 15.178960 -69.493378 15.178476 -69.530113 15.177418 -69.551971 15.178335 -69.567680 15.179156 -69.604385 15.178673 -69.641128 15.176894 -69.677849 15.173839 -69.714500 15.169520 -69.751015 15.163960 -69.787354 15.157179 -69.823463 15.149200 -69.859299 15.140055 -69.894806 15.129772 -69.929939 15.118376 -69.964661 15.105906 -69.998917 15.092394 -70.032677 15.091559 -70.034592 15.091173 -70.036972 15.084362 -70.071602 15.076394 -70.105949 15.067297 -70.139984 15.057097 -70.173660 15.045828 -70.206917 15.033518 -70.239716 15.031645 -70.244263 15.026365 -70.263992 15.022366 -70.277176 15.020998 -70.285500 15.014388 -70.318619 15.006670 -70.351479 14.997867 -70.384026 14.988010 -70.416222 14.977126 -70.448028 14.965245 -70.479393 14.954165 -70.506050 14.953306 -70.509132 14.951122 -70.516067 14.947811 -70.535080 14.941171 -70.566719 14.933461 -70.598106 14.924707 -70.629181 14.914937 -70.659912 14.904178 -70.690254 14.893366 -70.717857 14.892104 -70.722984 14.883576 -70.753166 14.882578 -70.756294 14.882579 -70.756317 14.882646 -70.787033 14.881594 -70.817772 14.879433 -70.848488 14.876180 -70.879112 14.871845 -70.909630 14.871654 -70.910706 14.871697 -70.911797 14.871763 -70.942520 14.870711 -70.973251 14.868551 -71.003960 14.865297 -71.034599 14.860964 -71.065109 14.860694 -71.066627 14.860719 -71.067276 14.860785 -71.097999 14.859734 -71.128738 14.857574 -71.159439 14.854318 -71.190071 14.849985 -71.220581 14.849637 -71.222534 14.849646 -71.222755 14.849710 -71.253471 14.848659 -71.284203 14.846498 -71.314903 14.843245 -71.345535 14.838910 -71.376045 14.838477 -71.378479 14.838542 -71.408920 14.837490 -71.439644 14.835330 -71.470352 14.832075 -71.500984 14.827742 -71.531487 14.827211 -71.534477 14.827277 -71.564346 14.826223 -71.595078 14.824063 -71.625778 14.820808 -71.656403 14.816475 -71.686905 14.815851 -71.690414 14.815915 -71.719780 14.814863 -71.750511 14.812701 -71.781212 14.809446 -71.811829 14.805113 -71.842331 14.804395 -71.846367 14.804458 -71.875191 14.803406 -71.905914 14.801244 -71.936607 14.797989 -71.967239 14.796328 -71.978928 14.799070 -71.996902 14.802534 -72.027275 14.804860 -72.057816 14.806054 -72.088463 14.806120 -72.119171 14.805069 -72.149895 14.803544 -72.171555 14.804560 -72.182960 14.805286 -72.196335 14.808731 -72.212494 14.813866 -72.241112 14.818073 -72.269875 14.821359 -72.298744 14.823727 -72.327682 14.825184 -72.356644 14.825737 -72.385620 14.825398 -72.414551 14.825210 -72.419022 14.825364 -72.420097 14.828179 -72.444664 14.829969 -72.451324 14.836475 -72.478348 14.842262 -72.505493 14.847337 -72.532738 14.851698 -72.560051 14.855356 -72.587418 14.858314 -72.614807 14.860578 -72.642212 14.862154 -72.669586 14.862383 -72.676537 14.862475 -72.676964 14.867387 -72.703049 14.869367 -72.708862 14.877539 -72.734528 14.885192 -72.760323 14.892326 -72.786247 14.898941 -72.812279 14.905001 -72.838257 14.907332 -72.844292 14.916604 -72.869621 14.925444 -72.895119 14.933846 -72.920769 14.941811 -72.946564 14.949332 -72.972504 14.956410 -72.998573 14.963042 -73.024773 14.969225 -73.051079 14.974957 -73.077507 14.980239 -73.104027 14.985068 -73.130638 14.989437 -73.157333 14.993355 -73.184105 14.996813 -73.210945 14.999811 -73.237846 15.002350 -73.264793 15.004428 -73.291778 15.006045 -73.318810 15.007201 -73.345856 15.007895 -73.372925 15.008125 -73.400002 15.007895 -73.427071 15.007201 -73.454140 15.006045 -73.481193 15.004428 -73.508217 15.002350 -73.535202 14.999811 -73.562157 14.996811 -73.589050 14.993355 -73.615898 14.989437 -73.642662 14.985066 -73.669365 14.980239 -73.695969 14.974959 -73.722496 14.969225 -73.748917 14.963042 -73.775230 14.956410 -73.801422 14.949332 -73.827492 14.941811 -73.853432 14.933846 -73.879234 14.925444 -73.904877 14.916604 -73.930374 14.907332 -73.955704 14.897624 -73.980858 14.887492 -74.005829 14.876934 -74.030624 14.865954 -74.055214 14.854558 -74.079605 14.842746 -74.103775 14.830523 -74.127739 14.817892 -74.151474 14.804858 -74.174973 14.791427 -74.198227 14.777598 -74.221245 14.763379 -74.244003 14.748773 -74.266495 14.733786 -74.288727 14.718421 -74.310684 14.702684 -74.332352 14.686580 -74.353737 14.670113 -74.374832 14.653288 -74.395615 14.636110 -74.416092 14.618586 -74.436264 14.600719 -74.456101 14.582519 -74.475624 14.563987 -74.494812 14.544811 -74.513321 14.524708 -74.530777 14.503714 -74.547150 14.481881 -74.562408 14.459250 -74.576515 14.435875 -74.589439 14.411800 -74.601150 14.387078 -74.611633 14.361762 -74.620865 14.335904 -74.628822 14.309561 -74.635483 14.282785 -74.640854 14.255631 -74.644913 14.228157 -74.647652 14.200421 -74.649063 14.172475 -74.649155 14.144379 -74.647926 14.116188 -74.645386 14.087957 -74.641533 14.059746 -74.636375 14.031606 -74.629936 14.003592 -74.622238 13.975760 -74.613297 13.948161 -74.603119 13.920848 -74.591743 13.893869 -74.579201 13.867274 -74.565506 13.841108 -74.550713 13.815423 -74.534828 13.790258 -74.517914 13.765657 -74.500000 13.741659 -74.481140 13.718303 -74.461349 13.695624 -74.440704 13.673659 -74.419228 13.652435 -74.396980 13.631985 -74.374008 13.612330 -74.350372 13.593501 -74.326111 13.575516 -74.301292 13.558395 -74.275948 13.542152 -74.250160 13.526800 -74.223976 13.512353 -74.197441 13.498817 -74.170624 13.486198 -74.143578 13.474496 -74.116356 13.463714 -74.089020 13.453846 -74.061630 13.444887 -74.034241 13.436831 -74.006905 13.429663 -73.979668 13.423370 -73.952606 13.417935 -73.925751 13.413342 -73.899178 13.409567 -73.872917 13.406587 -73.847023 13.404372 -73.821548 13.402900 -73.796532 13.402136 -73.772034 13.402048 -73.748077 13.402602 -73.724724 13.403474 -73.707626 13.402054 -73.691322 13.400724 -73.668808 13.400034 -73.646759 13.399951 -73.625206 13.400447 -73.604179 13.401373 -73.585945 13.400927 -73.582085 13.399149 -73.561707 13.397965 -73.541702 13.397347 -73.522095 13.397271 -73.502937 13.397709 -73.484253 13.398443 -73.469765 13.396727 -73.454918 13.395145 -73.436798 13.394086 -73.419014 13.393537 -73.401588 13.393467 -73.384560 13.393853 -73.367950 13.394671 -73.351784 13.395579 -73.340126 13.395358 -73.338593 13.393525 -73.322777 13.392162 -73.307213 13.391253 -73.291923 13.390776 -73.276955 13.390715 -73.262314 13.391046 -73.248039 13.391748 -73.234154 13.392188 -73.228477 13.389907 -73.227532 13.386655 -73.226059 13.383426 -73.224480 13.380222 -73.222778 13.377056 -73.220962 13.373930 -73.219032 13.370853 -73.216995 13.367831 -73.214844 13.364872 -73.212593 13.361981 -73.210228 13.359163 -73.207764 13.356428 -73.205200 13.353781 -73.202538 13.351225 -73.199783 13.348768 -73.196945 13.346417 -73.194023 13.344175 -73.191017 13.342049 -73.187935 13.340042 -73.184784 13.338161 -73.181572 13.336409 -73.178299 13.334788 -73.174965 13.333306 -73.171593 13.331963 -73.168175 13.330766 -73.164726 13.329714 -73.161247 13.328811 -73.157745 13.328060 -73.154228 13.327462 -73.150703 13.327020 -73.147179 13.326734 -73.143654 13.326603 -73.140152 13.326605 -73.139938 13.325620 -73.139496 13.320627 -73.137047 13.315679 -73.134415 13.310784 -73.131615 13.305954 -73.128639 13.301198 -73.125488 13.296528 -73.122170 13.291954 -73.118675 13.287485 -73.115028 13.283132 -73.111229 13.278904 -73.107262 13.274811 -73.103149 13.270862 -73.098907 13.267065 -73.094513 13.263431 -73.089989 13.259967 -73.085350 13.256680 -73.080589 13.253578 -73.075722 13.250669 -73.070755 13.247960 -73.065697 13.245457 -73.060562 13.243165 -73.055344 13.241090 -73.050072 13.239238 -73.044731 13.237611 -73.039360 13.236216 -73.033951 13.235532 -73.030746 13.234990 -73.030365 13.229070 -73.025856 13.223287 -73.021134 13.217652 -73.016205 13.212180 -73.011085 13.206883 -73.005768 13.201773 -73.000259 13.196860 -72.994583 13.192155 -72.988739 13.187672 -72.982727 13.183418 -72.976578 13.179404 -72.970276 13.175640 -72.963852 13.172133 -72.957306 13.168893 -72.950661 13.165926 -72.943916 13.163423 -72.937553 13.156090 -72.931969 13.148729 -72.925964 13.141559 -72.919693 13.134595 -72.913178 13.127853 -72.906410 13.121347 -72.899414 13.115094 -72.892189 13.109107 -72.884750 13.103399 -72.877106 13.097985 -72.869270 13.092875 -72.861259 13.088083 -72.853096 13.083620 -72.844765 13.079495 -72.836304 13.078713 -72.834534 13.074141 -72.830795 13.065434 -72.823189 13.056976 -72.815277 13.048790 -72.807060 13.040891 -72.798569 13.033297 -72.789803 13.026025 -72.780769 13.019095 -72.771492 13.012519 -72.761986 13.006313 -72.752266 13.000494 -72.742340 12.995072 -72.732239 12.994673 -72.731422 12.989276 -72.726707 12.979327 -72.717400 12.969694 -72.707748 12.960401 -72.697754 12.951466 -72.687439 12.942910 -72.676819 12.934756 -72.665909 12.927019 -72.654732 12.919719 -72.643295 12.912869 -72.631622 12.906491 -72.619743 12.900595 -72.607674 12.895198 -72.595421 12.890309 -72.583031 12.885946 -72.570503 12.882113 -72.557869 12.878823 -72.545166 12.876083 -72.532410 12.873900 -72.519615 12.872279 -72.506813 12.871227 -72.494041 12.870745 -72.481308 12.870789 -72.474953 12.869437 -72.470489 12.866148 -72.457787 12.863407 -72.445030 12.861225 -72.432236 12.859605 -72.419441 12.858552 -72.406662 12.858069 -72.393936 12.858158 -72.381271 12.858822 -72.368706 12.860056 -72.356262 12.861861 -72.343971 12.864233 -72.331848 12.867166 -72.319923 12.870656 -72.308220 12.874695 -72.296768 12.875690 -72.294334 12.874419 -72.288422 12.872236 -72.275627 12.870616 -72.262833 12.869563 -72.250053 12.869081 -72.237320 12.869169 -72.224663 12.869833 -72.212097 12.871067 -72.199654 12.872872 -72.187363 12.875243 -72.175240 12.878177 -72.163315 12.881667 -72.151611 12.885706 -72.140152 12.886823 -72.137428 12.885880 -72.133034 12.883696 -72.120247 12.882076 -72.107445 12.881023 -72.094666 12.880542 -72.081940 12.880630 -72.069275 12.881293 -72.056709 12.882528 -72.044266 12.884333 -72.031975 12.886704 -72.019852 12.889638 -72.007919 12.893127 -71.996216 12.897166 -71.984764 12.898222 -71.982185 12.897243 -71.977623 12.895061 -71.964836 12.893440 -71.952034 12.892386 -71.939255 12.891904 -71.926521 12.891994 -71.913856 12.892657 -71.901291 12.893892 -71.888855 12.895696 -71.876556 12.898067 -71.864433 12.901000 -71.852501 12.904490 -71.840797 12.908530 -71.829346 12.909522 -71.826920 12.908512 -71.822220 12.906329 -71.809425 12.904709 -71.796623 12.903657 -71.783844 12.903173 -71.771118 12.903263 -71.758453 12.903926 -71.745888 12.905160 -71.733437 12.906964 -71.721146 12.909336 -71.709023 12.912269 -71.697090 12.915760 -71.685387 12.919798 -71.673927 12.920727 -71.671661 12.919683 -71.666794 12.917500 -71.653999 12.915880 -71.641197 12.914827 -71.628418 12.914344 -71.615685 12.914433 -71.603027 12.915097 -71.590454 12.916331 -71.578010 12.918136 -71.565720 12.920507 -71.553589 12.923440 -71.541664 12.926930 -71.529953 12.930969 -71.518501 12.931839 -71.516380 12.930760 -71.511353 12.928577 -71.498558 12.926957 -71.485756 12.925904 -71.472969 12.925421 -71.460243 12.925510 -71.447578 12.926174 -71.435005 12.927408 -71.422562 12.929213 -71.410263 12.931584 -71.398140 12.934517 -71.386215 12.938007 -71.374504 12.942045 -71.363045 12.942854 -71.361069 12.941741 -71.355888 12.939558 -71.343094 12.937938 -71.330292 12.936885 -71.317513 12.936402 -71.304779 12.936491 -71.292114 12.937155 -71.279549 12.938389 -71.267105 12.940193 -71.254799 12.942564 -71.242676 12.945498 -71.230743 12.948988 -71.219040 12.953026 -71.207580 12.953770 -71.205765 12.952624 -71.200424 12.950441 -71.187630 12.948821 -71.174835 12.947768 -71.162056 12.947286 -71.149315 12.947375 -71.136650 12.948038 -71.124084 12.949273 -71.111633 12.951077 -71.099342 12.953448 -71.087212 12.956382 -71.075287 12.959871 -71.063576 12.963910 -71.052116 12.964594 -71.050446 12.963411 -71.044937 12.961228 -71.032135 12.959609 -71.019340 12.958556 -71.006561 12.958073 -70.993820 12.958161 -70.981155 12.958825 -70.968590 12.960058 -70.956139 12.961864 -70.943832 12.963801 -70.933929 12.963610 -70.933037 12.961427 -70.920235 12.959806 -70.907440 12.958754 -70.894661 12.958271 -70.881920 12.958361 -70.869255 12.959023 -70.856689 12.960258 -70.844238 12.962063 -70.831940 12.963885 -70.822624 12.963757 -70.822029 12.961574 -70.809227 12.959953 -70.796425 12.958901 -70.783646 12.958418 -70.770912 12.958507 -70.758247 12.959169 -70.745682 12.960403 -70.733231 12.962209 -70.720924 12.964009 -70.711723 12.963856 -70.711006 12.961671 -70.698212 12.960052 -70.685410 12.958999 -70.672630 12.958516 -70.659889 12.958606 -70.647232 12.959269 -70.634659 12.960503 -70.622208 12.962307 -70.609909 12.964083 -70.600830 12.963904 -70.599998 12.961721 -70.587196 12.960101 -70.574402 12.959048 -70.561623 12.958566 -70.548881 12.958655 -70.536217 12.959318 -70.523651 12.960553 -70.511200 12.962357 -70.498894 12.964108 -70.489937 12.963904 -70.488991 12.961720 -70.476196 12.960100 -70.463394 12.959047 -70.450615 12.958565 -70.437874 12.958654 -70.425217 12.959317 -70.412643 12.960552 -70.400192 12.962356 -70.387894 12.964086 -70.379051 12.963855 -70.377976 12.961671 -70.365173 12.960052 -70.352379 12.958998 -70.339600 12.958515 -70.326859 12.958605 -70.314194 12.959268 -70.301628 12.960502 -70.289177 12.962307 -70.276878 12.964013 -70.268158 12.963756 -70.266960 12.961573 -70.254158 12.959952 -70.241356 12.958899 -70.228577 12.958417 -70.215843 12.958506 -70.203178 12.959169 -70.190613 12.960402 -70.178162 12.962208 -70.165855 12.963890 -70.157257 12.963608 -70.155945 12.961426 -70.143150 12.959805 -70.130348 12.958753 -70.117569 12.958269 -70.104828 12.958359 -70.092163 12.959023 -70.079597 12.960257 -70.067146 12.962061 -70.054848 12.963718 -70.046371 12.963411 -70.044937 12.961228 -70.032135 12.959609 -70.019333 12.958556 -70.006554 12.958073 -69.993820 12.958161 -69.981155 12.958825 -69.968590 12.960058 -69.956139 12.961187 -69.948441 12.960565 -69.946831 12.956351 -69.934525 12.952634 -69.922111 12.949424 -69.909592 12.946731 -69.897018 12.944558 -69.884399 12.942916 -69.871757 12.941809 -69.859116 12.941238 -69.846497 12.941208 -69.833931 12.941724 -69.821442 12.942780 -69.809044 12.943560 -69.803062 12.941960 -69.798767 12.937956 -69.786674 12.934415 -69.774460 12.931347 -69.762146 12.928760 -69.749756 12.926660 -69.737320 12.925057 -69.724838 12.923956 -69.712349 12.923360 -69.699867 12.923273 -69.687416 12.923697 -69.675018 12.924441 -69.665253 12.922914 -69.661133 12.919005 -69.649376 12.915510 -69.637489 12.912436 -69.625496 12.909791 -69.613403 12.907586 -69.601234 12.905829 -69.589004 12.904525 -69.576737 12.903680 -69.564453 12.903298 -69.552162 12.903386 -69.539894 12.903943 -69.527672 12.904490 -69.521202 12.901493 -69.512436 12.897948 -69.500839 12.894782 -69.489120 12.892006 -69.477303 12.889628 -69.465370 12.887658 -69.453377 12.886101 -69.441315 12.884966 -69.429207 12.884258 -69.417076 12.883982 -69.404930 12.884140 -69.392799 12.884676 -69.381981 12.882277 -69.374931 12.878802 -69.363594 12.875668 -69.352142 12.872886 -69.340569 12.870462 -69.328896 12.868406 -69.317123 12.866726 -69.305283 12.865428 -69.293373 12.864519 -69.281425 12.864006 -69.269432 12.863919 -69.260170 12.863076 -69.257828 12.859492 -69.246971 12.856188 -69.235977 12.853174 -69.224838 12.850458 -69.213593 12.848050 -69.202232 12.845959 -69.190773 12.844193 -69.179222 12.842758 -69.167595 12.841660 -69.155907 12.840909 -69.144165 12.840508 -69.132378 12.840466 -69.120575 12.840781 -69.108749 12.841463 -69.096924 12.842513 -69.085114 12.842755 -69.083107 12.841530 -69.079033 12.838515 -69.067902 12.835800 -69.056656 12.833392 -69.045288 12.831301 -69.033829 12.830471 -69.028404 12.825846 -69.020958 12.819138 -69.009499 12.812700 -68.997795 12.806546 -68.985855 12.800692 -68.973679 12.795152 -68.961288 12.789941 -68.948685 12.785071 -68.935890 12.780560 -68.922905 12.776415 -68.909752 12.772652 -68.896439 12.769282 -68.882980 12.766316 -68.869400 12.765116 -68.862961 12.757740 -68.850433 12.750144 -68.836632 12.742917 -68.822556 12.736078 -68.808212 12.729645 -68.793617 12.723634 -68.778786 12.718060 -68.763725 12.712942 -68.748459 12.708293 -68.733009 12.704125 -68.717384 12.700454 -68.701607 12.700303 -68.700851 12.699533 -68.699577 12.690619 -68.683823 12.682153 -68.667732 12.674153 -68.651337 12.666645 -68.634651 12.659643 -68.617683 12.653168 -68.600472 12.647239 -68.583031 12.641870 -68.565376 12.637079 -68.547524 12.635272 -68.539772 12.628162 -68.527222 12.618599 -68.509026 12.609590 -68.490486 12.601159 -68.471619 12.593328 -68.452461 12.586118 -68.433022 12.579549 -68.413330 12.573639 -68.393417 12.569942 -68.379204 12.562983 -68.366707 12.552475 -68.346314 12.542615 -68.325562 12.533426 -68.304443 12.524937 -68.283012 12.517164 -68.261292 12.510136 -68.239304 12.504416 -68.219032 12.495294 -68.202133 12.484003 -68.179466 12.473458 -68.156418 12.463687 -68.132996 12.454714 -68.109238 12.450466 -68.096703 12.440023 -68.079514 12.426301 -68.055168 12.413377 -68.030335 12.401280 -68.005058 12.390044 -67.979363 12.379697 -67.953293 12.370266 -67.926872 12.361775 -67.900147 12.354252 -67.873161 12.347714 -67.845940 12.342184 -67.818543 12.337681 -67.791000 12.334217 -67.763359 12.331806 -67.735664 12.330463 -67.707954 12.330192 -67.680283 12.331007 -67.652687 12.332906 -67.625221 12.335895 -67.597923 12.339973 -67.570847 12.345139 -67.544037 12.348470 -67.529900 12.345844 -67.508575 12.343415 -67.479973 12.342084 -67.451363 12.341964 -67.436012 12.337706 -67.409248 12.334138 -67.379791 12.334113 -67.379486 12.330654 -67.366829 12.323559 -67.336616 12.317576 -67.306198 12.312725 -67.275635 12.309023 -67.244965 12.306485 -67.214226 12.305122 -67.183479 12.305068 -67.173836 12.300970 -67.147690 12.297216 -67.116119 12.294658 -67.084473 12.293308 -67.052826 12.293282 -67.046295 12.289165 -67.019745 12.285358 -66.987259 12.282781 -66.954712 12.281444 -66.922157 12.281435 -66.918663 12.277309 -66.891762 12.275270 -66.874107 12.271762 -66.860962 12.263962 -66.826859 12.257410 -66.792541 12.252126 -66.758049 12.248133 -66.723442 12.245445 -66.688774 12.244166 -66.656372 12.241352 -66.637817 12.232723 -66.604454 12.224733 -66.568291 12.218056 -66.531898 12.212715 -66.495331 12.208732 -66.458641 12.206121 -66.421890 12.204900 -66.385139 12.205078 -66.348434 12.206667 -66.311844 12.209669 -66.275421 12.214090 -66.239227 12.217118 -66.220619 12.216072 -66.211319 12.215618 -66.205261 12.212245 -66.190575 12.204905 -66.152306 12.198980 -66.113861 12.194493 -66.075279 12.193892 -66.067619 12.191487 -66.057327 12.183814 -66.018135 12.177598 -65.978737 12.172859 -65.939217 12.172120 -65.930183 12.170667 -65.924072 12.162663 -65.883942 12.156155 -65.843613 12.151165 -65.803139 12.150290 -65.792854 12.149791 -65.790787 12.141455 -65.749733 12.134654 -65.708465 12.129412 -65.667038 12.128355 -65.655060 12.120190 -65.615509 12.113096 -65.573303 12.107601 -65.530930 12.106312 -65.516800 12.098862 -65.481270 12.091477 -65.438118 12.085733 -65.394806 12.084210 -65.378647 12.077478 -65.347008 12.069799 -65.302917 12.063801 -65.258659 12.062055 -65.240623 12.056035 -65.212738 12.048065 -65.167709 12.041815 -65.122505 12.039850 -65.102768 12.034533 -65.078453 12.026269 -65.032486 12.019765 -64.986343 12.015046 -64.940086 12.012130 -64.893807 12.011034 -64.847572 12.011769 -64.801460 12.014344 -64.755554 12.018766 -64.709930 12.025034 -64.664650 12.033143 -64.619820 12.034704 -64.612869 12.036757 -64.591675 12.043025 -64.546402 12.051134 -64.501564 12.061079 -64.457237 12.072850 -64.413498 12.086431 -64.370430 12.101805 -64.328102 12.118947 -64.286591 12.137834 -64.245972 12.158437 -64.206322 12.180718 -64.167702 12.204645 -64.130173 12.230180 -64.093826 12.257274 -64.058708 12.285883 -64.024879 12.315959 -63.992416 12.347017 -63.960919 12.378611 -63.929970 12.410723 -63.899574 12.443351 -63.869747 12.476479 -63.840500 12.510101 -63.811836 12.544207 -63.783764 12.578784 -63.756290 12.613826 -63.729435 12.649319 -63.703194 12.685252 -63.677582 12.721615 -63.652603 12.758399 -63.628265 12.795592 -63.604580 12.833181 -63.581554 12.871158 -63.559185 12.909509 -63.537495 12.948223 -63.516483 12.987288 -63.496159 13.026695 -63.476521 13.066431 -63.457581 13.106481 -63.439342 13.146837 -63.421818 13.161082 -63.415924 13.172112 -63.410515 13.209807 -63.392780 13.228856 -63.384201 13.234101 -63.372913 13.241096 -63.358925 13.238460 -63.346752 13.235845 -63.333584 13.233454 -63.320374 13.231288 -63.307125 13.230392 -63.300983 13.229875 -63.299305 13.226149 -63.286415 13.222642 -63.273472 13.219357 -63.260460 13.216293 -63.247395 13.213453 -63.234280 13.210838 -63.221111 13.208447 -63.207901 13.206281 -63.194653 13.205436 -63.188858 13.204814 -63.186840 13.201088 -63.173958 13.197581 -63.161015 13.194296 -63.148003 13.191233 -63.134941 13.188393 -63.121822 13.185777 -63.108662 13.183386 -63.095451 13.181220 -63.082199 13.180425 -63.076752 13.179702 -63.074406 13.175976 -63.061523 13.172468 -63.048580 13.169184 -63.035568 13.166121 -63.022511 13.163280 -63.009396 13.160665 -62.996235 13.158273 -62.983025 13.156107 -62.969780 13.155361 -62.964668 13.154540 -62.962002 13.150812 -62.949120 13.147305 -62.936176 13.144020 -62.923172 13.140956 -62.910107 13.138117 -62.896999 13.135501 -62.883839 13.133110 -62.870628 13.130944 -62.857384 13.130247 -62.852612 13.129323 -62.849609 13.125596 -62.836735 13.122088 -62.823792 13.118803 -62.810787 13.115741 -62.797730 13.112901 -62.784615 13.110285 -62.771454 13.107893 -62.758251 13.105728 -62.745007 13.105082 -62.740581 13.104057 -62.737255 13.100330 -62.724373 13.096823 -62.711437 13.093537 -62.698433 13.090474 -62.685371 13.087634 -62.672264 13.085851 -62.663296 13.080986 -62.655045 13.079648 -62.653385 13.071127 -62.642582 13.062702 -62.631668 13.054377 -62.620636 13.046150 -62.609489 13.038025 -62.598225 13.030004 -62.586842 13.022089 -62.575333 13.014282 -62.563698 13.006589 -62.551945 12.999012 -62.540054 12.995433 -62.534287 12.993498 -62.531933 12.984511 -62.520821 12.975580 -62.509583 12.966708 -62.498226 12.957897 -62.486736 12.949152 -62.475120 12.940475 -62.463364 12.931871 -62.451458 12.923346 -62.439411 12.914901 -62.427219 12.906544 -62.414864 12.902125 -62.408173 12.893664 -62.398178 12.883980 -62.386566 12.874318 -62.374809 12.864689 -62.362892 12.855095 -62.350815 12.845541 -62.338570 12.836036 -62.326145 12.826585 -62.313538 12.817196 -62.300735 12.807878 -62.287746 12.802262 -62.279728 12.797466 -62.274361 12.786804 -62.262249 12.776141 -62.249947 12.765488 -62.237450 12.754848 -62.224743 12.744237 -62.211830 12.733659 -62.198681 12.723127 -62.185307 12.712652 -62.171688 12.702243 -62.157829 12.698212 -62.152321 12.694898 -62.148792 12.683072 -62.135994 12.671236 -62.122948 12.659400 -62.109650 12.647575 -62.096092 12.635778 -62.082260 12.624016 -62.068142 12.612306 -62.053745 12.600662 -62.039047 12.589100 -62.024040 12.577637 -62.008728 12.566285 -61.993107 12.555064 -61.977158 12.543990 -61.960896 12.533081 -61.944298 12.522353 -61.927380 12.511827 -61.910133 12.501517 -61.892559 12.491446 -61.874649 12.481630 -61.856419 12.472088 -61.837868 12.462839 -61.818989 12.453902 -61.799805 12.445294 -61.780304 12.437037 -61.760502 12.429147 -61.740402 12.426514 -61.733250 12.419623 -61.719189 12.410686 -61.700001 12.402079 -61.680508 12.393821 -61.660709 12.385931 -61.640606 12.378426 -61.620224 12.371324 -61.599556 12.364644 -61.578621 12.358402 -61.557426 12.352616 -61.535995 12.347300 -61.514317 12.344116 -61.499863 12.343809 -61.498970 12.337129 -61.478035 12.330888 -61.456848 12.325102 -61.435406 12.319788 -61.413734 12.319020 -61.410252 12.315159 -61.399017 12.308478 -61.378086 12.302239 -61.356899 12.296452 -61.335468 12.291138 -61.313797 12.290454 -61.310692 12.286467 -61.299095 12.279786 -61.278168 12.273546 -61.256981 12.267760 -61.235550 12.262445 -61.213882 12.261837 -61.211124 12.257736 -61.199192 12.251056 -61.178272 12.244816 -61.157085 12.239030 -61.135658 12.233715 -61.113991 12.233188 -61.111599 12.228966 -61.099320 12.222285 -61.078400 12.216045 -61.057221 12.210259 -61.035786 12.204945 -61.014126 12.204495 -61.012081 12.200157 -60.999470 12.193477 -60.978550 12.187236 -60.957367 12.181450 -60.935944 12.176136 -60.914284 12.175759 -60.912575 12.171307 -60.899631 12.164626 -60.878719 12.158385 -60.857540 12.152599 -60.836121 12.147285 -60.814461 12.142460 -60.792584 12.138139 -60.770500 12.134337 -60.748230 12.131876 -60.731346 12.130951 -60.728210 12.125164 -60.706791 12.119851 -60.685139 12.115026 -60.663261 12.110704 -60.641178 12.106901 -60.618904 12.105820 -60.611485 12.102348 -60.599705 12.096563 -60.578293 12.091249 -60.556641 12.086424 -60.534763 12.082103 -60.512688 12.078300 -60.490418 12.077287 -60.483463 12.073682 -60.471237 12.067896 -60.449818 12.062582 -60.428165 12.057756 -60.406296 12.053435 -60.384220 12.049632 -60.361954 12.048686 -60.355461 12.044950 -60.342789 12.039164 -60.321377 12.033850 -60.299725 12.029025 -60.277859 12.024703 -60.255787 12.020900 -60.233521 12.020021 -60.227493 12.016153 -60.214375 12.010368 -60.192963 12.005054 -60.171318 12.000229 -60.149452 11.995908 -60.127377 11.992105 -60.105118 11.991294 -60.099556 11.987293 -60.085987 11.981508 -60.064583 11.976194 -60.042934 11.971369 -60.021072 11.967048 -59.999004 11.963244 -59.976746 11.962502 -59.971657 11.958369 -59.957642 11.952583 -59.936230 11.947269 -59.914589 11.942445 -59.892727 11.938123 -59.870666 11.934320 -59.848404 11.931050 -59.825973 11.928328 -59.803383 11.926165 -59.780651 11.924573 -59.757797 11.923565 -59.734833 11.923150 -59.711796 11.923341 -59.688682 11.924144 -59.665527 11.925569 -59.642345 11.927621 -59.619163 11.930308 -59.596005 11.933637 -59.572876 11.937609 -59.549816 11.942229 -59.526840 11.947500 -59.503971 11.953422 -59.481235 11.955741 -59.473270 11.957787 -59.456764 11.960943 -59.435761 11.964654 -59.414806 11.968922 -59.393917 11.973750 -59.373119 11.976536 -59.362427 11.977490 -59.352280 11.979727 -59.333340 11.982422 -59.314423 11.985580 -59.295528 11.989204 -59.276684 11.993298 -59.257900 11.995395 -59.249302 11.996607 -59.235390 11.998442 -59.218506 11.998847 -59.215405 11.992513 -59.207844 11.984159 -59.197510 11.975984 -59.187031 11.967988 -59.176411 11.960176 -59.165653 11.952551 -59.154751 11.945113 -59.143726 11.937864 -59.132568 11.930810 -59.121284 11.923948 -59.109879 11.917285 -59.098347 11.910819 -59.086704 11.904751 -59.075317 11.902978 -59.073479 11.893769 -59.063923 11.884729 -59.054211 11.875854 -59.044342 11.867150 -59.034317 11.858620 -59.024139 11.850266 -59.013813 11.842090 -59.003342 11.834095 -58.992725 11.826283 -58.981968 11.818657 -58.971081 11.811218 -58.960056 11.803970 -58.948902 11.796915 -58.937626 11.790054 -58.926220 11.783389 -58.914703 11.776924 -58.903065 11.771116 -58.892178 11.768963 -58.889946 11.759755 -58.880406 11.750713 -58.870693 11.741839 -58.860828 11.733134 -58.850807 11.724604 -58.840633 11.716249 -58.830311 11.708073 -58.819847 11.700078 -58.809235 11.692266 -58.798489 11.684639 -58.787601 11.677201 -58.776585 11.669952 -58.765438 11.662897 -58.754162 11.656034 -58.742767 11.649371 -58.731255 11.645693 -58.724640 11.644743 -58.723877 11.627163 -58.709171 11.610054 -58.694260 11.593414 -58.679172 11.577242 -58.663940 11.561533 -58.648586 11.546280 -58.633137 11.531478 -58.617619 11.517118 -58.602058 11.510787 -58.594978 11.497136 -58.584976 11.478609 -58.570778 11.460555 -58.556313 11.442972 -58.541618 11.425862 -58.526722 11.409222 -58.511650 11.393048 -58.496426 11.377338 -58.481083 11.362084 -58.465641 11.347281 -58.450134 11.332920 -58.434586 11.327038 -58.428013 11.312848 -58.417625 11.294321 -58.403439 11.276266 -58.388985 11.258682 -58.374302 11.241571 -58.359409 11.224929 -58.344349 11.208755 -58.329140 11.193044 -58.313805 11.177789 -58.298378 11.162985 -58.282879 11.148621 -58.267342 11.143165 -58.261246 11.128466 -58.250496 11.109937 -58.236317 11.091881 -58.221870 11.074295 -58.207199 11.057183 -58.192326 11.040541 -58.177269 11.024365 -58.162067 11.008652 -58.146748 10.993396 -58.131329 10.978592 -58.115845 10.964228 -58.100315 10.959222 -58.094730 10.943989 -58.083595 10.925459 -58.069420 10.907401 -58.054989 10.889815 -58.040325 10.872703 -58.025463 10.856058 -58.010414 10.839881 -57.995224 10.824168 -57.979912 10.808911 -57.964508 10.794105 -57.949032 10.779741 -57.933514 10.775153 -57.928398 10.759418 -57.916908 10.740888 -57.902744 10.722828 -57.888325 10.705242 -57.873669 10.688127 -57.858814 10.671481 -57.843781 10.655304 -57.828602 10.639589 -57.813297 10.624332 -57.797901 10.609525 -57.782436 10.595159 -57.766926 10.581226 -57.751400 10.567717 -57.735882 10.554618 -57.720387 10.541916 -57.704941 10.529601 -57.689575 10.517653 -57.674293 10.506063 -57.659126 10.494808 -57.644085 10.483876 -57.629196 10.473247 -57.614464 10.462903 -57.599915 10.452825 -57.585556 10.442993 -57.571400 10.433387 -57.557457 10.423986 -57.543743 10.414771 -57.530258 10.405720 -57.517017 10.396811 -57.504017 10.388024 -57.491272 10.379337 -57.478783 10.370727 -57.466541 10.362178 -57.454559 10.353665 -57.442833 10.345167 -57.431366 10.336665 -57.420135 10.328137 -57.409161 10.319567 -57.398422 10.310932 -57.387913 10.302215 -57.377632 10.293400 -57.367558 10.284468 -57.357689 10.275402 -57.348011 10.266190 -57.338516 10.256978 -57.329014 10.247933 -57.319363 10.239055 -57.309547 10.230348 -57.299576 10.221814 -57.289463 10.213456 -57.279194 10.205276 -57.268780 10.197279 -57.258228 10.189464 -57.247532 10.181834 -57.236702 10.174393 -57.225742 10.167141 -57.214649 10.160083 -57.203434 10.153219 -57.192097 10.146552 -57.180641 10.140082 -57.169067 10.133814 -57.157387 10.127747 -57.145596 10.121888 -57.133698 10.116233 -57.121700 10.110784 -57.109604 10.105548 -57.097416 10.100522 -57.085140 10.095708 -57.072777 10.091107 -57.060329 10.086723 -57.047802 10.082556 -57.035202 10.078606 -57.022530 10.074876 -57.009788 10.071366 -56.996990 10.068078 -56.984123 10.065012 -56.971210 10.062169 -56.958237 10.059550 -56.945221 10.057159 -56.932156 10.054990 -56.919056 10.053049 -56.905918 10.051334 -56.892750 10.049848 -56.879551 10.048589 -56.866333 10.047559 -56.853088 10.046758 -56.839828 10.046184 -56.826561 10.045840 -56.813282 10.045725 -56.799999 10.045840 -56.786720 10.046184 -56.773441 10.046758 -56.760170 10.047559 -56.746914 10.048589 -56.733673 10.049848 -56.720448 10.051334 -56.707249 10.053049 -56.694080 10.054990 -56.680943 10.057159 -56.667843 10.059550 -56.654781 10.062169 -56.641762 10.065011 -56.628792 10.068078 -56.615875 10.071366 -56.603012 10.074876 -56.590210 10.078606 -56.577469 10.082556 -56.564800 10.086723 -56.552197 10.091106 -56.539669 10.095707 -56.527222 10.100521 -56.514858 10.105548 -56.502583 10.110784 -56.490395 10.116233 -56.478298 10.121888 -56.466301 10.127749 -56.454407 10.133814 -56.442616 10.140082 -56.430931 10.146551 -56.419357 10.153219 -56.407902 10.160083 -56.396564 10.167141 -56.385349 10.174394 -56.374256 10.181834 -56.363296 10.189464 -56.352470 10.197279 -56.341774 10.205276 -56.331219 10.213457 -56.320808 10.221814 -56.310539 10.230348 -56.300419 10.239055 -56.290451 10.247933 -56.280640 10.256978 -56.270981 10.266190 -56.261486 10.275402 -56.251987 10.284468 -56.242310 10.293399 -56.232441 10.302216 -56.222370 10.310931 -56.212086 10.319567 -56.201576 10.328138 -56.190838 10.336665 -56.179859 10.345167 -56.168636 10.353665 -56.157162 10.362179 -56.145439 10.370729 -56.133457 10.379337 -56.121220 10.388024 -56.108726 10.396811 -56.095982 10.405721 -56.082985 10.414771 -56.069744 10.423986 -56.056259 10.433387 -56.042541 10.442993 -56.028603 10.452825 -56.014446 10.462902 -56.000084 10.473247 -55.985535 10.483876 -55.970806 10.494808 -55.955914 10.506063 -55.940876 10.517653 -55.925709 10.529601 -55.910431 10.541916 -55.895058 10.554618 -55.879616 10.567717 -55.864120 10.581227 -55.848598 10.595159 -55.833069 10.609525 -55.817562 10.624332 -55.802097 10.639589 -55.786701 10.655304 -55.771397 10.671482 -55.756218 10.688126 -55.741188 10.705242 -55.726330 10.722828 -55.711678 10.740889 -55.697254 10.759418 -55.683094 10.778418 -55.669216 10.797883 -55.655659 10.817807 -55.642448 10.838185 -55.629608 10.859010 -55.617172 10.880268 -55.605164 10.901955 -55.593613 10.924052 -55.582546 10.946551 -55.571995 10.969436 -55.561974 10.992687 -55.552521 11.016293 -55.543652 11.040231 -55.535397 11.064482 -55.527779 11.089027 -55.520817 11.113841 -55.514538 11.138904 -55.508957 11.164191 -55.504097 11.189676 -55.499977 11.215334 -55.496613 11.241138 -55.494015 11.267058 -55.492210 11.293071 -55.491207 11.319143 -55.491016 11.345247 -55.491642 11.371353 -55.493107 11.397430 -55.495415 11.423445 -55.498566 11.449368 -55.502571 11.475168 -55.507435 11.500814 -55.513153 11.526274 -55.519737 11.551514 -55.527172 11.576505 -55.535465 11.601213 -55.544609 11.625607 -55.554596 11.649658 -55.565426 11.673332 -55.577084 11.696600 -55.589558 11.719433 -55.602840 11.741801 -55.616920 11.763676 -55.631779 11.785028 -55.647400 11.805832 -55.663769 11.826061 -55.680866 11.845689 -55.698669 11.864692 -55.717163 11.883210 -55.736156 11.901399 -55.755478 11.919252 -55.775120 11.924221 -55.780785 11.926354 -55.782127 11.948230 -55.796993 11.969583 -55.812626 11.990389 -55.829002 12.010617 -55.846111 12.030246 -55.863926 12.049250 -55.882427 12.067769 -55.901436 12.085960 -55.920765 12.103813 -55.940422 12.109095 -55.946445 12.110815 -55.947529 12.132691 -55.962398 12.154045 -55.978043 12.174851 -55.994431 12.195081 -56.011547 12.214710 -56.029373 12.233715 -56.047886 12.252235 -56.066906 12.270427 -56.086250 12.288279 -56.105919 12.293881 -56.112309 12.295181 -56.113129 12.317058 -56.128014 12.338413 -56.143661 12.359218 -56.160061 12.379450 -56.177189 12.399079 -56.195026 12.418086 -56.213554 12.436607 -56.232582 12.454799 -56.251938 12.472654 -56.271622 12.478554 -56.278358 12.479451 -56.278923 12.501328 -56.293819 12.522685 -56.309475 12.543490 -56.325886 12.563723 -56.343021 12.583354 -56.360874 12.602361 -56.379410 12.620883 -56.398453 12.639075 -56.417824 12.656932 -56.437515 12.663169 -56.444641 12.663621 -56.444927 12.685498 -56.459827 12.706855 -56.475498 12.727662 -56.491917 12.747895 -56.509068 12.767527 -56.526924 12.786535 -56.545475 12.805057 -56.564533 12.823252 -56.583912 12.841108 -56.603622 12.858624 -56.623646 12.858670 -56.623699 12.863370 -56.626903 12.884727 -56.642582 12.905535 -56.659008 12.925769 -56.676170 12.945401 -56.694042 12.964410 -56.712605 12.982935 -56.731670 13.001128 -56.751064 13.018986 -56.770782 13.036503 -56.790825 13.053672 -56.811173 13.070489 -56.831825 13.086948 -56.852776 13.103046 -56.874023 13.118775 -56.895554 13.134131 -56.917362 13.149111 -56.939449 13.163710 -56.961796 13.170464 -56.972542 13.170854 -56.972988 13.188024 -56.993347 13.204843 -57.014015 13.221301 -57.034977 13.237399 -57.056232 13.253129 -57.077774 13.268487 -57.099594 13.283467 -57.121693 13.298066 -57.144051 13.305359 -57.155659 13.322255 -57.175705 13.339073 -57.196381 13.355534 -57.217350 13.371632 -57.238621 13.387363 -57.260174 13.402720 -57.282005 13.417702 -57.304112 13.432302 -57.326488 13.440182 -57.339035 13.456365 -57.358242 13.473184 -57.378921 13.489644 -57.399914 13.505743 -57.421188 13.521476 -57.442753 13.536834 -57.464596 13.551815 -57.486717 13.566416 -57.509102 13.574882 -57.522587 13.590347 -57.540955 13.607168 -57.561653 13.623630 -57.582649 13.639729 -57.603939 13.655460 -57.625515 13.670820 -57.647369 13.685802 -57.669498 13.700402 -57.691895 13.709463 -57.706337 13.724208 -57.723854 13.741029 -57.744556 13.757490 -57.765568 13.773591 -57.786869 13.789324 -57.808453 13.804683 -57.830322 13.819254 -57.851856 13.841014 -57.854790 13.877161 -57.860863 13.905907 -57.866657 13.911170 -57.867042 13.950973 -57.871231 13.990674 -57.876686 14.030233 -57.883434 14.062683 -57.890057 14.094700 -57.893497 14.137827 -57.899529 14.180795 -57.906937 14.223554 -57.915749 14.266055 -57.925961 14.308245 -57.937572 14.350079 -57.950577 14.391502 -57.964981 14.432465 -57.980774 14.472919 -57.997936 14.512812 -58.016472 14.552099 -58.036369 14.590729 -58.057598 14.628656 -58.080151 14.665832 -58.104004 14.702214 -58.129124 14.737756 -58.155502 14.772413 -58.183102 14.806146 -58.211891 14.838914 -58.241848 14.870674 -58.272934 14.901430 -58.305077 14.931185 -58.338196 14.959906 -58.372273 14.987564 -58.407257 15.014135 -58.443123 15.039590 -58.479820 15.063907 -58.517311 15.087065 -58.555561 15.109041 -58.594521 15.129822 -58.634148 15.149388 -58.674400 15.167729 -58.715229 15.184829 -58.756599 15.200680 -58.798454 15.215274 -58.840755 15.228605 -58.883450 15.240669 -58.926495 15.251466 -58.969837 15.260996 -59.013443 15.267133 -59.045971 15.269580 -59.054703 15.280376 -59.098053 15.289907 -59.141659 15.296182 -59.174927 15.298427 -59.182941 15.309223 -59.226299 15.318755 -59.269916 15.325173 -59.303940 15.327210 -59.311211 15.338006 -59.354568 15.347538 -59.398193 15.354098 -59.432983 15.355927 -59.439510 15.366723 -59.482880 15.376257 -59.526505 15.382960 -59.562058 15.384581 -59.567841 15.395378 -59.611214 15.404911 -59.654846 15.411755 -59.691147 15.413169 -59.696194 15.423967 -59.739582 15.433500 -59.783218 15.441769 -59.827061 15.443121 -59.835556 15.444087 -59.839436 15.457358 -59.881977 15.469427 -59.925068 15.473098 -59.939815 15.486155 -59.981670 15.498221 -60.024769 15.502049 -60.040154 15.514910 -60.081390 15.526977 -60.124489 15.530993 -60.140621 15.543627 -60.181133 15.555696 -60.224236 15.559881 -60.241058 15.572304 -60.280891 15.584374 -60.324005 15.588745 -60.341576 15.600941 -60.380688 15.608075 -60.406181 15.610734 -60.412109 15.616441 -60.425938 15.618023 -60.428883 15.638056 -60.468956 15.656911 -60.509602 15.670142 -60.540440 15.683685 -60.566757 15.703047 -60.607132 15.721269 -60.648029 15.723962 -60.654556 15.729274 -60.664585 15.749145 -60.704693 15.767923 -60.745312 15.777813 -60.768303 15.795200 -60.802288 15.814536 -60.842628 15.832821 -60.883438 15.833982 -60.886219 15.841215 -60.899921 15.861108 -60.939980 15.880000 -60.980511 15.897885 -61.021469 15.899363 -61.025093 15.905997 -61.037998 15.925498 -61.078251 15.944040 -61.118923 15.961616 -61.160007 15.978222 -61.201458 15.993853 -61.243259 16.008507 -61.285370 16.022182 -61.327763 16.034880 -61.370419 16.046595 -61.413292 16.057337 -61.456368 16.067101 -61.499611 16.074249 -61.534885 16.082643 -61.568562 16.092409 -61.611809 16.099806 -61.648312 16.107901 -61.680782 16.117664 -61.724030 16.125303 -61.761719 16.133108 -61.793022 16.142872 -61.836285 16.150749 -61.875149 16.158260 -61.905289 16.168026 -61.948551 16.176144 -61.988606 16.183363 -62.017578 16.193129 -62.060848 16.201487 -62.102100 16.208414 -62.129902 16.218182 -62.173176 16.226788 -62.215649 16.233412 -62.242245 16.243177 -62.285519 16.251974 -62.328934 16.255362 -62.347771 16.257267 -62.355419 16.267034 -62.398705 16.275829 -62.442123 16.283657 -62.485657 16.289543 -62.523029 16.292437 -62.535858 16.301231 -62.579285 16.309059 -62.622829 16.315927 -62.666447 16.321842 -62.710117 16.326811 -62.753826 16.330845 -62.797524 16.333948 -62.841202 16.336138 -62.884834 16.337420 -62.928390 16.337811 -62.971844 16.337322 -63.015175 16.335966 -63.058361 16.333883 -63.099037 16.334381 -63.114937 16.334871 -63.157551 16.334528 -63.200054 16.333357 -63.242428 16.331623 -63.279404 16.332344 -63.299953 16.333008 -63.341774 16.332874 -63.383499 16.332487 -63.401051 16.335165 -63.441391 16.337126 -63.482578 16.338322 -63.523724 16.338757 -63.564808 16.338440 -63.605808 16.337381 -63.646709 16.337070 -63.653771 16.337681 -63.664856 16.339176 -63.705330 16.339943 -63.745758 16.339971 -63.771504 16.342972 -63.805141 16.345821 -63.845078 16.347967 -63.885021 16.349413 -63.924957 16.350161 -63.964878 16.350214 -64.004761 16.349777 -64.032173 16.350504 -64.043419 16.351122 -64.047203 16.356796 -64.086121 16.361809 -64.125145 16.366154 -64.164246 16.369835 -64.203422 16.372849 -64.242668 16.375191 -64.281960 16.376865 -64.321281 16.377872 -64.360642 + + + + + + + + + + + 28.485352 -70.638054 28.485004 -70.695717 28.482971 -70.753380 28.479239 -70.810974 28.473789 -70.868431 28.466620 -70.925674 28.457720 -70.982620 28.447088 -71.039192 28.434725 -71.095322 28.420633 -71.150925 28.404820 -71.205933 28.387297 -71.260261 28.368076 -71.313827 28.347174 -71.366577 28.324612 -71.418427 28.300413 -71.469299 28.274599 -71.519127 28.247206 -71.567848 28.218260 -71.615387 28.187797 -71.661682 28.155861 -71.706673 28.122484 -71.750290 28.087711 -71.792480 28.051594 -71.833191 28.014326 -71.872551 27.976112 -71.910721 27.936975 -71.947662 27.896957 -71.983353 27.856092 -72.017754 27.814413 -72.050858 27.771963 -72.082626 27.728773 -72.113045 27.684885 -72.142105 27.640339 -72.169777 27.595177 -72.196037 27.549437 -72.220894 27.526520 -72.232490 27.517218 -72.237572 27.470989 -72.261116 27.464334 -72.264267 27.438005 -72.277763 27.428364 -72.282364 27.405016 -72.294403 27.392166 -72.300575 27.372021 -72.311027 27.356262 -72.318649 27.339027 -72.327652 27.292519 -72.350311 27.278030 -72.356872 27.259090 -72.366097 27.212131 -72.387352 27.164757 -72.407234 27.117008 -72.425720 27.068920 -72.442810 27.020535 -72.458511 26.971891 -72.472824 26.923027 -72.485748 26.873980 -72.497292 26.824787 -72.507462 26.775484 -72.516273 26.726116 -72.523743 26.676706 -72.529861 26.627296 -72.534660 26.577923 -72.538155 26.528620 -72.540352 26.479416 -72.541275 26.430346 -72.540955 26.381441 -72.539398 26.332731 -72.536629 26.284241 -72.532684 26.236004 -72.527580 26.188047 -72.521339 26.140390 -72.513985 26.093060 -72.505570 26.046083 -72.496094 25.999475 -72.485596 25.953260 -72.474106 25.907457 -72.461655 25.862081 -72.448280 25.817150 -72.434006 25.772676 -72.418854 25.728682 -72.402878 25.685167 -72.386101 25.642147 -72.368553 25.599634 -72.350258 25.557632 -72.331261 25.516150 -72.311592 25.475191 -72.291275 25.434759 -72.270348 25.394859 -72.248840 25.355490 -72.226776 25.316650 -72.204201 25.278341 -72.181122 25.240559 -72.157593 25.203300 -72.133621 25.166561 -72.109245 25.130337 -72.084488 25.094614 -72.059372 25.059391 -72.033920 25.024656 -72.008163 24.990406 -71.982124 24.956621 -71.955811 24.923294 -71.929253 24.890413 -71.902474 24.857971 -71.875481 24.825949 -71.848305 24.794329 -71.820938 24.763103 -71.793419 24.732262 -71.765747 24.701784 -71.737930 24.671656 -71.709984 24.641863 -71.681930 24.612387 -71.653748 24.583218 -71.625465 24.554342 -71.597076 24.525742 -71.568588 24.497400 -71.540001 24.469303 -71.511314 24.441442 -71.482536 24.437447 -71.478363 24.423130 -71.487396 24.403971 -71.499001 24.384628 -71.510231 24.365109 -71.521088 24.345417 -71.531570 24.325560 -71.541679 24.305544 -71.551399 24.285376 -71.560738 24.265062 -71.569687 24.244604 -71.578239 24.224014 -71.586403 24.203295 -71.594170 24.182453 -71.601540 24.161497 -71.608513 24.140434 -71.615082 24.119270 -71.621239 24.098005 -71.627007 24.076656 -71.632355 24.055222 -71.637299 24.033711 -71.641830 24.012133 -71.645958 23.990490 -71.649666 23.968792 -71.652969 23.947041 -71.655853 23.925247 -71.658325 23.903420 -71.660385 23.881563 -71.662025 23.859682 -71.663246 23.837784 -71.664062 23.815878 -71.664452 23.793968 -71.664436 23.772060 -71.664002 23.750164 -71.663147 23.728285 -71.661880 23.706429 -71.660202 23.684603 -71.658104 23.662815 -71.655594 23.641069 -71.652680 23.619375 -71.649353 23.597736 -71.645615 23.576160 -71.641472 23.554655 -71.636925 23.533224 -71.631966 23.511877 -71.626610 23.490620 -71.620842 23.469460 -71.614693 23.462122 -71.612404 23.443195 -71.610123 23.423689 -71.607399 23.404221 -71.604286 23.384798 -71.600815 23.365427 -71.596954 23.346113 -71.592728 23.326864 -71.588112 23.307684 -71.583138 23.288584 -71.577782 23.269568 -71.572060 23.264599 -71.570457 23.261448 -71.570206 23.244078 -71.568474 23.226719 -71.566406 23.209383 -71.563988 23.192072 -71.561226 23.174791 -71.558113 23.157551 -71.554657 23.140356 -71.550842 23.123217 -71.546692 23.106136 -71.542183 23.089119 -71.537323 23.072174 -71.532112 23.064714 -71.529655 23.064259 -71.529633 23.049013 -71.528587 23.033762 -71.527229 23.018513 -71.525551 23.003269 -71.523552 22.988043 -71.521225 22.972836 -71.518585 22.957657 -71.515610 22.942513 -71.512322 22.927410 -71.508690 22.912357 -71.504746 22.897360 -71.500465 22.882427 -71.495850 22.867561 -71.490906 22.867146 -71.490761 22.857945 -71.490540 22.844761 -71.489937 22.831558 -71.489044 22.818346 -71.487854 22.805128 -71.486366 22.791914 -71.484573 22.778709 -71.482483 22.765526 -71.480087 22.752365 -71.477386 22.739235 -71.474365 22.731949 -71.472511 22.731384 -71.473091 22.724863 -71.479706 22.718287 -71.486321 22.711651 -71.492943 22.704950 -71.499558 22.698181 -71.506172 22.691338 -71.512787 22.684414 -71.519386 22.677408 -71.525993 22.670315 -71.532577 22.663124 -71.539154 22.655840 -71.545723 22.648451 -71.552254 22.640955 -71.558769 22.633350 -71.565262 22.625628 -71.571716 22.617786 -71.578125 22.609823 -71.584503 22.601732 -71.590820 22.593514 -71.597084 22.585163 -71.603287 22.576675 -71.609421 22.568050 -71.615471 22.559288 -71.621437 22.550383 -71.627319 22.541334 -71.633095 22.532141 -71.638771 22.522802 -71.644325 22.518919 -71.646553 22.514254 -71.651421 22.507414 -71.658508 22.500477 -71.665611 22.493444 -71.672730 22.486305 -71.679863 22.479054 -71.687012 22.471687 -71.694153 22.464199 -71.701302 22.456577 -71.708450 22.448826 -71.715576 22.440933 -71.722687 22.432896 -71.729774 22.424711 -71.736832 22.416372 -71.743843 22.407881 -71.750801 22.399223 -71.757706 22.390408 -71.764542 22.381422 -71.771316 22.372267 -71.777985 22.362944 -71.784569 22.353447 -71.791054 22.343777 -71.797417 22.333933 -71.803665 22.323914 -71.809769 22.321213 -71.811348 22.317486 -71.815590 22.310421 -71.823540 22.303225 -71.831528 22.295889 -71.839561 22.288404 -71.847618 22.280769 -71.855705 22.272972 -71.863808 22.265007 -71.871918 22.256868 -71.880020 22.248550 -71.888115 22.240046 -71.896187 22.231348 -71.904228 22.222460 -71.912224 22.213368 -71.920174 22.204073 -71.928047 22.194574 -71.935844 22.184866 -71.943558 22.174946 -71.951164 22.164812 -71.958656 22.161860 -71.960754 22.158772 -71.964722 22.145492 -71.980949 22.131971 -71.996666 22.118236 -72.011887 22.104317 -72.026596 22.100893 -72.030052 22.095383 -72.039391 22.083729 -72.057999 22.071697 -72.076141 22.059307 -72.093819 22.046595 -72.111015 22.033583 -72.127716 22.020302 -72.143921 22.006781 -72.159622 21.993048 -72.174835 21.979128 -72.189529 21.975132 -72.193558 21.970034 -72.202194 21.958380 -72.220787 21.946346 -72.238922 21.933958 -72.256576 21.921244 -72.273758 21.908234 -72.290443 21.894951 -72.306633 21.881432 -72.322327 21.867697 -72.337524 21.853777 -72.352211 21.849199 -72.356819 21.844530 -72.364723 21.832876 -72.383301 21.820841 -72.401413 21.808453 -72.419052 21.795738 -72.436218 21.782726 -72.452889 21.769445 -72.469070 21.755922 -72.484749 21.742189 -72.499931 21.728270 -72.514603 21.723133 -72.519775 21.718872 -72.526977 21.707216 -72.545540 21.695183 -72.563637 21.682794 -72.581268 21.670078 -72.598411 21.657068 -72.615067 21.643787 -72.631233 21.630264 -72.646896 21.616531 -72.662064 21.602611 -72.676727 21.596897 -72.682472 21.593054 -72.688965 21.581398 -72.707504 21.569364 -72.725594 21.556974 -72.743202 21.544260 -72.760330 21.531250 -72.776978 21.517967 -72.793129 21.504446 -72.808777 21.490711 -72.823936 21.476791 -72.838585 21.470522 -72.844887 21.467085 -72.850685 21.455429 -72.869209 21.443394 -72.887276 21.431004 -72.904869 21.418289 -72.921990 21.405279 -72.938621 21.391996 -72.954758 21.378475 -72.970398 21.370962 -72.978676 21.366354 -72.993111 21.358547 -73.015388 21.350172 -73.037331 21.341251 -73.058922 21.331808 -73.080131 21.326836 -73.090538 21.326754 -73.090858 21.320009 -73.114380 21.312662 -73.137611 21.304737 -73.160507 21.296249 -73.183067 21.287231 -73.205254 21.277697 -73.227066 21.273285 -73.236496 21.266682 -73.259659 21.259203 -73.283516 21.251154 -73.307037 21.242556 -73.330223 21.233433 -73.353027 21.223808 -73.375450 21.219929 -73.383911 21.213564 -73.406372 21.205950 -73.430862 21.197775 -73.455025 21.189064 -73.478828 21.179836 -73.502258 21.170117 -73.525307 21.166813 -73.532646 21.160650 -73.554512 21.152901 -73.579651 21.144598 -73.604446 21.135767 -73.628883 21.126431 -73.652954 21.116612 -73.676628 21.106333 -73.699905 21.095621 -73.722771 21.084499 -73.745216 21.072992 -73.767235 21.061127 -73.788811 21.048925 -73.809944 21.036415 -73.830620 21.023621 -73.850853 21.010567 -73.870628 20.997278 -73.889946 20.983780 -73.908813 20.970099 -73.927231 20.956253 -73.945198 20.942272 -73.962715 20.928175 -73.979805 20.915762 -73.994370 20.909842 -74.003334 20.896553 -74.022636 20.883057 -74.041489 20.869373 -74.059898 20.855526 -74.077858 20.841545 -74.095360 20.827450 -74.112434 20.813261 -74.129074 20.799002 -74.145287 20.784695 -74.161095 20.770359 -74.176491 20.756018 -74.191490 20.741684 -74.206116 20.727385 -74.220367 20.713127 -74.234261 20.698936 -74.247818 20.684824 -74.261047 20.670807 -74.273972 20.656895 -74.286598 20.643103 -74.298958 20.629440 -74.311058 20.615921 -74.322914 20.602551 -74.334557 20.589338 -74.345985 20.576292 -74.357246 20.563414 -74.368339 20.550713 -74.379288 20.538187 -74.390106 20.525845 -74.400825 20.513685 -74.411453 20.501701 -74.422020 20.489901 -74.432541 20.478277 -74.443024 20.466824 -74.453499 20.455542 -74.463989 20.444424 -74.474487 20.433460 -74.485039 20.422646 -74.495644 20.411968 -74.506317 20.401422 -74.517082 20.390995 -74.527947 20.380533 -74.538765 20.369894 -74.549393 20.359079 -74.559814 20.348097 -74.570030 20.336947 -74.580048 20.325632 -74.589851 20.314157 -74.599449 20.302527 -74.608826 20.290741 -74.617989 20.278809 -74.626930 20.266727 -74.635643 20.254507 -74.644134 20.242147 -74.652389 20.229651 -74.660423 20.228353 -74.661224 20.214672 -74.673828 20.193466 -74.692627 20.174828 -74.708527 20.152687 -74.730537 20.130310 -74.751846 20.107799 -74.772392 20.085199 -74.792175 20.062548 -74.811226 20.039883 -74.829544 20.017248 -74.847153 19.994680 -74.864067 19.972212 -74.880302 19.949884 -74.895882 19.927727 -74.910828 19.905775 -74.925171 19.895794 -74.931496 19.881767 -74.942825 19.859133 -74.960411 19.836563 -74.977310 19.814095 -74.993523 19.791767 -75.009087 19.769611 -75.024025 19.747660 -75.038361 19.725943 -75.052101 19.704491 -75.065292 19.683333 -75.077965 19.662495 -75.090134 19.641996 -75.101852 19.621866 -75.113129 19.602121 -75.124008 19.582781 -75.134529 19.563862 -75.144722 19.550371 -75.151939 19.541939 -75.159210 19.530464 -75.168762 19.518835 -75.178093 19.507052 -75.187218 19.495117 -75.196114 19.483036 -75.204788 19.470817 -75.213234 19.458458 -75.221459 19.445961 -75.229454 19.433338 -75.237221 19.420584 -75.244743 19.407709 -75.252029 19.405789 -75.253075 19.395208 -75.262528 19.383894 -75.272270 19.372421 -75.281815 19.360790 -75.291138 19.349005 -75.300247 19.337072 -75.309135 19.324993 -75.317802 19.312773 -75.326241 19.300413 -75.334457 19.287918 -75.342453 19.275293 -75.350205 19.262541 -75.357719 19.249666 -75.365006 19.247271 -75.366303 19.237091 -75.375389 19.225777 -75.385132 19.214304 -75.394661 19.202673 -75.403976 19.190887 -75.413078 19.178957 -75.421959 19.166878 -75.430618 19.154655 -75.439056 19.142296 -75.447266 19.129803 -75.455246 19.117176 -75.462990 19.104426 -75.470505 19.091551 -75.477783 19.078558 -75.484817 19.065447 -75.491615 19.052227 -75.498169 19.038900 -75.504486 19.025469 -75.510551 19.011942 -75.516357 18.998320 -75.521927 18.984604 -75.527245 18.970804 -75.532303 18.956922 -75.537102 18.942961 -75.541657 18.928927 -75.545952 18.914825 -75.549988 18.900656 -75.553757 18.886429 -75.557266 18.872145 -75.560516 18.857807 -75.563507 18.843424 -75.566238 18.828997 -75.568695 18.814531 -75.570885 18.800030 -75.572823 18.785500 -75.574478 18.770945 -75.575874 18.756369 -75.577003 18.741774 -75.577866 18.727167 -75.578461 18.712557 -75.578781 18.697941 -75.578842 18.683325 -75.578629 18.668716 -75.578155 18.654118 -75.577408 18.639534 -75.576401 18.624966 -75.575119 18.610424 -75.573578 18.608913 -75.573387 18.608311 -75.573463 18.595486 -75.574776 18.582651 -75.575836 18.569818 -75.576660 18.556986 -75.577232 18.544161 -75.577568 18.531347 -75.577652 18.518549 -75.577507 18.505768 -75.577118 18.493011 -75.576485 18.480286 -75.575630 18.467588 -75.574539 18.459389 -75.573677 18.459137 -75.573738 18.447912 -75.576088 18.436665 -75.578194 18.425396 -75.580063 18.414114 -75.581688 18.402824 -75.583076 18.391527 -75.584236 18.380234 -75.585159 18.368946 -75.585861 18.357668 -75.586319 18.346407 -75.586563 18.335167 -75.586578 18.323952 -75.586372 18.312763 -75.585945 18.301609 -75.585312 18.290493 -75.584457 18.279417 -75.583397 18.271814 -75.582527 18.268570 -75.582733 18.258171 -75.583191 18.247789 -75.583427 18.245213 -75.583435 18.236544 -75.585274 18.226713 -75.587112 18.216865 -75.588715 18.207006 -75.590073 18.197144 -75.591194 18.187284 -75.592072 18.186125 -75.592148 18.164396 -75.601921 18.159170 -75.604080 18.142187 -75.616463 18.108643 -75.639244 18.074566 -75.660767 18.040031 -75.681023 18.031992 -75.685394 18.015694 -75.696449 17.982183 -75.717606 17.948225 -75.737518 17.916750 -75.754616 17.886149 -75.773918 17.852766 -75.793472 17.820734 -75.810860 17.790094 -75.830177 17.757286 -75.849396 17.724642 -75.867104 17.694027 -75.886398 17.661793 -75.905266 17.629206 -75.922936 17.628799 -75.923141 17.597942 -75.942574 17.566286 -75.961090 17.534277 -75.978439 17.532867 -75.979141 17.532513 -75.979385 17.501842 -75.998695 17.470758 -76.016869 17.439333 -76.033890 17.436922 -76.035095 17.435831 -76.035835 17.405727 -76.054779 17.382992 -76.068062 17.377726 -76.071884 17.348371 -76.091736 17.341610 -76.095985 17.328314 -76.106331 17.299490 -76.127243 17.270136 -76.147080 17.240314 -76.165825 17.210096 -76.183464 17.179541 -76.199997 17.148716 -76.215401 17.117689 -76.229683 17.086525 -76.242851 17.055285 -76.254898 17.024038 -76.265831 16.992849 -76.275673 16.961781 -76.284424 16.930893 -76.292107 16.900249 -76.298744 16.869909 -76.304359 16.839932 -76.308975 16.810375 -76.312630 16.781292 -76.315346 16.752737 -76.317162 16.724762 -76.318108 16.697412 -76.318245 16.670742 -76.317596 16.644791 -76.316208 16.619600 -76.314140 16.595213 -76.311439 16.571663 -76.308136 16.548984 -76.304306 16.527210 -76.299988 16.506367 -76.295242 16.486479 -76.290131 16.467571 -76.284706 16.449658 -76.279022 16.437340 -76.274742 16.429667 -76.272995 16.410915 -76.268181 16.393085 -76.263062 16.376198 -76.257713 16.367031 -76.254524 16.350863 -76.250855 16.333248 -76.246323 16.316500 -76.241524 16.300632 -76.236496 16.289860 -76.232758 16.289326 -76.232651 16.272053 -76.228729 16.262442 -76.226265 16.262070 -76.226479 16.254442 -76.230621 16.246073 -76.234879 16.236958 -76.239197 16.227098 -76.243561 16.216495 -76.247902 16.205152 -76.252182 16.193079 -76.256371 16.180281 -76.260414 16.166771 -76.264275 16.152563 -76.267906 16.137672 -76.271271 16.122114 -76.274338 16.105913 -76.277054 16.089090 -76.279388 16.071667 -76.281303 16.053671 -76.282753 16.035135 -76.283730 16.016079 -76.284164 15.996546 -76.284050 15.976561 -76.283348 15.956165 -76.282036 15.935391 -76.280090 15.914281 -76.277473 15.892868 -76.274170 15.871198 -76.270165 15.849312 -76.265427 15.827249 -76.259956 15.805059 -76.253723 15.782783 -76.246727 15.760465 -76.238953 15.738153 -76.230393 15.715893 -76.221054 15.703545 -76.215408 15.695715 -76.212402 15.674343 -76.203438 15.673056 -76.202850 15.671699 -76.202377 15.651172 -76.194511 15.630690 -76.185921 15.628735 -76.185028 15.626261 -76.184166 15.606626 -76.176643 15.587034 -76.168419 15.584246 -76.167145 15.580823 -76.165955 15.562080 -76.158775 15.554145 -76.155449 15.539440 -76.152275 15.521790 -76.147896 15.504038 -76.142921 15.486215 -76.137337 15.468358 -76.131126 15.457254 -76.126877 15.444717 -76.122940 15.426864 -76.116737 15.422659 -76.115128 15.419459 -76.114227 15.401638 -76.108643 15.383783 -76.102440 15.379681 -76.100868 15.376376 -76.099945 15.358553 -76.094360 15.340699 -76.088158 15.336605 -76.086594 15.333290 -76.085663 15.315468 -76.080078 15.297612 -76.073875 15.293595 -76.072342 15.290203 -76.071388 15.272382 -76.065811 15.254526 -76.059608 15.250509 -76.058075 15.247117 -76.057121 15.229293 -76.051544 15.211437 -76.045342 15.207468 -76.043823 15.204028 -76.042862 15.186205 -76.037277 15.168349 -76.031075 15.150500 -76.024254 15.132690 -76.016800 15.114958 -76.008713 15.097341 -76.000000 15.079876 -75.990654 15.062602 -75.980682 15.045556 -75.970100 15.028772 -75.958900 15.012290 -75.947098 14.996145 -75.934700 14.980372 -75.921730 14.965006 -75.908203 14.950080 -75.894127 14.935631 -75.879524 14.921689 -75.864410 14.908284 -75.848816 14.903755 -75.843147 14.895926 -75.836250 14.881001 -75.822182 14.866550 -75.807579 14.852610 -75.792481 14.842731 -75.780991 14.839525 -75.778351 14.824161 -75.764831 14.809235 -75.750763 14.794784 -75.736160 14.780842 -75.721062 14.771101 -75.709732 14.767735 -75.706970 14.752369 -75.693451 14.737445 -75.679382 14.722994 -75.664795 14.709051 -75.649696 14.699392 -75.638474 14.695924 -75.635620 14.680557 -75.622116 14.665632 -75.608047 14.651183 -75.593468 14.637240 -75.578369 14.627788 -75.567383 14.624087 -75.564346 14.608721 -75.550835 14.593796 -75.536774 14.579346 -75.522194 14.565402 -75.507103 14.556061 -75.496254 14.552229 -75.493111 14.536862 -75.479599 14.521936 -75.465553 14.507485 -75.450974 14.493544 -75.435898 14.484311 -75.425171 14.480346 -75.421921 14.464980 -75.408417 14.450054 -75.394363 14.435605 -75.379799 14.421661 -75.364716 14.414532 -75.356438 14.401418 -75.344101 14.386969 -75.329536 14.373025 -75.314461 14.372335 -75.313660 14.366089 -75.308174 14.351163 -75.294136 14.336714 -75.279572 14.322771 -75.264496 14.322186 -75.263817 14.315823 -75.258232 14.300898 -75.244202 14.286447 -75.229630 14.272505 -75.214561 14.272008 -75.213982 14.265547 -75.208313 14.250621 -75.194275 14.236171 -75.179718 14.222228 -75.164658 14.221748 -75.164101 14.215259 -75.158409 14.200334 -75.144379 14.185884 -75.129822 14.171941 -75.114761 14.171579 -75.114342 14.164962 -75.108536 14.150036 -75.094505 14.135586 -75.079956 14.121643 -75.064896 14.108238 -75.049355 14.095404 -75.033348 14.083167 -75.016914 14.071557 -75.000069 14.060600 -74.982842 14.050323 -74.965263 14.040749 -74.947349 14.031898 -74.929161 14.023793 -74.910706 14.016453 -74.892029 14.009895 -74.873161 14.004137 -74.854134 13.999190 -74.834991 13.995070 -74.815758 13.991782 -74.796486 13.989339 -74.777206 13.987747 -74.757950 13.987006 -74.738762 13.987127 -74.719688 13.988106 -74.700752 13.989941 -74.681999 13.992631 -74.663467 13.996171 -74.645195 14.000553 -74.627220 14.005771 -74.609581 14.011811 -74.592308 14.018663 -74.575447 14.026314 -74.559021 14.034744 -74.543083 14.043939 -74.527641 14.053876 -74.512756 14.064538 -74.498428 14.075901 -74.484726 14.087938 -74.471642 14.100413 -74.459000 14.113103 -74.446579 14.126000 -74.434387 14.139104 -74.422432 14.152407 -74.410713 14.165908 -74.399223 14.179602 -74.387978 14.193484 -74.376976 14.207552 -74.366226 14.221800 -74.355728 14.236223 -74.345482 14.250818 -74.335495 14.265581 -74.325775 14.280507 -74.316315 14.295590 -74.307121 14.310828 -74.298203 14.326216 -74.289551 14.341746 -74.281174 14.357416 -74.273079 14.373223 -74.265266 14.389159 -74.257736 14.405223 -74.250488 14.421405 -74.243530 14.437703 -74.236862 14.454113 -74.230484 14.470627 -74.224396 14.487243 -74.218613 14.503955 -74.213120 14.520755 -74.207931 14.537642 -74.203041 14.554610 -74.198456 14.571653 -74.194168 14.588767 -74.190193 14.605945 -74.186523 14.623182 -74.183159 14.640474 -74.180099 14.657817 -74.177361 14.675202 -74.174927 14.692625 -74.172798 14.710083 -74.170990 14.727568 -74.169495 14.745077 -74.168312 14.762602 -74.167442 14.780140 -74.166885 14.797685 -74.166649 14.815230 -74.166725 14.832771 -74.167114 14.850305 -74.167816 14.867823 -74.168831 14.885320 -74.170166 14.902793 -74.171814 14.920236 -74.173775 14.937641 -74.176048 14.955005 -74.178635 14.972324 -74.181534 14.989592 -74.184730 15.006798 -74.188255 15.023946 -74.192085 15.041024 -74.196213 15.058031 -74.200661 15.074960 -74.205406 15.091804 -74.210457 15.108560 -74.215813 15.125223 -74.221466 15.141788 -74.227425 15.158249 -74.233673 15.174601 -74.240219 15.190840 -74.247063 15.206961 -74.254196 15.222957 -74.261620 15.238825 -74.269333 15.254559 -74.277321 15.270155 -74.285599 15.285608 -74.294159 15.300913 -74.303001 15.316068 -74.312111 15.331063 -74.321495 15.345899 -74.331154 15.360568 -74.341072 15.375065 -74.351257 15.389388 -74.361694 15.403530 -74.372398 15.417489 -74.383354 15.431260 -74.394562 15.444839 -74.406021 15.450215 -74.410721 15.450638 -74.409798 15.467381 -74.377640 15.485654 -74.346497 15.505417 -74.316444 15.526627 -74.287544 15.549240 -74.259842 15.573209 -74.233414 15.598052 -74.207863 15.623323 -74.182747 15.649010 -74.158081 15.675110 -74.133881 15.701610 -74.110153 15.728505 -74.086891 15.755787 -74.064117 15.783445 -74.041832 15.811475 -74.020035 15.839866 -73.998749 15.868609 -73.977974 15.897699 -73.957703 15.902354 -73.954582 15.918080 -73.942779 15.946823 -73.921989 15.975911 -73.901718 15.980084 -73.898918 15.996278 -73.886757 16.025019 -73.865959 16.054106 -73.845680 16.057812 -73.843193 16.074463 -73.830688 16.103205 -73.809883 16.132288 -73.789597 16.135550 -73.787407 16.152630 -73.774574 16.181368 -73.753754 16.210451 -73.733452 16.213297 -73.731537 16.230780 -73.718399 16.259520 -73.697571 16.288603 -73.677254 16.291166 -73.675529 16.308918 -73.662186 16.337654 -73.641342 16.366737 -73.621025 16.368624 -73.619759 16.387033 -73.605904 16.415771 -73.585060 16.444853 -73.564728 16.446449 -73.563652 16.465137 -73.549583 16.477894 -73.540321 16.483232 -73.536003 16.511253 -73.514122 16.539633 -73.492744 16.568367 -73.471878 16.597446 -73.451530 16.626862 -73.431702 16.656603 -73.412407 16.686663 -73.393646 16.717033 -73.375427 16.747702 -73.357758 16.778662 -73.340630 16.809904 -73.324066 16.841415 -73.308067 16.873194 -73.292633 16.886480 -73.286469 16.890352 -73.284325 16.921595 -73.267746 16.953106 -73.251739 16.984882 -73.236290 16.997629 -73.230377 17.002031 -73.227936 17.033272 -73.211349 17.064781 -73.195328 17.096554 -73.179871 17.108793 -73.174179 17.113686 -73.171471 17.144922 -73.154869 17.176434 -73.138832 17.208204 -73.123367 17.219999 -73.117882 17.225325 -73.114929 17.256559 -73.098320 17.288069 -73.082268 17.319840 -73.066788 17.331041 -73.061577 17.336948 -73.058296 17.368183 -73.041679 17.399689 -73.025620 17.431459 -73.010124 17.442406 -73.005028 17.448555 -73.001610 17.479788 -72.984970 17.511293 -72.968895 17.543060 -72.953392 17.553467 -72.948540 17.560141 -72.944832 17.591373 -72.928177 17.622879 -72.912102 17.654644 -72.896584 17.664549 -72.891960 17.671715 -72.887978 17.672291 -72.887672 17.697386 -72.868622 17.726105 -72.847618 17.755167 -72.827118 17.784567 -72.807144 17.811483 -72.789543 17.828257 -72.776665 17.856869 -72.755539 17.885843 -72.734978 17.915178 -72.714996 17.944855 -72.695580 17.945358 -72.695267 17.959154 -72.684532 17.987665 -72.663284 18.016571 -72.642654 18.045860 -72.622642 18.072260 -72.605400 18.089552 -72.591568 18.117817 -72.569954 18.146511 -72.548988 18.175613 -72.528671 18.205109 -72.509026 18.215916 -72.502167 18.220110 -72.498711 18.248125 -72.476715 18.276602 -72.455406 18.305527 -72.434792 18.334877 -72.414886 18.357744 -72.400139 18.378418 -72.383377 18.399235 -72.367332 18.404011 -72.360687 18.426146 -72.332184 18.449284 -72.304558 18.473394 -72.277878 18.498306 -72.251991 18.523850 -72.226807 18.550003 -72.202324 18.576754 -72.178566 18.604071 -72.155540 18.631939 -72.133270 18.660336 -72.111778 18.689234 -72.091072 18.718615 -72.071159 18.748455 -72.052063 18.752714 -72.049492 18.764532 -72.040070 18.792250 -72.019142 18.820463 -71.998993 18.849148 -71.979622 18.878281 -71.961059 18.881281 -71.959259 18.897024 -71.946732 18.924063 -71.926376 18.951588 -71.906776 18.979578 -71.887962 19.008007 -71.869919 19.009760 -71.868874 19.029404 -71.853279 19.055765 -71.833496 19.082604 -71.814461 19.109896 -71.796181 19.137617 -71.778687 19.138056 -71.778427 19.161678 -71.759720 19.187365 -71.740509 19.188686 -71.739578 19.197556 -71.726845 19.216482 -71.701424 19.236177 -71.676651 19.256626 -71.652557 19.277800 -71.629173 19.299627 -71.606453 19.322031 -71.584366 19.344994 -71.562935 19.368502 -71.542175 19.392527 -71.522095 19.417053 -71.502716 19.442057 -71.484055 19.467518 -71.466118 19.493416 -71.448921 19.496460 -71.447022 19.504789 -71.439209 19.527578 -71.418968 19.550858 -71.399361 19.574615 -71.380424 19.578424 -71.377548 19.589252 -71.365585 19.610031 -71.343903 19.631338 -71.322792 19.653152 -71.302269 19.675463 -71.282364 19.698246 -71.263077 19.721489 -71.244423 19.727125 -71.240143 19.738775 -71.227264 19.759132 -71.205986 19.779999 -71.185265 19.801355 -71.165108 19.823187 -71.145538 19.845472 -71.126564 19.868200 -71.108208 19.875692 -71.102463 19.888142 -71.088699 19.908081 -71.067833 19.928509 -71.047501 19.949402 -71.027710 19.970753 -71.008484 19.992542 -70.989822 20.014757 -70.971748 20.024149 -70.964493 20.037348 -70.949898 20.056870 -70.929436 20.076857 -70.909493 20.097290 -70.890076 20.118164 -70.871185 20.139456 -70.852837 20.161156 -70.835053 20.172588 -70.826149 20.186396 -70.810875 20.205498 -70.790825 20.225042 -70.771271 20.245018 -70.752213 20.265410 -70.733665 20.286207 -70.715637 20.301558 -70.702957 20.312338 -70.690323 20.330530 -70.670181 20.349213 -70.650559 20.368319 -70.631386 20.387831 -70.612701 20.407747 -70.594490 20.428045 -70.576782 20.448717 -70.559578 20.469751 -70.542885 20.491127 -70.526718 20.512840 -70.511086 20.534870 -70.495987 20.557205 -70.481438 20.575087 -70.470375 20.580257 -70.465645 20.600555 -70.447907 20.621225 -70.430687 20.642258 -70.413979 20.663633 -70.397789 20.685345 -70.382133 20.707373 -70.367020 20.729706 -70.352448 20.752327 -70.338440 20.775227 -70.324989 20.798386 -70.312096 20.821789 -70.299782 20.845423 -70.288040 20.869274 -70.276878 20.893326 -70.266304 20.917563 -70.256302 20.920408 -70.255203 20.922096 -70.254135 20.944397 -70.240784 20.966974 -70.228004 20.989809 -70.215828 21.012884 -70.204239 21.036184 -70.193245 21.059698 -70.182854 21.083399 -70.173073 21.088051 -70.171280 21.092400 -70.168434 21.114037 -70.155037 21.135963 -70.142235 21.158163 -70.130020 21.180614 -70.118408 21.190582 -70.113579 21.192265 -70.112228 21.212469 -70.096893 21.233034 -70.082146 21.253950 -70.067986 21.275192 -70.054436 21.296749 -70.041496 21.318594 -70.029167 21.340713 -70.017471 21.363090 -70.006401 21.385700 -69.995964 21.408529 -69.986168 21.431557 -69.977013 21.432156 -69.976791 21.446428 -69.967316 21.467299 -69.954292 21.488478 -69.941887 21.509949 -69.930115 21.531691 -69.918983 21.553686 -69.908485 21.575911 -69.898643 21.598349 -69.889450 21.611422 -69.884521 21.618631 -69.879517 21.638800 -69.866386 21.659294 -69.853889 21.680103 -69.842026 21.701197 -69.830803 21.714523 -69.824211 21.719231 -69.820091 21.737755 -69.804855 21.756697 -69.790230 21.776035 -69.776222 21.795750 -69.762856 21.815823 -69.750130 21.836231 -69.738060 21.856955 -69.726654 21.877968 -69.715927 21.899254 -69.705872 21.920790 -69.696510 21.942549 -69.687828 21.964516 -69.679840 21.976591 -69.675865 21.977077 -69.675514 21.996792 -69.662117 22.016863 -69.649368 22.037270 -69.637291 22.057991 -69.625870 22.079002 -69.615120 22.100290 -69.605049 22.118978 -69.596901 22.128429 -69.588905 22.147389 -69.573738 22.166719 -69.559151 22.186407 -69.545143 22.206430 -69.531731 22.226776 -69.518906 22.247419 -69.506699 22.268351 -69.495102 22.289543 -69.484131 22.310984 -69.473778 22.324936 -69.467522 22.336962 -69.457596 22.356289 -69.442436 22.375946 -69.427811 22.395924 -69.413719 22.416206 -69.400169 22.436777 -69.387161 22.457621 -69.374725 22.478724 -69.362839 22.500065 -69.351524 22.521633 -69.340782 22.533874 -69.335068 22.545788 -69.325378 22.565418 -69.310120 22.585348 -69.295349 22.605570 -69.281059 22.626064 -69.267273 22.646822 -69.253975 22.667830 -69.241188 22.689077 -69.228897 22.710550 -69.217133 22.732237 -69.205879 22.746227 -69.199020 22.754816 -69.192062 22.774702 -69.176613 22.794859 -69.161591 22.815275 -69.146996 22.835947 -69.132851 22.856865 -69.119141 22.878016 -69.105896 22.899391 -69.093094 22.920984 -69.080750 22.942785 -69.068871 22.945677 -69.067367 22.958624 -69.056839 22.978714 -69.041077 22.999058 -69.025688 23.019644 -69.010689 23.040466 -68.996063 23.061522 -68.981834 23.082800 -68.968002 23.104301 -68.954567 23.126013 -68.941536 23.147928 -68.928909 23.170046 -68.916695 23.192356 -68.904900 23.214851 -68.893524 23.237526 -68.882568 23.260374 -68.872032 23.283386 -68.861931 23.304840 -68.852989 23.316843 -68.844543 23.337898 -68.830284 23.359171 -68.816414 23.380672 -68.802948 23.402380 -68.789887 23.424294 -68.777229 23.446411 -68.764992 23.468716 -68.753166 23.491209 -68.741760 23.513882 -68.730782 23.536728 -68.720230 23.559736 -68.710098 23.579750 -68.701729 23.593065 -68.692337 23.614115 -68.678047 23.635389 -68.664154 23.656887 -68.650658 23.678593 -68.637558 23.700506 -68.624878 23.722618 -68.612610 23.744924 -68.600754 23.767416 -68.589325 23.790083 -68.578316 23.812927 -68.567734 23.835936 -68.557587 23.854452 -68.549820 23.869127 -68.539444 23.890177 -68.525116 23.911448 -68.511192 23.932939 -68.497658 23.954645 -68.484535 23.976557 -68.471825 23.998667 -68.459526 24.020969 -68.447647 24.043457 -68.436188 24.066126 -68.425148 24.088968 -68.414543 24.111975 -68.404373 24.115274 -68.402985 24.119472 -68.399895 24.140287 -68.385147 24.161333 -68.370788 24.182604 -68.356827 24.204094 -68.343262 24.225798 -68.330116 24.247704 -68.317367 24.269812 -68.305038 24.292114 -68.293129 24.314600 -68.281647 24.337267 -68.270584 24.360106 -68.259949 24.383110 -68.249748 24.406273 -68.239990 24.429586 -68.230667 24.453049 -68.221779 24.476644 -68.213348 24.500376 -68.205360 24.524227 -68.197823 24.548193 -68.190735 24.572271 -68.184105 24.596451 -68.177940 24.620724 -68.172226 24.645083 -68.166985 24.646179 -68.166771 24.658091 -68.163002 24.682058 -68.155907 24.706135 -68.149269 24.730312 -68.143089 24.754585 -68.137375 24.778944 -68.132111 24.779909 -68.131920 24.791948 -68.128105 24.815916 -68.121002 24.839991 -68.114357 24.864168 -68.108170 24.888441 -68.102440 24.907099 -68.098412 24.924109 -68.093010 24.948074 -68.085899 24.972149 -68.079239 24.996325 -68.073044 25.020596 -68.067314 25.044952 -68.062042 25.069391 -68.057236 25.093901 -68.052895 25.118479 -68.049034 25.143110 -68.045631 25.167791 -68.042702 25.192520 -68.040237 25.217281 -68.038261 25.242067 -68.036751 25.266876 -68.035721 25.291697 -68.035164 25.316523 -68.035088 25.341347 -68.035477 25.366159 -68.036354 25.375391 -68.036858 25.384581 -68.036118 25.409367 -68.034607 25.434176 -68.033569 25.458996 -68.033005 25.483820 -68.032929 25.508644 -68.033317 25.533457 -68.034187 25.542669 -68.034691 25.551880 -68.033951 25.576666 -68.032433 25.601473 -68.031395 25.618633 -68.031006 25.627195 -68.029480 25.651768 -68.025581 25.676399 -68.022163 25.701077 -68.019211 25.725802 -68.016739 25.750561 -68.014740 25.775347 -68.013214 25.800154 -68.012169 25.824972 -68.011604 25.849794 -68.011513 25.874619 -68.011902 25.899429 -68.012772 25.913239 -68.013527 25.932215 -68.014191 25.945871 -68.014938 25.964996 -68.015610 25.977995 -68.016319 25.997770 -68.017029 26.011230 -68.017761 26.030539 -68.018448 26.038954 -68.018913 26.039137 -68.018913 26.062489 -68.019753 26.085825 -68.021034 26.109135 -68.022766 26.132414 -68.024963 26.155657 -68.027596 26.178854 -68.030693 26.201996 -68.034233 26.225082 -68.038216 26.248100 -68.042648 26.271042 -68.047539 26.293907 -68.052864 26.316685 -68.058624 26.339365 -68.064842 26.361944 -68.071495 26.384419 -68.078590 26.406773 -68.086121 26.429010 -68.094086 26.451115 -68.102486 26.473084 -68.111305 26.494909 -68.120567 26.516588 -68.130249 26.538109 -68.140350 26.559469 -68.150879 26.580658 -68.161820 26.601671 -68.173172 26.622503 -68.184937 26.643145 -68.197113 26.663591 -68.209686 26.683838 -68.222664 26.703877 -68.236031 26.723699 -68.249794 26.743305 -68.263946 26.762682 -68.278480 26.781828 -68.293388 26.800735 -68.308678 26.819399 -68.324333 26.837812 -68.340363 26.855970 -68.356743 26.873869 -68.373489 26.891499 -68.390579 26.908855 -68.408020 26.925936 -68.425796 26.942734 -68.443909 26.959589 -68.461967 26.976864 -68.479637 26.994587 -68.496925 27.012785 -68.513885 27.031487 -68.530563 27.050703 -68.546989 27.070457 -68.563225 27.090769 -68.579308 27.111647 -68.595276 27.133108 -68.611191 27.155151 -68.627098 27.177790 -68.643044 27.201023 -68.659088 27.224852 -68.675278 27.249273 -68.691666 27.274281 -68.708298 27.299866 -68.725235 27.326016 -68.742523 27.352718 -68.760208 27.379957 -68.778358 27.407709 -68.797012 27.435951 -68.816223 27.464663 -68.836037 27.493811 -68.856506 27.523363 -68.877670 27.553291 -68.899574 27.583557 -68.922264 27.614124 -68.945770 27.644949 -68.970154 27.675993 -68.995438 27.707209 -69.021652 27.738550 -69.048836 27.769968 -69.077019 27.801415 -69.106224 27.832834 -69.136482 27.864178 -69.167808 27.895386 -69.200226 27.926405 -69.233749 27.957178 -69.268394 27.987650 -69.304161 28.017756 -69.341057 28.047443 -69.379097 28.076645 -69.418274 28.105307 -69.458580 28.133368 -69.500000 28.160765 -69.542541 28.187441 -69.586189 28.213337 -69.630905 28.238388 -69.676681 28.262543 -69.723496 28.285740 -69.771316 28.307922 -69.820114 28.329039 -69.869843 28.349028 -69.920479 28.367844 -69.971977 28.385433 -70.024284 28.401745 -70.077362 28.416735 -70.131164 28.430353 -70.185631 28.442562 -70.240700 28.453318 -70.296318 28.462578 -70.352440 28.470316 -70.408974 28.476490 -70.465874 28.481071 -70.523071 28.484034 -70.580483 + + + + + + + + + + + 15.037821 -64.400002 15.037693 -64.415047 15.037309 -64.430092 15.036668 -64.445114 15.035771 -64.460136 15.034621 -64.475136 15.033214 -64.490105 15.031552 -64.505058 15.029638 -64.519974 15.028056 -64.530815 15.028134 -64.539932 15.028006 -64.554977 15.027621 -64.570023 15.026983 -64.585045 15.026087 -64.600067 15.024934 -64.615059 15.023529 -64.630035 15.021867 -64.644981 15.019952 -64.659897 15.017781 -64.674774 15.015360 -64.689613 15.012684 -64.704407 15.009759 -64.719147 15.006583 -64.733818 15.003156 -64.748444 14.999483 -64.763008 14.996403 -64.774391 14.995470 -64.782784 14.993594 -64.797394 14.991467 -64.811981 14.989093 -64.826515 14.986471 -64.841011 14.983606 -64.855454 14.980494 -64.869835 14.977135 -64.884170 14.973535 -64.898438 14.969997 -64.911514 14.968988 -64.920578 14.967151 -64.934898 14.965069 -64.949181 14.964990 -64.949661 14.965075 -64.959640 14.964953 -64.974083 14.964582 -64.988510 14.963969 -65.002937 14.963109 -65.017349 14.962003 -65.031738 14.960653 -65.046120 14.959059 -65.060463 14.957219 -65.074768 14.955136 -65.089050 14.952812 -65.103294 14.950244 -65.117485 14.947437 -65.131630 14.944387 -65.145721 14.941100 -65.159760 14.937571 -65.173736 14.933809 -65.187637 14.933459 -65.188850 14.932416 -65.198227 14.930616 -65.212242 14.928577 -65.226227 14.928124 -65.229004 14.928213 -65.239395 14.928092 -65.253532 14.927732 -65.267654 14.927131 -65.281777 14.926288 -65.295891 14.925206 -65.309982 14.923884 -65.324051 14.922322 -65.338097 14.920523 -65.352104 14.918484 -65.366089 14.916207 -65.380028 14.913692 -65.393921 14.910945 -65.407768 14.907958 -65.421570 14.904739 -65.435310 14.901287 -65.448990 14.897600 -65.462601 14.896604 -65.466049 14.895515 -65.475838 14.893753 -65.489548 14.891759 -65.503227 14.890933 -65.508285 14.891025 -65.519089 14.890907 -65.532921 14.890552 -65.546753 14.889964 -65.560570 14.889139 -65.574371 14.888081 -65.588165 14.886787 -65.601929 14.885259 -65.615677 14.883498 -65.629387 14.881502 -65.643066 14.879275 -65.656700 14.876815 -65.670303 14.874124 -65.683853 14.871202 -65.697357 14.868051 -65.710808 14.864672 -65.724190 14.861066 -65.737518 14.859424 -65.743195 14.858290 -65.753387 14.856566 -65.766807 14.854614 -65.780190 14.853885 -65.784653 14.853931 -65.786469 14.854048 -65.800003 14.853931 -65.813530 14.853587 -65.827057 14.853011 -65.840569 14.852205 -65.854073 14.851169 -65.867561 14.849904 -65.881027 14.848410 -65.894470 14.846684 -65.907883 14.844735 -65.921265 14.842554 -65.934601 14.840148 -65.947899 14.837517 -65.961159 14.834659 -65.974365 14.831576 -65.987518 14.828271 -66.000610 14.824743 -66.013641 14.820993 -66.026611 14.817023 -66.039505 14.812835 -66.052330 14.808427 -66.065071 14.803803 -66.077744 14.798965 -66.090317 14.793915 -66.102806 14.788652 -66.115204 14.783176 -66.127510 14.777493 -66.139709 14.771604 -66.151795 14.765510 -66.163780 14.759212 -66.175659 14.752711 -66.187416 14.746015 -66.199058 14.739118 -66.210579 14.732028 -66.221970 14.724744 -66.233223 14.717270 -66.244362 14.709606 -66.255348 14.701758 -66.266205 14.693725 -66.276909 14.685512 -66.287468 14.677118 -66.297890 14.668550 -66.308144 14.659807 -66.318245 14.650896 -66.328194 14.641815 -66.337982 14.632568 -66.347595 14.623001 -66.356880 14.612969 -66.365639 14.602490 -66.373856 14.591589 -66.381508 14.580292 -66.388596 14.568618 -66.395088 14.556593 -66.400978 14.544244 -66.406265 14.531598 -66.410912 14.518679 -66.414932 14.505513 -66.418297 14.492131 -66.421013 14.478559 -66.423081 14.464825 -66.424492 14.450957 -66.425240 14.436984 -66.425316 14.422934 -66.424736 14.408835 -66.423500 14.394716 -66.421608 14.380603 -66.419067 14.366525 -66.415878 14.352508 -66.412064 14.338582 -66.407616 14.324770 -66.402550 14.311100 -66.396889 14.297596 -66.390633 14.284283 -66.383812 14.271183 -66.376427 14.258322 -66.368507 14.245723 -66.360062 14.233402 -66.351112 14.221384 -66.341690 14.209686 -66.331802 14.198326 -66.321480 14.187323 -66.310738 14.176688 -66.299614 14.166441 -66.288124 14.156592 -66.276298 14.147158 -66.264153 14.138144 -66.251732 14.129562 -66.239044 14.121418 -66.226135 14.113722 -66.213020 14.106478 -66.199730 14.099690 -66.186302 14.093361 -66.172752 14.087492 -66.159111 14.082082 -66.145416 14.077131 -66.131691 14.072635 -66.117966 14.068590 -66.104263 14.064991 -66.090614 14.061831 -66.077057 14.059101 -66.063591 14.056790 -66.050270 14.054892 -66.037102 14.053390 -66.024124 14.052273 -66.011353 14.051526 -65.998810 14.051135 -65.986526 14.051083 -65.974518 14.051354 -65.962814 14.051925 -65.951408 14.052781 -65.940353 14.053901 -65.929642 14.055263 -65.919304 14.056848 -65.909347 14.058632 -65.899780 14.060594 -65.890633 14.062707 -65.881897 14.063057 -65.880600 14.062154 -65.870277 14.061408 -65.857735 14.061017 -65.845451 14.060964 -65.833443 14.061189 -65.823715 14.056253 -65.825874 14.049890 -65.828453 14.043083 -65.830994 14.035838 -65.833481 14.028158 -65.835884 14.020051 -65.838181 14.011525 -65.840340 14.002588 -65.842346 13.993254 -65.844162 13.983531 -65.845779 13.973435 -65.847168 13.962979 -65.848312 13.952180 -65.849175 13.941055 -65.849754 13.929622 -65.850021 13.917899 -65.849953 13.905907 -65.849541 13.893666 -65.848763 13.881199 -65.847603 13.868530 -65.846046 13.855681 -65.844086 13.842674 -65.841713 13.829541 -65.838898 13.816301 -65.835648 13.802984 -65.831947 13.789615 -65.827782 13.776221 -65.823158 13.762832 -65.818077 13.749473 -65.812523 13.736171 -65.806496 13.722958 -65.800003 13.709858 -65.793030 13.696901 -65.785599 13.684115 -65.777710 13.671527 -65.769363 13.659164 -65.760559 13.647055 -65.751320 13.635224 -65.741653 13.623699 -65.731560 13.612507 -65.721062 13.601670 -65.710167 13.591214 -65.698898 13.581161 -65.687271 13.571538 -65.675293 13.562363 -65.662987 13.553658 -65.650375 13.545443 -65.637482 13.537738 -65.624329 13.530559 -65.610924 13.523927 -65.597305 13.517852 -65.583488 13.512353 -65.569519 13.507440 -65.555389 13.503127 -65.541153 13.499423 -65.526817 13.496338 -65.512428 13.493880 -65.498001 13.492055 -65.483566 13.490868 -65.469162 13.490321 -65.454796 13.490419 -65.440521 13.491162 -65.426346 13.492546 -65.412315 13.494573 -65.398445 13.497236 -65.384773 13.500534 -65.371323 13.504148 -65.359161 13.503762 -65.356903 13.501937 -65.342476 13.500750 -65.328064 13.500203 -65.313698 13.500301 -65.299423 13.501043 -65.285248 13.502429 -65.271217 13.504455 -65.257347 13.507119 -65.243675 13.507202 -65.243340 13.506295 -65.239830 13.503141 -65.225120 13.500629 -65.210373 13.498761 -65.195618 13.497547 -65.180885 13.496988 -65.166206 13.497088 -65.151611 13.497847 -65.137123 13.499263 -65.122772 13.501333 -65.108605 13.504057 -65.094620 13.507424 -65.080872 13.510772 -65.069611 13.509020 -65.055763 13.507805 -65.041031 13.507245 -65.026352 13.507345 -65.011749 13.508104 -64.997261 13.509520 -64.982918 13.511590 -64.968742 13.513991 -64.956421 13.513380 -64.954056 13.510157 -64.939018 13.507589 -64.923950 13.505682 -64.908882 13.504441 -64.893822 13.503869 -64.878830 13.503970 -64.863915 13.504745 -64.849106 13.506190 -64.834450 13.508306 -64.819969 13.511087 -64.805687 13.514529 -64.791641 13.517412 -64.781929 13.515777 -64.768997 13.514535 -64.753944 13.513964 -64.738945 13.514065 -64.724030 13.514839 -64.709228 13.516285 -64.694565 13.518400 -64.680084 13.520465 -64.669479 13.520139 -64.668221 13.516847 -64.652870 13.514222 -64.637482 13.512274 -64.622086 13.511007 -64.606712 13.510423 -64.591400 13.510525 -64.576157 13.511315 -64.561043 13.512792 -64.546074 13.514952 -64.531280 13.517792 -64.516693 13.521305 -64.502350 13.523726 -64.494194 13.522206 -64.482193 13.520938 -64.466812 13.520354 -64.451492 13.520457 -64.436264 13.521247 -64.421150 13.522723 -64.406174 13.524882 -64.391380 13.526610 -64.382507 13.526571 -64.382355 13.523211 -64.366676 13.520532 -64.350967 13.518542 -64.335251 13.517248 -64.319557 13.516650 -64.303925 13.516756 -64.288368 13.517562 -64.272942 13.519068 -64.257652 13.521273 -64.242554 13.522719 -64.235123 13.519559 -64.220375 13.516825 -64.204346 13.514794 -64.188309 13.513473 -64.172295 13.512863 -64.156342 13.512969 -64.140472 13.513791 -64.124725 13.515328 -64.109131 13.517577 -64.093727 13.520534 -64.078529 13.524193 -64.063583 13.525746 -64.058350 13.524482 -64.048363 13.523161 -64.032356 13.522551 -64.016396 13.522657 -64.000526 13.523479 -63.984783 13.525016 -63.969181 13.527265 -63.953773 13.530221 -63.938576 13.533880 -63.923630 13.538236 -63.908959 13.543278 -63.894596 13.548996 -63.880573 13.554927 -63.867886 13.555426 -63.854408 13.556562 -63.840404 13.558312 -63.826542 13.560674 -63.812840 13.563644 -63.799320 13.567215 -63.786022 13.571384 -63.772972 13.576141 -63.760185 13.581480 -63.747692 13.584281 -63.741920 13.584331 -63.733452 13.584906 -63.721077 13.585985 -63.708782 13.587567 -63.696575 13.589653 -63.684498 13.592237 -63.672554 13.595320 -63.660778 13.598895 -63.649181 13.602961 -63.637795 13.607507 -63.626629 13.610418 -63.620296 13.610361 -63.615322 13.610614 -63.604710 13.611245 -63.594116 13.612258 -63.583557 13.613651 -63.573059 13.615428 -63.562634 13.617588 -63.552296 13.620128 -63.542057 13.623048 -63.531933 13.626346 -63.521946 13.630015 -63.512104 13.634058 -63.502434 13.634472 -63.501541 13.634426 -63.496136 13.634611 -63.487286 13.635057 -63.478424 13.635770 -63.469582 13.636748 -63.460743 13.637997 -63.451931 13.639515 -63.443153 13.641303 -63.434418 13.643364 -63.425743 13.645697 -63.417133 13.648301 -63.408592 13.648357 -63.408428 13.648329 -63.406406 13.648377 -63.399250 13.648571 -63.392078 13.648914 -63.384899 13.649269 -63.379738 13.647851 -63.376541 13.645278 -63.370502 13.642785 -63.364403 13.640376 -63.358242 13.638054 -63.352013 13.635821 -63.345722 13.633679 -63.339371 13.631635 -63.332958 13.629687 -63.326473 13.627845 -63.319946 13.626104 -63.313354 13.624474 -63.306702 13.622955 -63.299999 13.621550 -63.293247 13.620263 -63.286442 13.619099 -63.279591 13.618055 -63.272694 13.617140 -63.265755 13.616353 -63.258774 13.615702 -63.251759 13.615183 -63.244705 13.614802 -63.237629 13.614562 -63.230518 13.614465 -63.223385 13.614468 -63.222954 13.613085 -63.219711 13.610592 -63.213612 13.608183 -63.207451 13.605861 -63.201222 13.603627 -63.194931 13.601486 -63.188580 13.599441 -63.182167 13.597493 -63.175690 13.595651 -63.169155 13.593911 -63.162563 13.592280 -63.155918 13.590761 -63.149216 13.589356 -63.142464 13.588069 -63.135658 13.586904 -63.128807 13.585861 -63.121918 13.584946 -63.114979 13.584160 -63.107998 13.583508 -63.100983 13.582988 -63.093933 13.582608 -63.086849 13.582368 -63.079742 13.582316 -63.075893 13.582277 -63.075806 13.579705 -63.069767 13.577214 -63.063675 13.574804 -63.057514 13.572481 -63.051285 13.570248 -63.044994 13.568107 -63.038643 13.566062 -63.032230 13.564115 -63.025757 13.562271 -63.019226 13.560532 -63.012634 13.558902 -63.005989 13.557382 -62.999287 13.555978 -62.992535 13.554690 -62.985737 13.553525 -62.978886 13.552482 -62.971989 13.551567 -62.965050 13.550781 -62.958077 13.550129 -62.951061 13.549610 -62.944012 13.549229 -62.936928 13.548990 -62.929825 13.548941 -62.926205 13.548807 -62.925903 13.546235 -62.919872 13.543742 -62.913773 13.541334 -62.907612 13.539012 -62.901390 13.536777 -62.895100 13.534636 -62.888748 13.532591 -62.882343 13.530644 -62.875866 13.528801 -62.869331 13.527061 -62.862747 13.525431 -62.856098 13.523912 -62.849400 13.522508 -62.842651 13.521220 -62.835850 13.520055 -62.828998 13.519012 -62.822105 13.518096 -62.815166 13.517311 -62.808193 13.516659 -62.801178 13.516140 -62.794128 13.515759 -62.787048 13.515519 -62.779941 13.515473 -62.776573 13.515244 -62.776058 13.512673 -62.770027 13.510181 -62.763927 13.507771 -62.757767 13.505448 -62.751545 13.503215 -62.745254 13.501074 -62.738907 13.499029 -62.732494 13.497083 -62.726021 13.495239 -62.719490 13.493499 -62.712898 13.491868 -62.706261 13.490350 -62.699558 13.488944 -62.692810 13.487658 -62.686008 13.486492 -62.679157 13.485450 -62.672264 13.484534 -62.665333 13.483747 -62.658352 13.483096 -62.651344 13.482577 -62.644295 13.482196 -62.637218 13.481955 -62.630108 13.481913 -62.626968 13.481590 -62.626244 13.479019 -62.620213 13.476526 -62.614120 13.474116 -62.607960 13.471794 -62.601738 13.469561 -62.595447 13.467421 -62.589100 13.465375 -62.582687 13.463428 -62.576218 13.461584 -62.569691 13.459845 -62.563099 13.458214 -62.556461 13.456695 -62.549759 13.455291 -62.543011 13.454003 -62.536209 13.452838 -62.529366 13.451796 -62.522472 13.450880 -62.515534 13.450094 -62.508560 13.449442 -62.501553 13.448923 -62.494503 13.448543 -62.487427 13.448302 -62.480324 13.448262 -62.477413 13.447846 -62.476471 13.445273 -62.470448 13.442780 -62.464348 13.440372 -62.458195 13.438049 -62.451973 13.435816 -62.445683 13.433674 -62.439335 13.431629 -62.432922 13.429683 -62.426453 13.427838 -62.419926 13.427378 -62.418182 13.426485 -62.416828 13.423047 -62.411484 13.419655 -62.406067 13.416311 -62.400589 13.413018 -62.395035 13.409778 -62.389408 13.406594 -62.383717 13.403470 -62.377945 13.400410 -62.372105 13.397413 -62.366192 13.394486 -62.360207 13.391633 -62.354141 13.388855 -62.348007 13.386157 -62.341793 13.383543 -62.335510 13.381015 -62.329159 13.378578 -62.322723 13.376236 -62.316227 13.373991 -62.309658 13.371851 -62.303013 13.369814 -62.296303 13.369254 -62.294334 13.366651 -62.290459 13.363074 -62.285000 13.359540 -62.279468 13.356053 -62.273853 13.352615 -62.268169 13.349231 -62.262398 13.345903 -62.256554 13.342635 -62.250626 13.339432 -62.244606 13.336297 -62.238514 13.333233 -62.232338 13.330245 -62.226078 13.327340 -62.219730 13.324517 -62.213303 13.321785 -62.206795 13.319145 -62.200203 13.316604 -62.193531 13.314164 -62.186775 13.311832 -62.179947 13.309608 -62.173038 13.307541 -62.166183 13.306007 -62.163940 13.302273 -62.158340 13.298581 -62.152664 13.294935 -62.146893 13.291341 -62.141041 13.287801 -62.135090 13.284321 -62.129055 13.280904 -62.122929 13.277556 -62.116703 13.274279 -62.110394 13.271081 -62.103989 13.267964 -62.097492 13.264935 -62.090900 13.261998 -62.084221 13.259159 -62.077446 13.256423 -62.070579 13.253793 -62.063633 13.251276 -62.056591 13.248876 -62.049469 13.246597 -62.042263 13.245562 -62.038757 13.244491 -62.037216 13.240584 -62.031445 13.236724 -62.025577 13.232913 -62.019619 13.229156 -62.013554 13.225456 -62.007393 13.221822 -62.001129 13.218257 -61.994766 13.214767 -61.988304 13.211356 -61.981731 13.208031 -61.975059 13.204797 -61.968292 13.201660 -61.961414 13.198628 -61.954441 13.195700 -61.947372 13.192886 -61.940197 13.190193 -61.932930 13.187623 -61.925568 13.185185 -61.918125 13.183295 -61.911934 13.182056 -61.910168 13.177971 -61.904190 13.173936 -61.898106 13.169956 -61.891910 13.166037 -61.885605 13.162182 -61.879192 13.158400 -61.872662 13.154696 -61.866024 13.151075 -61.859276 13.147544 -61.852409 13.144109 -61.845428 13.140778 -61.838348 13.137554 -61.831154 13.134444 -61.823853 13.131457 -61.816444 13.128597 -61.808930 13.125870 -61.801315 13.123283 -61.793602 13.120842 -61.785797 13.118554 -61.777893 13.116672 -61.770836 13.115624 -61.769150 13.111769 -61.762737 13.107986 -61.756206 13.104282 -61.749577 13.100661 -61.742821 13.097130 -61.735962 13.093697 -61.728989 13.090365 -61.721901 13.087140 -61.714706 13.084032 -61.707405 13.081044 -61.700001 13.078183 -61.692490 13.075458 -61.684879 13.072871 -61.677170 13.070429 -61.669361 13.068140 -61.661457 13.066009 -61.653473 13.064041 -61.645401 13.062243 -61.637245 13.060617 -61.629017 13.059174 -61.620716 13.057915 -61.612350 13.056844 -61.603920 13.055969 -61.595444 13.055294 -61.586914 13.054821 -61.578335 13.054557 -61.569729 13.054503 -61.561081 13.054662 -61.552635 13.052551 -61.545692 13.050392 -61.538002 13.048390 -61.530224 13.046555 -61.522369 13.044887 -61.514431 13.043394 -61.506428 13.042082 -61.498352 13.040955 -61.490227 13.040016 -61.482029 13.039272 -61.473793 13.038728 -61.465508 13.038385 -61.457188 13.038249 -61.448830 13.038323 -61.440453 13.038386 -61.438587 13.038143 -61.437878 13.035809 -61.430573 13.033622 -61.423180 13.031587 -61.415703 13.029713 -61.408142 13.028002 -61.400505 13.026461 -61.392792 13.025096 -61.385014 13.023910 -61.377174 13.022909 -61.369270 13.022098 -61.361321 13.021479 -61.353329 13.021059 -61.345295 13.020840 -61.337223 13.020826 -61.329128 13.021010 -61.321419 13.019013 -61.315491 13.016798 -61.308392 13.014731 -61.301209 13.012818 -61.293945 13.011064 -61.286606 13.009476 -61.279186 13.008058 -61.271702 13.006814 -61.264152 13.005749 -61.256546 13.004869 -61.248890 13.004179 -61.241184 13.003680 -61.233433 13.003378 -61.225651 13.003278 -61.217846 13.003379 -61.210018 13.003597 -61.204468 13.002164 -61.200428 12.999921 -61.193630 12.997821 -61.186748 12.995870 -61.179775 12.994072 -61.172733 12.992436 -61.165607 12.990964 -61.158417 12.989662 -61.151161 12.988535 -61.143848 12.987588 -61.136478 12.986823 -61.129059 12.986247 -61.121601 12.985862 -61.114109 12.985674 -61.106586 12.985681 -61.099041 12.985893 -61.091473 12.986103 -61.087650 12.985261 -61.085400 12.982989 -61.078907 12.980857 -61.072315 12.978868 -61.065640 12.977028 -61.058891 12.975343 -61.052063 12.973818 -61.045162 12.972458 -61.038204 12.971269 -61.031181 12.970253 -61.024101 12.969415 -61.016975 12.968762 -61.009804 12.968607 -61.007431 12.967806 -61.005917 12.964830 -61.000004 12.961957 -60.993984 12.959193 -60.987865 12.956543 -60.981651 12.954012 -60.975330 12.951610 -60.968925 12.949338 -60.962422 12.947205 -60.955837 12.945215 -60.949165 12.943376 -60.942417 12.941691 -60.935589 12.940167 -60.928696 12.938807 -60.921730 12.937615 -60.914707 12.936601 -60.907631 12.935762 -60.900509 12.935109 -60.893337 12.934642 -60.886131 12.934366 -60.878891 12.934281 -60.871628 12.934395 -60.864349 12.934709 -60.857060 12.934938 -60.853813 12.932634 -60.849232 12.929762 -60.843216 12.926997 -60.837101 12.924347 -60.830879 12.921816 -60.824570 12.919412 -60.818161 12.917141 -60.811661 12.915008 -60.805077 12.913020 -60.798405 12.911180 -60.791656 12.909494 -60.784832 12.907970 -60.777931 12.906609 -60.770973 12.905419 -60.763950 12.904405 -60.756874 12.903567 -60.749752 12.902913 -60.742580 12.902445 -60.735374 12.902169 -60.728142 12.902084 -60.720875 12.902198 -60.713600 12.902512 -60.706310 12.902547 -60.705822 12.902225 -60.705212 12.899249 -60.699303 12.896377 -60.693287 12.893612 -60.687172 12.890962 -60.680958 12.888432 -60.674641 12.886028 -60.668232 12.883756 -60.661739 12.881624 -60.655155 12.879635 -60.648480 12.877794 -60.641731 12.876110 -60.634911 12.874585 -60.628010 12.873224 -60.621052 12.872034 -60.614037 12.871019 -60.606960 12.870182 -60.599835 12.869528 -60.592663 12.869061 -60.585457 12.868783 -60.578224 12.868701 -60.570965 12.868814 -60.563683 12.869127 -60.556396 12.869149 -60.556080 12.868750 -60.555325 12.865774 -60.549416 12.862901 -60.543396 12.860136 -60.537285 12.857486 -60.531071 12.854956 -60.524757 12.852552 -60.518352 12.850281 -60.511856 12.848148 -60.505264 12.846160 -60.498600 12.844320 -60.491852 12.842635 -60.485027 12.841110 -60.478134 12.839750 -60.471176 12.838559 -60.464153 12.837542 -60.457077 12.836706 -60.449963 12.836052 -60.442791 12.835586 -60.435585 12.835309 -60.428348 12.835225 -60.421089 12.835340 -60.413815 12.835651 -60.406529 12.835662 -60.406372 12.835189 -60.405476 12.832213 -60.399567 12.829341 -60.393559 12.826576 -60.387436 12.823926 -60.381222 12.821396 -60.374912 12.818992 -60.368504 12.816720 -60.362007 12.814588 -60.355423 12.812598 -60.348759 12.810759 -60.342010 12.809073 -60.335186 12.807549 -60.328293 12.806188 -60.321335 12.804998 -60.314320 12.803983 -60.307243 12.803146 -60.300121 12.802491 -60.292953 12.802024 -60.285755 12.801747 -60.278522 12.801664 -60.271263 12.801778 -60.263989 12.802091 -60.256714 12.801538 -60.255669 12.798562 -60.249760 12.795690 -60.243751 12.792925 -60.237636 12.790275 -60.231422 12.787744 -60.225113 12.785340 -60.218704 12.783070 -60.212208 12.780937 -60.205624 12.778948 -60.198959 12.777107 -60.192211 12.775422 -60.185394 12.773897 -60.178501 12.772537 -60.171543 12.771347 -60.164528 12.770332 -60.157452 12.769495 -60.150326 12.768841 -60.143162 12.768373 -60.135963 12.768097 -60.128731 12.768013 -60.121471 12.768126 -60.114197 12.768432 -60.107094 12.767801 -60.105904 12.764826 -60.099995 12.761953 -60.093987 12.759189 -60.087872 12.756538 -60.081657 12.754008 -60.075344 12.751605 -60.068947 12.749332 -60.062450 12.747200 -60.055866 12.745212 -60.049198 12.743372 -60.042450 12.741686 -60.035633 12.740162 -60.028744 12.738801 -60.021782 12.737611 -60.014767 12.736596 -60.007698 12.735759 -60.000576 12.735104 -59.993412 12.734637 -59.986210 12.734361 -59.978977 12.734277 -59.971725 12.734391 -59.964451 12.734704 -59.957161 12.735219 -59.949875 12.735938 -59.942593 12.736864 -59.935318 12.737996 -59.928059 12.739339 -59.920826 12.740890 -59.913628 12.742651 -59.906468 12.743919 -59.901894 12.743308 -59.897884 12.742518 -59.891621 12.741891 -59.885315 12.741429 -59.878979 12.741138 -59.872612 12.741016 -59.866219 12.741070 -59.859814 12.741302 -59.853397 12.741712 -59.846977 12.742304 -59.840557 12.743079 -59.834145 12.744039 -59.827751 12.745183 -59.821377 12.746515 -59.815033 12.748033 -59.808723 12.749738 -59.802452 12.750016 -59.801537 12.749647 -59.799835 12.748631 -59.794514 12.747752 -59.789146 12.747009 -59.783737 12.746409 -59.778294 12.745953 -59.772816 12.745645 -59.767319 12.745484 -59.761791 12.745480 -59.756252 12.745628 -59.750706 12.745934 -59.745155 12.746398 -59.739601 12.747024 -59.734047 12.747809 -59.728516 12.748758 -59.723003 12.749869 -59.717506 12.751144 -59.712048 12.752583 -59.706619 12.752708 -59.706200 12.752657 -59.706009 12.751596 -59.701664 12.750635 -59.697281 12.749774 -59.692856 12.749016 -59.688389 12.748366 -59.683887 12.747825 -59.679352 12.747396 -59.674789 12.747083 -59.670204 12.746886 -59.665596 12.746809 -59.660973 12.746852 -59.656342 12.747018 -59.651688 12.747310 -59.647045 12.747726 -59.642395 12.748271 -59.637741 12.748943 -59.633106 12.749746 -59.628479 12.750678 -59.623871 12.751741 -59.619286 12.752933 -59.614723 12.754255 -59.610195 12.755710 -59.605709 12.757294 -59.601254 12.758213 -59.598892 12.757273 -59.595806 12.756297 -59.592319 12.755399 -59.588802 12.754582 -59.585247 12.753846 -59.581654 12.753195 -59.578033 12.752632 -59.574379 12.752159 -59.570698 12.751779 -59.566990 12.751491 -59.563267 12.751300 -59.559525 12.751206 -59.555759 12.751211 -59.551991 12.751318 -59.548210 12.751526 -59.544434 12.751839 -59.540649 12.752255 -59.536865 12.752778 -59.533096 12.753406 -59.529327 12.754141 -59.525578 12.754983 -59.521847 12.755933 -59.518131 12.756988 -59.514450 12.758152 -59.510788 12.759423 -59.507168 12.760800 -59.503578 12.761329 -59.502312 12.760828 -59.501507 12.759345 -59.499001 12.757904 -59.496441 12.756511 -59.493832 12.755166 -59.491173 12.753874 -59.488461 12.752639 -59.485710 12.751460 -59.482903 12.750345 -59.480053 12.749294 -59.477165 12.748309 -59.474236 12.747396 -59.471264 12.746552 -59.468258 12.745786 -59.465218 12.745096 -59.462143 12.744488 -59.459045 12.743960 -59.455917 12.743516 -59.452766 12.743160 -59.449593 12.742890 -59.446400 12.742710 -59.443199 12.742622 -59.439980 12.742625 -59.436756 12.742724 -59.433533 12.742917 -59.430302 12.743207 -59.427071 12.743593 -59.423855 12.744076 -59.420639 12.744657 -59.417442 12.745336 -59.414257 12.746114 -59.411095 12.746990 -59.407959 12.747966 -59.404846 12.749038 -59.401768 12.750207 -59.398728 12.751473 -59.395721 12.752834 -59.392757 12.754291 -59.389839 12.755840 -59.386971 12.756213 -59.386330 12.755386 -59.384792 12.754432 -59.382935 12.753506 -59.381043 12.752612 -59.379124 12.751752 -59.377171 12.750926 -59.375191 12.750138 -59.373177 12.749388 -59.371132 12.748678 -59.369064 12.748011 -59.366966 12.747388 -59.364841 12.746811 -59.362698 12.746280 -59.360527 12.745799 -59.358334 12.745370 -59.356121 12.744990 -59.353886 12.744665 -59.351631 12.744395 -59.349373 12.744181 -59.347092 12.744025 -59.344795 12.743927 -59.342495 12.743889 -59.340179 12.743911 -59.337864 12.743994 -59.335541 12.744140 -59.333210 12.744348 -59.330891 12.744621 -59.328567 12.744958 -59.326244 12.745360 -59.323936 12.745827 -59.321629 12.746358 -59.319340 12.746955 -59.317059 12.747617 -59.314789 12.747775 -59.314301 12.747627 -59.313465 12.746338 -59.304798 12.745305 -59.296269 12.744521 -59.287880 12.744226 -59.283447 12.740342 -59.275818 12.736117 -59.266834 12.732199 -59.257801 12.728587 -59.248722 12.725280 -59.239624 12.722278 -59.230526 12.719577 -59.221443 12.717173 -59.212399 12.715061 -59.203403 12.713236 -59.194485 12.711693 -59.185646 12.710423 -59.176922 12.710252 -59.175457 12.709245 -59.173752 12.704408 -59.164951 12.699876 -59.156052 12.695651 -59.147068 12.691732 -59.138031 12.690451 -59.134811 12.689924 -59.134338 12.682583 -59.127228 12.675487 -59.119862 12.668648 -59.112255 12.662074 -59.104427 12.655776 -59.096390 12.649760 -59.088158 12.644031 -59.079765 12.638597 -59.071213 12.633458 -59.062523 12.628623 -59.053719 12.624090 -59.044826 12.619865 -59.035851 12.618017 -59.031589 12.617219 -59.030922 12.609639 -59.024090 12.602296 -59.016987 12.595200 -59.009624 12.588362 -59.002022 12.581787 -58.994186 12.575490 -58.986156 12.569473 -58.977932 12.563745 -58.969532 12.558310 -58.960987 12.553171 -58.952297 12.548335 -58.943500 12.543803 -58.934608 12.539578 -58.925632 12.537777 -58.921482 12.536885 -58.920734 12.529306 -58.913906 12.521962 -58.906811 12.514867 -58.899445 12.508027 -58.891846 12.501454 -58.884018 12.495155 -58.875984 12.489140 -58.867760 12.483411 -58.859367 12.477975 -58.850822 12.472837 -58.842140 12.468000 -58.833343 12.463469 -58.824451 12.459244 -58.815483 12.457489 -58.811440 12.456508 -58.810619 12.448927 -58.803795 12.441585 -58.796692 12.434488 -58.789337 12.427649 -58.781734 12.421076 -58.773914 12.414778 -58.765881 12.408761 -58.757664 12.403032 -58.749271 12.397596 -58.740726 12.392459 -58.732052 12.387622 -58.723255 12.383090 -58.714371 12.378865 -58.705402 12.377157 -58.701469 12.376087 -58.700573 12.368504 -58.693749 12.361162 -58.686653 12.354066 -58.679295 12.347227 -58.671700 12.340653 -58.663879 12.334355 -58.655850 12.328338 -58.647633 12.322610 -58.639244 12.317173 -58.630707 12.312035 -58.622025 12.307199 -58.613235 12.302667 -58.604347 12.298441 -58.595386 12.296785 -58.591576 12.295619 -58.590599 12.288037 -58.583775 12.280694 -58.576679 12.273597 -58.569325 12.266759 -58.561733 12.260185 -58.553913 12.253887 -58.545887 12.247869 -58.537670 12.242141 -58.529286 12.236705 -58.520748 12.231566 -58.512073 12.226730 -58.503288 12.222198 -58.494404 12.217971 -58.485443 12.216359 -58.481731 12.215107 -58.480686 12.207526 -58.473869 12.200183 -58.466774 12.193087 -58.459427 12.186247 -58.451832 12.179673 -58.444015 12.173375 -58.435989 12.167357 -58.427780 12.161629 -58.419392 12.156192 -58.410862 12.151054 -58.402187 12.146217 -58.393406 12.141684 -58.384525 12.137459 -58.375565 12.135897 -58.371971 12.134551 -58.370846 12.126970 -58.364021 12.119627 -58.356930 12.112531 -58.349583 12.105690 -58.341995 12.099115 -58.334179 12.092818 -58.326160 12.086801 -58.317951 12.081072 -58.309570 12.075635 -58.301033 12.070498 -58.292366 12.065660 -58.283581 12.061128 -58.274708 12.056902 -58.265747 12.055386 -58.262260 12.053952 -58.261063 12.046372 -58.254246 12.039027 -58.247158 12.031931 -58.239815 12.025091 -58.232227 12.018517 -58.224411 12.012219 -58.216393 12.006201 -58.208191 12.000472 -58.199810 11.995035 -58.191280 11.989897 -58.182609 11.985061 -58.173836 11.980528 -58.164955 11.976301 -58.156006 11.974828 -58.152618 11.973309 -58.151348 11.965727 -58.144531 11.958384 -58.137451 11.951287 -58.130100 11.944447 -58.122520 11.937873 -58.114712 11.931576 -58.106693 11.925557 -58.098492 11.919828 -58.090111 11.914392 -58.081585 11.909253 -58.072926 11.904415 -58.064140 11.899883 -58.055267 11.895658 -58.046322 11.891738 -58.037311 11.888125 -58.028263 11.884819 -58.019199 11.881815 -58.010128 11.879113 -58.001072 11.876708 -57.992054 11.874597 -57.983093 11.872771 -57.974201 11.871227 -57.965389 11.869956 -57.956696 11.868951 -57.948116 11.868203 -57.939674 11.867703 -57.931389 11.867439 -57.923267 11.867402 -57.915333 11.867579 -57.907593 11.867958 -57.900066 11.868527 -57.892754 11.869272 -57.885677 11.870179 -57.878838 11.871234 -57.872261 11.872422 -57.865944 11.873729 -57.859890 11.875137 -57.854118 11.876633 -57.848637 11.878199 -57.843430 11.879819 -57.838528 11.881477 -57.833923 11.883157 -57.829613 11.884843 -57.825611 11.886516 -57.821911 11.888161 -57.818508 11.889763 -57.815407 11.891303 -57.812607 11.892767 -57.810108 11.894138 -57.807892 11.895402 -57.805973 11.896543 -57.804337 11.897544 -57.802967 11.898395 -57.801876 11.899079 -57.801037 11.899582 -57.800457 11.899893 -57.800106 11.900000 -57.799999 11.899893 -57.799889 11.899583 -57.799541 11.899077 -57.798958 11.898396 -57.798119 11.897544 -57.797028 11.896542 -57.795662 11.895402 -57.794022 11.894138 -57.792103 11.892767 -57.789890 11.891303 -57.787388 11.889763 -57.784588 11.888161 -57.781487 11.886516 -57.778088 11.884843 -57.774384 11.883157 -57.770382 11.881477 -57.766071 11.879819 -57.761467 11.878199 -57.756565 11.876633 -57.751362 11.875136 -57.745876 11.873729 -57.740105 11.872422 -57.734051 11.871234 -57.727734 11.870178 -57.721157 11.869272 -57.714321 11.868527 -57.707245 11.867958 -57.699928 11.867579 -57.692402 11.867402 -57.684662 11.867439 -57.676727 11.867703 -57.668606 11.868203 -57.660320 11.868952 -57.651878 11.869956 -57.643299 11.871227 -57.634605 11.872771 -57.625793 11.874597 -57.616901 11.876709 -57.607941 11.879113 -57.598923 11.881815 -57.589867 11.884818 -57.580795 11.888125 -57.571732 11.891738 -57.562683 11.895658 -57.553673 11.899883 -57.544727 11.904416 -57.535854 11.909253 -57.527069 11.914392 -57.518410 11.919827 -57.509884 11.925557 -57.501503 11.931576 -57.493301 11.937874 -57.485283 11.944447 -57.477478 11.951286 -57.469894 11.958384 -57.462547 11.965728 -57.455463 11.973309 -57.448647 11.981115 -57.442123 11.989135 -57.435902 11.997357 -57.430000 12.005764 -57.424435 12.014345 -57.419209 12.023084 -57.414337 12.031967 -57.409843 12.040976 -57.405724 12.050096 -57.401997 12.059308 -57.398662 12.068599 -57.395733 12.077947 -57.393219 12.087336 -57.391128 12.096749 -57.389462 12.106165 -57.388225 12.115567 -57.387421 12.124936 -57.387043 12.134253 -57.387112 12.143499 -57.387619 12.152656 -57.388554 12.161703 -57.389927 12.170626 -57.391735 12.179400 -57.393978 12.188012 -57.396633 12.196442 -57.399715 12.204673 -57.403210 12.212686 -57.407112 12.220465 -57.411407 12.227995 -57.416092 12.235256 -57.421154 12.242237 -57.426590 12.248920 -57.432377 12.255295 -57.438511 12.261454 -57.444870 12.267502 -57.451332 12.273439 -57.457901 12.279262 -57.464580 12.284968 -57.471355 12.290558 -57.478233 12.296027 -57.485214 12.301378 -57.492283 12.306606 -57.499455 12.311709 -57.506718 12.316688 -57.514065 12.321538 -57.521496 12.326260 -57.529022 12.330854 -57.536625 12.335314 -57.544308 12.339332 -57.551521 12.342093 -57.554371 12.348144 -57.560837 12.354080 -57.567410 12.359902 -57.574089 12.365610 -57.580864 12.371200 -57.587749 12.376670 -57.594730 12.382020 -57.601799 12.387246 -57.608971 12.392350 -57.616230 12.397328 -57.623589 12.402179 -57.631027 12.406901 -57.638546 12.411493 -57.646156 12.415956 -57.653847 12.420066 -57.661221 12.422691 -57.663933 12.428740 -57.670402 12.434678 -57.676979 12.440500 -57.683651 12.446207 -57.690433 12.451797 -57.697319 12.457267 -57.704300 12.462618 -57.711384 12.467845 -57.718555 12.472947 -57.725815 12.477926 -57.733170 12.482778 -57.740608 12.487500 -57.748135 12.492091 -57.755745 12.496552 -57.763435 12.500762 -57.771000 12.503246 -57.773563 12.509295 -57.780033 12.515232 -57.786610 12.521055 -57.793289 12.526762 -57.800079 12.532351 -57.806965 12.537822 -57.813946 12.543172 -57.821030 12.548400 -57.828201 12.553503 -57.835468 12.558481 -57.842823 12.563332 -57.850269 12.568054 -57.857796 12.572647 -57.865402 12.577107 -57.873100 12.581426 -57.880848 12.583757 -57.883259 12.589805 -57.889725 12.595741 -57.896305 12.601564 -57.902988 12.607271 -57.909779 12.612862 -57.916664 12.618331 -57.923653 12.623682 -57.930733 12.628909 -57.937904 12.634012 -57.945175 12.638990 -57.952537 12.643842 -57.959980 12.648563 -57.967506 12.653156 -57.975124 12.657618 -57.982822 12.661944 -57.990593 12.662022 -57.990738 12.664223 -57.993011 12.670272 -57.999489 12.676208 -58.006073 12.682030 -58.012756 12.687738 -58.019539 12.693328 -58.026432 12.698798 -58.033421 12.704147 -58.040501 12.709375 -58.047680 12.714479 -58.054955 12.719457 -58.062317 12.724309 -58.069763 12.729031 -58.077297 12.733622 -58.084911 12.738084 -58.092609 12.742412 -58.100388 12.742588 -58.100719 12.744643 -58.102840 12.750691 -58.109318 12.756628 -58.115902 12.762451 -58.122589 12.768158 -58.129375 12.773749 -58.136269 12.779218 -58.143261 12.784568 -58.150345 12.789797 -58.157524 12.794899 -58.164799 12.799878 -58.172161 12.804729 -58.179611 12.809451 -58.187145 12.814044 -58.194771 12.818504 -58.202465 12.822832 -58.210247 12.823106 -58.210758 12.825018 -58.212738 12.831067 -58.219215 12.837004 -58.225800 12.842826 -58.232491 12.848535 -58.239281 12.854124 -58.246174 12.859593 -58.253166 12.864944 -58.260258 12.870172 -58.267437 12.875276 -58.274715 12.880253 -58.282078 12.885104 -58.289532 12.889827 -58.297073 12.894420 -58.304695 12.898881 -58.312393 12.903209 -58.320179 12.903571 -58.320858 12.905350 -58.322697 12.911400 -58.329182 12.917336 -58.335766 12.923159 -58.342457 12.928866 -58.349255 12.934457 -58.356148 12.939926 -58.363140 12.945276 -58.370232 12.950503 -58.377415 12.955607 -58.384697 12.960586 -58.392067 12.965437 -58.399517 12.970159 -58.407059 12.974751 -58.414680 12.979213 -58.422386 12.983541 -58.430172 12.983996 -58.431027 12.985633 -58.432720 12.991683 -58.439201 12.997620 -58.445793 13.003442 -58.452484 13.009149 -58.459282 13.014740 -58.466179 13.020209 -58.473175 13.025560 -58.480270 13.030788 -58.487457 13.035892 -58.494736 13.040870 -58.502106 13.045721 -58.509567 13.050444 -58.517105 13.055036 -58.524734 13.059497 -58.532440 13.063825 -58.540226 13.068020 -58.548088 13.071300 -58.554504 13.073403 -58.556839 13.079225 -58.563530 13.084933 -58.570328 13.090523 -58.577232 13.095993 -58.584225 13.101343 -58.591324 13.106571 -58.598515 13.111675 -58.605797 13.116652 -58.613167 13.121504 -58.620625 13.126227 -58.628170 13.130818 -58.635799 13.135281 -58.643513 13.139608 -58.651298 13.143803 -58.659161 13.147860 -58.667103 13.151784 -58.675110 13.155568 -58.683189 13.159214 -58.691330 13.162718 -58.699539 13.166082 -58.707813 13.169305 -58.716137 13.172382 -58.724526 13.175317 -58.732960 13.178106 -58.741451 13.180751 -58.749996 13.183248 -58.758575 13.185597 -58.767208 13.187799 -58.775875 13.189850 -58.784576 13.190256 -58.786446 13.191360 -58.787773 13.197278 -58.795170 13.203059 -58.802677 13.208705 -58.810291 13.214209 -58.818008 13.219571 -58.825832 13.224790 -58.833748 13.229863 -58.841759 13.234789 -58.849865 13.239567 -58.858070 13.244195 -58.866348 13.248671 -58.874722 13.249320 -58.875988 13.250868 -58.877796 13.257266 -58.885559 13.263513 -58.893456 13.269607 -58.901466 13.275545 -58.909603 13.281326 -58.917847 13.286946 -58.926208 13.292406 -58.934670 13.297703 -58.943241 13.302833 -58.951908 13.307795 -58.960671 13.312591 -58.969532 13.314132 -58.972515 13.316367 -58.975140 13.323112 -58.983391 13.329687 -58.991776 13.336092 -59.000301 13.342325 -59.008949 13.348382 -59.017723 13.354263 -59.026619 13.359963 -59.035625 13.365481 -59.044750 13.370816 -59.053986 13.375965 -59.063316 13.379129 -59.069336 13.381812 -59.072502 13.388902 -59.081238 13.395806 -59.090126 13.402522 -59.099148 13.404188 -59.101490 13.409687 -59.106033 13.418693 -59.114124 13.427361 -59.122589 13.435761 -59.131332 13.443965 -59.140266 13.451968 -59.149384 13.459766 -59.158688 13.467356 -59.168159 13.474730 -59.177811 13.481890 -59.187618 13.488828 -59.197586 13.495541 -59.207707 13.502028 -59.217964 13.508284 -59.228374 13.514309 -59.238907 13.520098 -59.249569 13.520833 -59.250996 13.525092 -59.256100 13.533027 -59.266056 13.540731 -59.276199 13.548201 -59.286514 13.555434 -59.297005 13.562426 -59.307651 13.569171 -59.318451 13.575669 -59.329407 13.581917 -59.340500 13.586205 -59.348530 13.590364 -59.353531 13.598644 -59.363983 13.606678 -59.374615 13.614460 -59.385441 13.621987 -59.396454 13.629255 -59.407627 13.636261 -59.418972 13.643001 -59.430466 13.649470 -59.442112 13.651652 -59.446262 13.655577 -59.450996 13.664203 -59.461933 13.672566 -59.473064 13.678120 -59.480846 13.681226 -59.483692 13.691770 -59.494057 13.702007 -59.504738 13.711987 -59.515667 13.721700 -59.526840 13.731140 -59.538254 13.740303 -59.549900 13.749183 -59.561764 13.757771 -59.573837 13.766069 -59.586121 13.774067 -59.598599 13.781761 -59.611263 13.789150 -59.624103 13.796228 -59.637115 13.802994 -59.650284 13.809443 -59.663593 13.815572 -59.677055 13.821381 -59.690643 13.826868 -59.704349 13.832030 -59.718166 13.836870 -59.732086 13.841384 -59.746098 13.845573 -59.760185 13.849436 -59.774353 13.852976 -59.788582 13.856193 -59.802856 13.859086 -59.817177 13.861661 -59.831543 13.863914 -59.845924 13.865854 -59.860325 13.867160 -59.871895 13.870603 -59.881798 13.875117 -59.895805 13.879307 -59.909904 13.883169 -59.924072 13.886708 -59.938297 13.889926 -59.952579 13.892820 -59.966904 13.895393 -59.981266 13.897648 -59.995651 13.899587 -60.010055 13.900938 -60.022026 13.904250 -60.031551 13.908765 -60.045567 13.912953 -60.059662 13.916817 -60.073830 13.920358 -60.088055 13.923573 -60.102344 13.926467 -60.116669 13.929040 -60.131031 13.931296 -60.145424 13.933235 -60.159828 13.934631 -60.172203 13.937808 -60.181343 13.942323 -60.195358 13.946510 -60.209457 13.950375 -60.223629 13.953915 -60.237862 13.957131 -60.252144 13.960025 -60.266483 13.962599 -60.280846 13.964852 -60.295231 13.966792 -60.309643 13.968233 -60.322410 13.971279 -60.331177 13.975793 -60.345200 13.979982 -60.359299 13.983846 -60.373470 13.987387 -60.387703 13.990602 -60.401993 13.993497 -60.416328 13.996071 -60.430694 13.998326 -60.445084 14.000264 -60.459496 14.001752 -60.472687 14.004660 -60.481060 14.009174 -60.495075 14.013364 -60.509178 14.017227 -60.523350 14.020767 -60.537594 14.023983 -60.551880 14.026878 -60.566219 14.029452 -60.580582 14.031708 -60.594978 14.033647 -60.609390 14.035272 -60.623810 14.035694 -60.628437 14.036854 -60.631775 14.041368 -60.645798 14.045557 -60.659901 14.049420 -60.674080 14.052960 -60.688312 14.056177 -60.702610 14.059041 -60.716793 14.060499 -60.720436 14.065663 -60.734268 14.070501 -60.748200 14.075017 -60.762230 14.079207 -60.776333 14.083070 -60.790516 14.086610 -60.804756 14.089826 -60.819042 14.092720 -60.833386 14.092747 -60.833534 14.094092 -60.836899 14.099257 -60.850731 14.104095 -60.864662 14.108610 -60.878693 14.112800 -60.892796 14.116663 -60.906982 14.120204 -60.921223 14.123420 -60.935520 14.126313 -60.949863 14.126385 -60.950264 14.127634 -60.953388 14.132798 -60.967224 14.137637 -60.981159 14.142152 -60.995186 14.146341 -61.009300 14.150205 -61.023483 14.153745 -61.037727 14.156962 -61.052029 14.159856 -61.066372 14.159978 -61.067051 14.161120 -61.069908 14.166284 -61.083748 14.171124 -61.097687 14.175638 -61.111717 14.179827 -61.125828 14.183690 -61.140015 14.187231 -61.154262 14.190448 -61.168560 14.193342 -61.182903 14.193512 -61.183849 14.194554 -61.186459 14.199719 -61.200306 14.204557 -61.214245 14.209072 -61.228275 14.213262 -61.242394 14.217126 -61.256580 14.220666 -61.270828 14.223883 -61.285130 14.226777 -61.299473 14.228167 -61.307239 14.231998 -61.317512 14.236837 -61.331451 14.239394 -61.339401 14.239520 -61.339619 14.246599 -61.352657 14.253366 -61.365849 14.258596 -61.376675 14.263041 -61.382568 14.271867 -61.394871 14.280407 -61.407368 14.288653 -61.420075 14.296601 -61.432957 14.304249 -61.446014 14.311592 -61.459251 14.318626 -61.472637 14.325352 -61.486183 14.325786 -61.487110 14.326477 -61.488018 14.335541 -61.500519 14.344323 -61.513218 14.352816 -61.526112 14.361017 -61.539192 14.368923 -61.552456 14.376531 -61.565884 14.383836 -61.579475 14.390835 -61.593220 14.393130 -61.597984 14.399158 -61.606216 14.408183 -61.619110 14.416923 -61.632198 14.425378 -61.645477 14.433542 -61.658939 14.441414 -61.672565 14.448989 -61.686356 14.456263 -61.700302 14.460608 -61.709084 14.462721 -61.711941 14.471986 -61.725033 14.480974 -61.738327 14.489681 -61.751801 14.498104 -61.765457 14.506241 -61.779278 14.514084 -61.793274 14.521634 -61.807426 14.528890 -61.821724 14.532784 -61.829811 14.534091 -61.831638 14.543327 -61.845123 14.552288 -61.858795 14.560969 -61.872650 14.569369 -61.886669 14.577483 -61.900864 14.585311 -61.915215 14.592844 -61.929722 14.600086 -61.944367 14.607033 -61.959152 14.613680 -61.974071 14.620030 -61.989109 14.626080 -62.004261 14.631827 -62.019524 14.637271 -62.034885 14.642413 -62.050343 14.647250 -62.065887 14.651782 -62.081509 14.656010 -62.097206 14.659932 -62.112961 14.663552 -62.128780 14.666868 -62.144646 14.669880 -62.160561 14.672588 -62.176502 14.674998 -62.192486 14.675892 -62.199261 14.676154 -62.200046 14.680991 -62.215591 14.685525 -62.231220 14.689751 -62.246914 14.693675 -62.262680 14.697293 -62.278500 14.700609 -62.294365 14.703622 -62.310280 14.706331 -62.326229 14.708740 -62.342209 14.709699 -62.349480 14.709804 -62.349800 14.714642 -62.365345 14.719173 -62.380970 14.723402 -62.396668 14.727323 -62.412430 14.730944 -62.428257 14.734259 -62.444130 14.737272 -62.460045 14.739982 -62.475994 14.742392 -62.491974 14.743418 -62.499763 14.748200 -62.515129 14.752732 -62.530766 14.756960 -62.546467 14.760884 -62.562229 14.764502 -62.578056 14.767819 -62.593929 14.770830 -62.609844 14.773539 -62.625801 14.775949 -62.641789 14.777048 -62.650120 14.781667 -62.664970 14.786200 -62.680607 14.790426 -62.696308 14.794351 -62.712078 14.797969 -62.727905 14.801285 -62.743778 14.804296 -62.759697 14.807007 -62.775654 14.809416 -62.791645 14.810586 -62.800518 14.815041 -62.814846 14.819574 -62.830486 14.823802 -62.846188 14.827724 -62.861961 14.831345 -62.877792 14.834661 -62.893665 14.837672 -62.909596 14.840383 -62.925549 14.842792 -62.941540 14.844900 -62.957554 14.844994 -62.958386 14.847231 -62.965580 14.851765 -62.981220 14.855992 -62.996933 14.859915 -63.012703 14.863535 -63.028534 14.866849 -63.044415 14.869864 -63.060337 14.872573 -63.076298 14.874982 -63.092293 14.877091 -63.108303 14.878902 -63.124340 14.880418 -63.140381 14.881024 -63.148350 14.881092 -63.148567 14.885624 -63.164204 14.889852 -63.179920 14.893776 -63.195690 14.897394 -63.211521 14.900710 -63.227409 14.903722 -63.243336 14.906432 -63.259300 14.908841 -63.275295 14.910952 -63.291313 14.912764 -63.307350 14.914278 -63.323387 14.915498 -63.339439 14.916425 -63.355484 14.917062 -63.371521 14.917410 -63.387535 14.917433 -63.393608 14.918627 -63.398518 14.922114 -63.414104 14.925309 -63.429748 14.928210 -63.445431 14.930824 -63.461151 14.933146 -63.476902 14.935182 -63.492680 14.936929 -63.508472 14.938389 -63.524277 14.939566 -63.540089 14.940456 -63.555900 14.941068 -63.571705 14.941398 -63.587505 14.941415 -63.592640 14.943379 -63.600857 14.946755 -63.616203 14.949851 -63.631615 14.952669 -63.647056 14.955203 -63.662540 14.957462 -63.678059 14.959441 -63.693604 14.961140 -63.709164 14.962565 -63.724743 14.963714 -63.740330 14.964586 -63.755924 14.965187 -63.771511 14.965515 -63.787094 14.965532 -63.792019 14.968062 -63.802731 14.971350 -63.817852 14.974370 -63.833023 14.977119 -63.848240 14.979600 -63.863499 14.981810 -63.878792 14.983751 -63.894112 14.985425 -63.909458 14.986829 -63.924820 14.987964 -63.940201 14.988833 -63.955582 14.989434 -63.970970 14.989772 -63.986359 14.989797 -63.991707 14.992713 -64.004135 14.995934 -64.019043 14.998898 -64.033997 15.001600 -64.048996 15.004044 -64.064033 15.006225 -64.079117 15.008145 -64.094223 15.009805 -64.109367 15.011204 -64.124527 15.012340 -64.139702 15.013219 -64.154900 15.013837 -64.170097 15.014192 -64.185310 15.014269 -64.197556 15.016270 -64.206100 15.019446 -64.220787 15.022371 -64.235527 15.025046 -64.250320 15.027468 -64.265152 15.029638 -64.280029 15.031552 -64.294945 15.033214 -64.309898 15.034621 -64.324867 15.035771 -64.339867 15.036668 -64.354889 15.037309 -64.369919 15.037693 -64.384956 + + + + + + + + + + + 26.540579 -69.833374 26.540438 -69.847160 26.539728 -69.860840 26.538446 -69.874382 26.536591 -69.887772 26.534170 -69.900963 26.531187 -69.913933 26.527649 -69.926659 26.523559 -69.939117 26.518930 -69.951263 26.513771 -69.963097 26.508091 -69.974579 26.501904 -69.985687 26.495222 -69.996384 26.488062 -70.006676 26.480433 -70.016518 26.472359 -70.025902 26.463991 -70.034958 26.455486 -70.043846 26.446837 -70.052582 26.438057 -70.061134 26.429142 -70.069519 26.420094 -70.077728 26.410919 -70.085762 26.401619 -70.093605 26.392197 -70.101280 26.382654 -70.108765 26.372995 -70.116058 26.363224 -70.123161 26.353340 -70.130074 26.343351 -70.136795 26.333256 -70.143326 26.323059 -70.149651 26.312765 -70.155777 26.302378 -70.161705 26.291895 -70.167427 26.281326 -70.172943 26.270672 -70.178261 26.259933 -70.183365 26.249115 -70.188263 26.238224 -70.192947 26.227259 -70.197411 26.216227 -70.201675 26.205128 -70.205719 26.193966 -70.209541 26.182747 -70.213150 26.171473 -70.216545 26.160147 -70.219711 26.148771 -70.222672 26.137354 -70.225395 26.125893 -70.227913 26.114395 -70.230194 26.102861 -70.232262 26.091297 -70.234100 26.079704 -70.235718 26.068092 -70.237106 26.056456 -70.238281 26.044806 -70.239220 26.033142 -70.239929 26.021467 -70.240425 26.009785 -70.240692 25.998102 -70.240730 25.986422 -70.240547 25.974745 -70.240128 25.963076 -70.239494 25.951420 -70.238632 25.939777 -70.237549 25.928154 -70.236237 25.916555 -70.234696 25.904982 -70.232941 25.893436 -70.230965 25.881924 -70.228760 25.870449 -70.226341 25.859015 -70.223686 25.847622 -70.220825 25.836277 -70.217743 25.824984 -70.214447 25.813742 -70.210930 25.802559 -70.207191 25.791435 -70.203247 25.780374 -70.199089 25.769382 -70.194717 25.758461 -70.190132 25.747612 -70.185341 25.736845 -70.180344 25.726154 -70.175140 25.715548 -70.169731 25.705029 -70.164123 25.694597 -70.158310 25.684263 -70.152298 25.674023 -70.146088 25.663883 -70.139687 25.653845 -70.133095 25.643913 -70.126305 25.634089 -70.119331 25.624376 -70.112167 25.614778 -70.104813 25.605299 -70.097282 25.595938 -70.089577 25.586702 -70.081688 25.577589 -70.073624 25.568607 -70.065384 25.559755 -70.056976 25.551037 -70.048408 25.542456 -70.039665 25.534012 -70.030762 25.525713 -70.021698 25.524551 -70.020340 25.523781 -70.020470 25.516750 -70.021500 25.509716 -70.022362 25.502684 -70.023056 25.495659 -70.023575 25.488640 -70.023941 25.481636 -70.024132 25.474648 -70.024155 25.467680 -70.024025 25.460737 -70.023743 25.453819 -70.023308 25.446936 -70.022713 25.440083 -70.021973 25.433266 -70.021088 25.426493 -70.020050 25.425119 -70.019813 25.423368 -70.020111 25.416336 -70.021156 25.409302 -70.022011 25.402271 -70.022705 25.398048 -70.023025 25.393807 -70.024910 25.387053 -70.027718 25.380249 -70.030342 25.373402 -70.032784 25.366516 -70.035057 25.359596 -70.037148 25.352648 -70.039063 25.345674 -70.040787 25.338678 -70.042351 25.331667 -70.043732 25.324646 -70.044937 25.317614 -70.045975 25.310581 -70.046837 25.303549 -70.047523 25.296858 -70.048027 25.293390 -70.049568 25.286636 -70.052368 25.279833 -70.054993 25.272986 -70.057434 25.266100 -70.059700 25.259180 -70.061790 25.252232 -70.063706 25.245257 -70.065430 25.238262 -70.066994 25.231251 -70.068367 25.224228 -70.069580 25.217199 -70.070610 25.210163 -70.071472 25.203131 -70.072159 25.196409 -70.072662 25.192972 -70.074188 25.186218 -70.076988 25.179415 -70.079613 25.172567 -70.082054 25.165684 -70.084320 25.158762 -70.086411 25.151815 -70.088310 25.144840 -70.090050 25.137846 -70.091599 25.130833 -70.092979 25.123812 -70.094185 25.116779 -70.095223 25.109745 -70.096077 25.102714 -70.096771 25.095900 -70.097275 25.092548 -70.098762 25.085793 -70.101562 25.078989 -70.104179 25.072144 -70.106628 25.065260 -70.108887 25.058336 -70.110969 25.051390 -70.112884 25.044413 -70.114609 25.037418 -70.116158 25.030407 -70.117538 25.023384 -70.118752 25.023003 -70.118805 25.021509 -70.120422 25.016325 -70.126068 25.011086 -70.131653 25.005726 -70.137093 25.000244 -70.142387 24.994648 -70.147530 24.988943 -70.152519 24.983128 -70.157356 24.977213 -70.162033 24.971197 -70.166550 24.965090 -70.170898 24.958889 -70.175079 24.952606 -70.179092 24.946240 -70.182938 24.939796 -70.186607 24.933281 -70.190109 24.926701 -70.193428 24.920055 -70.196579 24.913355 -70.199547 24.906601 -70.202347 24.899797 -70.204964 24.892950 -70.207397 24.886065 -70.209656 24.879143 -70.211739 24.872196 -70.213646 24.865219 -70.215378 24.858225 -70.216927 24.851213 -70.218308 24.844191 -70.219505 24.837246 -70.220528 24.832314 -70.225891 24.827076 -70.231460 24.821714 -70.236900 24.816235 -70.242187 24.810639 -70.247322 24.804934 -70.252296 24.799120 -70.257126 24.793203 -70.261803 24.787188 -70.266312 24.781078 -70.270645 24.774881 -70.274826 24.768595 -70.278839 24.762230 -70.282677 24.755787 -70.286339 24.749271 -70.289841 24.742689 -70.293159 24.736046 -70.296303 24.729343 -70.299263 24.722589 -70.302055 24.715786 -70.304665 24.708939 -70.307106 24.702053 -70.309357 24.695133 -70.311439 24.688183 -70.313339 24.681208 -70.315071 24.674212 -70.316620 24.667200 -70.317993 24.660177 -70.319199 24.653147 -70.320229 24.653004 -70.320244 24.648237 -70.325424 24.642996 -70.330994 24.637636 -70.336410 24.632152 -70.341690 24.626560 -70.346825 24.620853 -70.351799 24.615038 -70.356621 24.609123 -70.361282 24.603108 -70.365784 24.597000 -70.370117 24.590799 -70.374290 24.584513 -70.378296 24.578150 -70.382126 24.571705 -70.385788 24.565191 -70.389282 24.558609 -70.392601 24.551966 -70.395737 24.545265 -70.398697 24.538509 -70.401482 24.531706 -70.404091 24.524860 -70.406525 24.517973 -70.408783 24.511053 -70.410858 24.504103 -70.412758 24.497129 -70.414474 24.490133 -70.416023 24.483120 -70.417396 24.476095 -70.418602 24.469065 -70.419624 24.468704 -70.419670 24.464088 -70.424675 24.458847 -70.430237 24.453487 -70.435646 24.448006 -70.440926 24.442411 -70.446045 24.436706 -70.451012 24.430889 -70.455826 24.424974 -70.460480 24.418959 -70.464981 24.412849 -70.469307 24.406651 -70.473473 24.400364 -70.477470 24.394001 -70.481293 24.387558 -70.484955 24.381042 -70.488442 24.374460 -70.491745 24.367817 -70.494881 24.361115 -70.497849 24.354359 -70.500626 24.347555 -70.503227 24.340708 -70.505661 24.333822 -70.507904 24.326902 -70.509979 24.319950 -70.511879 24.312977 -70.513603 24.305981 -70.515144 24.298967 -70.516518 24.291943 -70.517715 24.284914 -70.518745 24.284328 -70.518814 24.279865 -70.523651 24.274626 -70.529198 24.269266 -70.534607 24.263784 -70.539871 24.258188 -70.544990 24.252483 -70.549950 24.246670 -70.554756 24.240755 -70.559403 24.234737 -70.563896 24.228628 -70.568214 24.222429 -70.572380 24.216143 -70.576363 24.209778 -70.580193 24.203333 -70.583847 24.196819 -70.587318 24.190237 -70.590630 24.183592 -70.593758 24.176893 -70.596710 24.170136 -70.599495 24.163332 -70.602097 24.156485 -70.604523 24.149601 -70.606766 24.142677 -70.608833 24.135729 -70.610725 24.128754 -70.612450 24.121758 -70.613991 24.114746 -70.615364 24.107721 -70.616562 24.100689 -70.617584 24.099888 -70.617683 24.095577 -70.622345 24.090336 -70.627884 24.084976 -70.633286 24.079496 -70.638550 24.073900 -70.643646 24.068193 -70.648605 24.062380 -70.653412 24.056463 -70.658050 24.050448 -70.662529 24.044338 -70.666855 24.038141 -70.671005 24.031853 -70.674995 24.025488 -70.678810 24.019045 -70.682449 24.012531 -70.685928 24.005947 -70.689224 23.999304 -70.692352 23.992601 -70.695305 23.985847 -70.698082 23.979042 -70.700684 23.972195 -70.703102 23.965311 -70.705345 23.958389 -70.707413 23.951439 -70.709305 23.944462 -70.711021 23.937468 -70.712563 23.930454 -70.713928 23.923429 -70.715126 23.916397 -70.716148 23.909365 -70.717003 23.902330 -70.717689 23.895302 -70.718208 23.888285 -70.718559 23.881279 -70.718758 23.874289 -70.718788 23.867321 -70.718658 23.860376 -70.718376 23.853456 -70.717949 23.846569 -70.717361 23.839716 -70.716629 23.832899 -70.715759 23.826120 -70.714745 23.819387 -70.713593 23.816931 -70.713120 23.813269 -70.714775 23.807592 -70.717194 23.801880 -70.719513 23.796131 -70.721703 23.790350 -70.723778 23.784536 -70.725731 23.778696 -70.727570 23.772827 -70.729294 23.766933 -70.730896 23.761023 -70.732384 23.755087 -70.733742 23.749134 -70.734993 23.743166 -70.736107 23.737184 -70.737122 23.731193 -70.738007 23.725193 -70.738777 23.719183 -70.739426 23.713171 -70.739960 23.707153 -70.740379 23.701136 -70.740669 23.695120 -70.740860 23.689106 -70.740929 23.683096 -70.740875 23.677093 -70.740715 23.671101 -70.740433 23.665117 -70.740044 23.662941 -70.739861 23.662594 -70.740082 23.657896 -70.742996 23.653151 -70.745842 23.648357 -70.748627 23.643517 -70.751343 23.638628 -70.753990 23.633692 -70.756577 23.628708 -70.759079 23.623678 -70.761520 23.618603 -70.763878 23.613478 -70.766159 23.608311 -70.768364 23.603096 -70.770485 23.597836 -70.772530 23.592535 -70.774483 23.587189 -70.776344 23.581801 -70.778130 23.576370 -70.779816 23.570900 -70.781410 23.565391 -70.782913 23.559849 -70.784309 23.554262 -70.785606 23.548645 -70.786812 23.542994 -70.787903 23.537308 -70.788895 23.531593 -70.789772 23.525852 -70.790543 23.520083 -70.791199 23.514288 -70.791748 23.508469 -70.792175 23.502634 -70.792496 23.496777 -70.792686 23.490904 -70.792755 23.485020 -70.792702 23.479124 -70.792526 23.473219 -70.792229 23.473150 -70.792221 23.470766 -70.793839 23.466398 -70.796700 23.461964 -70.799522 23.457464 -70.802284 23.452894 -70.805000 23.448255 -70.807648 23.443550 -70.810234 23.438776 -70.812759 23.433937 -70.815201 23.429028 -70.817581 23.424053 -70.819878 23.419012 -70.822082 23.413906 -70.824203 23.408735 -70.826241 23.403503 -70.828171 23.398211 -70.830009 23.392857 -70.831749 23.387447 -70.833366 23.381981 -70.834885 23.376465 -70.836273 23.370895 -70.837555 23.365278 -70.838715 23.359613 -70.839737 23.353912 -70.840637 23.348167 -70.841400 23.342388 -70.842033 23.336576 -70.842514 23.330734 -70.842865 23.324869 -70.843063 23.318981 -70.843109 23.313078 -70.843018 23.312397 -70.842987 23.310179 -70.845078 23.306095 -70.848785 23.301905 -70.852455 23.297611 -70.856072 23.293213 -70.859642 23.288710 -70.863151 23.284101 -70.866592 23.279385 -70.869957 23.274567 -70.873238 23.269646 -70.876434 23.264620 -70.879547 23.259497 -70.882545 23.254276 -70.885437 23.248957 -70.888222 23.243544 -70.890877 23.238043 -70.893410 23.232452 -70.895805 23.226782 -70.898064 23.221031 -70.900177 23.215202 -70.902138 23.209303 -70.903938 23.203337 -70.905586 23.197306 -70.907059 23.191223 -70.908363 23.185083 -70.909477 23.178904 -70.910423 23.172680 -70.911179 23.166424 -70.911743 23.160139 -70.912117 23.153832 -70.912285 23.147985 -70.912262 23.144831 -70.915627 23.140366 -70.920166 23.135754 -70.924614 23.130999 -70.928978 23.126104 -70.933250 23.121069 -70.937416 23.115900 -70.941460 23.110594 -70.945381 23.105160 -70.949158 23.099600 -70.952797 23.093916 -70.956291 23.088118 -70.959618 23.082205 -70.962769 23.076185 -70.965744 23.070065 -70.968544 23.063850 -70.971138 23.057545 -70.973541 23.051155 -70.975731 23.044697 -70.977715 23.038168 -70.979477 23.031580 -70.981010 23.024940 -70.982315 23.018255 -70.983383 23.011538 -70.984215 23.004793 -70.984802 22.998032 -70.985138 22.991260 -70.985229 22.984488 -70.985062 22.982838 -70.984963 22.978487 -70.989197 22.973320 -70.993942 22.968002 -70.998543 22.962528 -71.002976 22.956909 -71.007240 22.951151 -71.011330 22.945257 -71.015236 22.939234 -71.018936 22.933092 -71.022430 22.926836 -71.025711 22.920473 -71.028763 22.914017 -71.031586 22.907471 -71.034164 22.900843 -71.036499 22.894146 -71.038582 22.887384 -71.040398 22.880573 -71.041962 22.873722 -71.043243 22.866840 -71.044250 22.859936 -71.044983 22.853022 -71.045425 22.846111 -71.045593 22.843723 -71.045547 22.840376 -71.049484 22.835083 -71.055313 22.829599 -71.060974 22.823935 -71.066452 22.818092 -71.071731 22.812078 -71.076797 22.805902 -71.081650 22.799572 -71.086266 22.793100 -71.090645 22.786488 -71.094765 22.779751 -71.098625 22.772898 -71.102211 22.765940 -71.105507 22.758886 -71.108521 22.751751 -71.111229 22.744543 -71.113640 22.737278 -71.115738 22.729967 -71.117523 22.722618 -71.118973 22.715250 -71.120110 22.707876 -71.120911 22.700502 -71.121384 22.694391 -71.121490 22.690928 -71.125542 22.684999 -71.132012 22.678867 -71.138245 22.672541 -71.144241 22.666021 -71.149979 22.659327 -71.155441 22.652468 -71.160629 22.645451 -71.165520 22.638294 -71.170105 22.631004 -71.174370 22.623596 -71.178314 22.616085 -71.181915 22.608481 -71.185181 22.600801 -71.188087 22.593058 -71.190636 22.585268 -71.192825 22.577446 -71.194633 22.569605 -71.196075 22.561762 -71.197136 22.553932 -71.197807 22.550806 -71.197929 22.544823 -71.204010 22.538492 -71.209999 22.531975 -71.215729 22.525280 -71.221199 22.518419 -71.226372 22.511406 -71.231262 22.504248 -71.235840 22.496956 -71.240105 22.489550 -71.244041 22.482037 -71.247642 22.474434 -71.250900 22.466753 -71.253807 22.459011 -71.256355 22.451221 -71.258537 22.449297 -71.258980 22.446852 -71.263328 22.442434 -71.270630 22.437780 -71.277817 22.432890 -71.284866 22.427772 -71.291763 22.422430 -71.298500 22.416866 -71.305054 22.411095 -71.311409 22.405115 -71.317551 22.398941 -71.323464 22.392578 -71.329147 22.386036 -71.334579 22.379324 -71.339745 22.372457 -71.344635 22.365440 -71.349228 22.358290 -71.353531 22.351009 -71.357529 22.343626 -71.361199 22.336136 -71.364548 22.328564 -71.367569 22.320919 -71.370239 22.313215 -71.372559 22.307066 -71.374123 22.304438 -71.379120 22.300213 -71.386604 22.295744 -71.393997 22.291035 -71.401283 22.286087 -71.408447 22.280905 -71.415459 22.275496 -71.422325 22.269861 -71.429009 22.264009 -71.435516 22.257948 -71.441811 22.251678 -71.447899 22.245216 -71.453751 22.238567 -71.459358 22.231739 -71.464714 22.224745 -71.469795 22.217590 -71.474594 22.210295 -71.479111 22.202862 -71.483322 22.195307 -71.487213 22.187641 -71.490784 22.179878 -71.494019 22.172030 -71.496918 22.165001 -71.499184 22.162437 -71.503975 22.158247 -71.511292 22.153824 -71.518532 22.149164 -71.525696 22.144274 -71.532753 22.139151 -71.539696 22.133804 -71.546509 22.128229 -71.553169 22.122437 -71.559677 22.116432 -71.566002 22.110218 -71.572136 22.103807 -71.578072 22.097199 -71.583786 22.090406 -71.589272 22.083435 -71.594505 22.076298 -71.599487 22.069002 -71.604202 22.061560 -71.608635 22.053978 -71.612770 22.046270 -71.616608 22.038448 -71.620140 22.030525 -71.623345 22.022511 -71.626228 22.014420 -71.628777 22.009363 -71.630142 22.007729 -71.632767 22.003155 -71.639694 21.998356 -71.646530 21.993334 -71.653267 21.988091 -71.659889 21.982632 -71.666374 21.976957 -71.672714 21.971077 -71.678886 21.964992 -71.684891 21.958708 -71.690704 21.952236 -71.696320 21.945576 -71.701714 21.938740 -71.706886 21.931740 -71.711815 21.924576 -71.716492 21.917265 -71.720909 21.909811 -71.725052 21.902229 -71.728905 21.894527 -71.732468 21.886719 -71.735725 21.878836 -71.738670 21.875313 -71.744820 21.871159 -71.751671 21.866785 -71.758484 21.862198 -71.765251 21.857395 -71.771934 21.852375 -71.778549 21.847141 -71.785057 21.841696 -71.791458 21.836040 -71.797729 21.830179 -71.803871 21.824114 -71.809860 21.817850 -71.815682 21.811394 -71.821327 21.804752 -71.826775 21.797930 -71.832024 21.790930 -71.837044 21.783764 -71.841850 21.776444 -71.846413 21.768971 -71.850723 21.761356 -71.854767 21.753613 -71.858536 21.745749 -71.862022 21.737776 -71.865219 21.729803 -71.868080 21.725929 -71.874397 21.721483 -71.881264 21.716818 -71.888092 21.711939 -71.894859 21.706842 -71.901543 21.701528 -71.908150 21.696001 -71.914650 21.690264 -71.921036 21.684317 -71.927292 21.678164 -71.933403 21.671806 -71.939354 21.665251 -71.945145 21.658503 -71.950745 21.651571 -71.956146 21.644459 -71.961334 21.637171 -71.966309 21.629717 -71.971039 21.622109 -71.975533 21.614349 -71.979774 21.606453 -71.983734 21.598427 -71.987419 21.593857 -71.989326 21.590870 -71.994179 21.586552 -72.000862 21.582029 -72.007530 21.577303 -72.014160 21.572372 -72.020760 21.567234 -72.027298 21.561890 -72.033760 21.556337 -72.040146 21.550585 -72.046425 21.544622 -72.052605 21.538986 -72.058144 21.536373 -72.063065 21.531838 -72.071037 21.527107 -72.078819 21.522186 -72.086411 21.517090 -72.093811 21.511831 -72.101013 21.506422 -72.108009 21.500870 -72.114792 21.495193 -72.121361 21.489403 -72.127716 21.483507 -72.133850 21.477524 -72.139763 21.471464 -72.145454 21.465338 -72.150932 21.459160 -72.156189 21.452942 -72.161224 21.446695 -72.166039 21.440432 -72.170631 21.434164 -72.175018 21.433115 -72.175720 21.430340 -72.183601 21.426956 -72.192345 21.423321 -72.200958 21.419445 -72.209419 21.415340 -72.217720 21.411017 -72.225853 21.406483 -72.233810 21.401749 -72.241592 21.396828 -72.249184 21.391733 -72.256569 21.386473 -72.263763 21.381063 -72.270752 21.375515 -72.277527 21.369835 -72.284096 21.364044 -72.290443 21.358150 -72.296577 21.352167 -72.302483 21.346106 -72.308174 21.339979 -72.313644 21.333801 -72.318894 21.327583 -72.323914 21.321335 -72.328735 21.315073 -72.333328 21.308807 -72.337715 21.307486 -72.338592 21.304827 -72.346146 21.301443 -72.354881 21.297808 -72.363487 21.293934 -72.371933 21.289827 -72.380234 21.285502 -72.388359 21.280968 -72.396309 21.276234 -72.404083 21.271313 -72.411667 21.266220 -72.419045 21.260960 -72.426231 21.255549 -72.433220 21.250000 -72.439987 21.244322 -72.446548 21.238529 -72.452889 21.232635 -72.459015 21.226652 -72.464920 21.220591 -72.470612 21.214464 -72.476074 21.208286 -72.481316 21.202068 -72.486336 21.195822 -72.491150 21.189558 -72.495735 21.183292 -72.500122 21.181709 -72.501175 21.179159 -72.508408 21.175777 -72.517143 21.172142 -72.525734 21.168268 -72.534180 21.164162 -72.542473 21.159836 -72.550591 21.155302 -72.558533 21.150568 -72.566299 21.145647 -72.573875 21.140553 -72.581253 21.135292 -72.588440 21.129883 -72.595413 21.124332 -72.602180 21.118654 -72.608726 21.112864 -72.615067 21.106968 -72.621185 21.100985 -72.627090 21.094923 -72.632774 21.088797 -72.638229 21.082619 -72.643471 21.076399 -72.648491 21.070154 -72.653290 21.063892 -72.657883 21.057623 -72.662254 21.055778 -72.663483 21.053333 -72.670402 21.049950 -72.679138 21.046316 -72.687721 21.042442 -72.696152 21.038336 -72.704437 21.034010 -72.712555 21.029474 -72.720489 21.024742 -72.728249 21.019821 -72.735817 21.014725 -72.743195 21.009468 -72.750366 21.004057 -72.757332 20.998505 -72.764092 20.992827 -72.770645 20.987038 -72.776978 20.981140 -72.783089 20.975157 -72.788986 20.969095 -72.794662 20.962969 -72.800117 20.956791 -72.805359 20.950573 -72.810371 20.944326 -72.815170 20.938065 -72.819755 20.931795 -72.824127 20.929695 -72.825523 20.927359 -72.832138 20.923971 -72.840859 20.920338 -72.849442 20.916464 -72.857864 20.912357 -72.866142 20.908032 -72.874245 20.903498 -72.882179 20.898764 -72.889938 20.893843 -72.897499 20.888746 -72.904869 20.883488 -72.912033 20.878078 -72.918999 20.872526 -72.925751 20.866850 -72.932297 20.861057 -72.938621 20.855164 -72.944733 20.849178 -72.950623 20.843119 -72.956291 20.836990 -72.961739 20.830812 -72.966972 20.824593 -72.971985 20.818346 -72.976784 20.812084 -72.981361 20.805817 -72.985725 20.803461 -72.987289 20.801228 -72.993607 20.797844 -73.002319 20.794209 -73.010887 20.790335 -73.019310 20.786230 -73.027580 20.781902 -73.035675 20.777369 -73.043610 20.772634 -73.051353 20.767713 -73.058907 20.762617 -73.066269 20.757359 -73.073425 20.751949 -73.080391 20.746397 -73.087135 20.744942 -73.088814 20.744492 -73.090881 20.742077 -73.100540 20.739378 -73.110092 20.736399 -73.119530 20.733152 -73.128838 20.729643 -73.138023 20.725885 -73.147049 20.721888 -73.155922 20.717657 -73.164635 20.713211 -73.173172 20.708555 -73.181519 20.703701 -73.189697 20.698660 -73.197678 20.693447 -73.205452 20.688072 -73.213028 20.682545 -73.220390 20.676886 -73.227554 20.671480 -73.234032 20.671393 -73.234383 20.668562 -73.244415 20.665451 -73.254326 20.662069 -73.264107 20.658432 -73.273735 20.654539 -73.283218 20.650406 -73.292542 20.646046 -73.301689 20.641464 -73.310654 20.636679 -73.319435 20.631695 -73.328033 20.626528 -73.336426 20.621187 -73.344612 20.615690 -73.352600 20.610041 -73.360374 20.604261 -73.367935 20.599182 -73.374245 20.597654 -73.379646 20.594400 -73.390030 20.590878 -73.400269 20.587095 -73.410355 20.583059 -73.420281 20.578785 -73.430031 20.574280 -73.439613 20.569559 -73.449013 20.564632 -73.458221 20.559511 -73.467232 20.554209 -73.476036 20.548735 -73.484642 20.543102 -73.493027 20.537325 -73.501205 20.531416 -73.509163 20.526846 -73.515030 20.526627 -73.515793 20.523220 -73.526634 20.519543 -73.537331 20.515606 -73.547859 20.511417 -73.558228 20.506990 -73.568420 20.502336 -73.578423 20.497465 -73.588249 20.492390 -73.597870 20.487123 -73.607292 20.481674 -73.616508 20.476059 -73.625519 20.470287 -73.634308 20.464373 -73.642883 20.458326 -73.651238 20.454273 -73.656593 20.451895 -73.664116 20.448055 -73.675262 20.443955 -73.686234 20.439606 -73.697037 20.435017 -73.707657 20.430202 -73.718094 20.425173 -73.728333 20.419941 -73.738365 20.414518 -73.748200 20.408918 -73.757828 20.403151 -73.767235 20.397230 -73.776428 20.391169 -73.785393 20.384979 -73.794144 20.378674 -73.802673 20.372263 -73.810982 20.365765 -73.819061 20.359186 -73.826920 20.352537 -73.834557 20.345837 -73.841972 20.339092 -73.849182 20.332315 -73.856171 20.325520 -73.862953 20.321430 -73.866905 20.319210 -73.871162 20.313788 -73.880989 20.308186 -73.890602 20.302420 -73.900002 20.296497 -73.909187 20.290438 -73.918160 20.284248 -73.926903 20.277941 -73.935425 20.271532 -73.943726 20.265032 -73.951797 20.258451 -73.959648 20.251806 -73.967285 20.245104 -73.974701 20.238361 -73.981895 20.231585 -73.988884 20.224789 -73.995659 20.217981 -74.002235 20.211176 -74.008614 20.204380 -74.014786 20.197609 -74.020783 20.190866 -74.026589 20.184162 -74.032219 20.177507 -74.037689 20.170908 -74.042992 20.164372 -74.048149 20.157906 -74.053154 20.151518 -74.058037 20.145214 -74.062782 20.138998 -74.067421 20.132877 -74.071938 20.126854 -74.076370 20.120932 -74.080711 20.115116 -74.084969 20.109405 -74.089172 20.103806 -74.093307 20.098316 -74.097397 20.092941 -74.101448 20.087679 -74.105476 20.082525 -74.109482 20.079664 -74.111748 20.076389 -74.116241 20.070040 -74.124611 20.063610 -74.132774 20.057114 -74.140732 20.050562 -74.148476 20.043964 -74.156021 20.037331 -74.163361 20.030674 -74.170502 20.024002 -74.177452 20.017330 -74.184204 20.010660 -74.190788 20.004003 -74.197189 19.997370 -74.203423 19.990768 -74.209488 19.984205 -74.215393 19.977688 -74.221153 19.971222 -74.226769 19.964819 -74.232254 19.958477 -74.237610 19.952209 -74.242844 19.946014 -74.247978 19.939899 -74.253006 19.933866 -74.257950 19.927921 -74.262810 19.922064 -74.267601 19.916298 -74.272316 19.910625 -74.276993 19.905046 -74.281616 19.899559 -74.286201 19.894165 -74.290764 19.888867 -74.295311 19.883657 -74.299858 19.878538 -74.304398 19.873508 -74.308945 19.872591 -74.309792 19.868259 -74.315834 19.862070 -74.324188 19.855825 -74.332352 19.849531 -74.340340 19.843199 -74.348145 19.836836 -74.355782 19.830450 -74.363243 19.824053 -74.370537 19.817648 -74.377663 19.811247 -74.384644 19.804854 -74.391472 19.798477 -74.398155 19.792120 -74.404701 19.785795 -74.411110 19.779499 -74.417404 19.773245 -74.423576 19.767031 -74.429642 19.760860 -74.435616 19.754745 -74.441483 19.748680 -74.447266 19.742674 -74.452972 19.736725 -74.458603 19.730833 -74.464172 19.725004 -74.469688 19.719235 -74.475159 19.713526 -74.480583 19.707878 -74.485985 19.702291 -74.491356 19.696762 -74.496719 19.691292 -74.502060 19.685873 -74.507408 19.680510 -74.512756 19.675192 -74.518112 19.669920 -74.523491 19.664690 -74.528892 19.659496 -74.534317 19.654274 -74.539711 19.648966 -74.545013 19.643568 -74.550217 19.638084 -74.555313 19.632521 -74.560310 19.626871 -74.565201 19.621143 -74.570000 19.615335 -74.574677 19.609453 -74.579254 19.603493 -74.583710 19.597462 -74.588074 19.591362 -74.592308 19.585190 -74.596443 19.578951 -74.600456 19.575918 -74.602333 19.574442 -74.603897 19.568184 -74.610458 19.561956 -74.616928 19.555763 -74.623299 19.549608 -74.629593 19.543493 -74.635811 19.537416 -74.641960 19.531382 -74.648048 19.525393 -74.654076 19.519444 -74.660057 19.513536 -74.666000 19.507673 -74.671913 19.501848 -74.677795 19.496067 -74.683655 19.490318 -74.689507 19.484610 -74.695343 19.478930 -74.701187 19.473280 -74.707024 19.467657 -74.712868 19.462057 -74.718735 19.456415 -74.724556 19.450682 -74.730278 19.444853 -74.735886 19.438929 -74.741379 19.432918 -74.746773 19.426817 -74.752052 19.420629 -74.757210 19.420290 -74.757484 19.416218 -74.762459 19.409735 -74.770241 19.403248 -74.777893 19.396763 -74.785439 19.390280 -74.792877 19.383806 -74.800209 19.377346 -74.807449 19.370895 -74.814598 19.364464 -74.821663 19.358049 -74.828651 19.351654 -74.835564 19.345278 -74.842415 19.338921 -74.849205 19.332586 -74.855942 19.326271 -74.862640 19.319975 -74.869286 19.313698 -74.875900 19.307434 -74.882484 19.301187 -74.889046 19.294952 -74.895599 19.288727 -74.902130 19.282511 -74.908653 19.276297 -74.915169 19.270027 -74.921623 19.263655 -74.927971 19.257174 -74.934189 19.250593 -74.940292 19.243914 -74.946274 19.237133 -74.952126 19.230257 -74.957855 19.223286 -74.963463 19.216225 -74.968933 19.209072 -74.974274 19.201832 -74.979485 19.194508 -74.984566 19.187101 -74.989502 19.179609 -74.994301 19.172045 -74.998970 19.164400 -75.003487 19.156681 -75.007873 19.148893 -75.012108 19.141033 -75.016205 19.133108 -75.020157 19.125116 -75.023956 19.117065 -75.027611 19.108955 -75.031120 19.100788 -75.034477 19.092564 -75.037689 19.087446 -75.039574 19.086075 -75.041016 19.079830 -75.047562 19.073595 -75.054100 19.067369 -75.060623 19.061151 -75.067139 19.054937 -75.073646 19.048668 -75.080093 19.042295 -75.086426 19.035816 -75.092644 19.029234 -75.098740 19.022552 -75.104713 19.015774 -75.110558 19.008898 -75.116280 19.001928 -75.121880 18.994865 -75.127350 18.987715 -75.132683 18.980475 -75.137878 18.973150 -75.142952 18.965744 -75.147888 18.958252 -75.152679 18.950684 -75.157341 18.943039 -75.161850 18.935324 -75.166229 18.927534 -75.170463 18.919674 -75.174561 18.911749 -75.178497 18.903759 -75.182297 18.895708 -75.185951 18.887596 -75.189453 18.879429 -75.192810 18.871204 -75.196014 18.862930 -75.199058 18.854605 -75.201958 18.846233 -75.204697 18.837818 -75.207298 18.829361 -75.209724 18.820864 -75.212006 18.812332 -75.214134 18.803764 -75.216103 18.795162 -75.217911 18.786535 -75.219559 18.777882 -75.221054 18.769205 -75.222389 18.760506 -75.223564 18.751789 -75.224579 18.743059 -75.225433 18.734314 -75.226135 18.725559 -75.226662 18.716795 -75.227043 18.708029 -75.227249 18.699259 -75.227310 18.690489 -75.227196 18.681721 -75.226929 18.672964 -75.226501 18.664211 -75.225914 18.655470 -75.225166 18.646740 -75.224251 18.638031 -75.223190 18.629339 -75.221962 18.620670 -75.220574 18.612022 -75.219032 18.603405 -75.217331 18.594816 -75.215469 18.586260 -75.213448 18.584055 -75.212883 18.577692 -75.212700 18.570101 -75.212326 18.562515 -75.211822 18.554937 -75.211174 18.547375 -75.210396 18.539825 -75.209473 18.532293 -75.208405 18.524778 -75.207214 18.517282 -75.205879 18.509815 -75.204407 18.502369 -75.202797 18.494951 -75.201057 18.487566 -75.199173 18.483978 -75.198196 18.481432 -75.198212 18.474998 -75.198135 18.468571 -75.197945 18.462145 -75.197640 18.455728 -75.197205 18.449316 -75.196671 18.442917 -75.196007 18.436527 -75.195229 18.430153 -75.194336 18.423796 -75.193329 18.417452 -75.192200 18.411131 -75.190956 18.404831 -75.189598 18.398556 -75.188126 18.392304 -75.186546 18.386080 -75.184845 18.380613 -75.183243 18.380447 -75.183250 18.375189 -75.183380 18.369925 -75.183426 18.364664 -75.183372 18.359404 -75.183212 18.354147 -75.182968 18.348896 -75.182617 18.343649 -75.182175 18.338413 -75.181633 18.333185 -75.181007 18.327969 -75.180275 18.322765 -75.179451 18.318335 -75.178665 18.314880 -75.179527 18.310598 -75.180519 18.306299 -75.181427 18.301987 -75.182259 18.297663 -75.183006 18.293324 -75.183685 18.288975 -75.184280 18.284616 -75.184792 18.280252 -75.185219 18.275881 -75.185577 18.271502 -75.185844 18.267120 -75.186043 18.262735 -75.186157 18.258350 -75.186188 18.253965 -75.186142 18.249582 -75.186012 18.245203 -75.185806 18.240826 -75.185524 18.236454 -75.185158 18.232088 -75.184708 18.227734 -75.184181 18.223385 -75.183579 18.219049 -75.182892 18.214725 -75.182129 18.210415 -75.181282 18.206118 -75.180367 18.201839 -75.179367 18.197577 -75.178284 18.193333 -75.177132 18.189108 -75.175903 18.184906 -75.174591 18.180723 -75.173202 18.176567 -75.171745 18.172436 -75.170204 18.171274 -75.169746 18.169220 -75.170029 18.166023 -75.170403 18.162823 -75.170723 18.159616 -75.170982 18.156406 -75.171181 18.153194 -75.171326 18.149979 -75.171417 18.146765 -75.171440 18.143547 -75.171410 18.140333 -75.171310 18.137119 -75.171165 18.133911 -75.170960 18.130705 -75.170692 18.127504 -75.170364 18.124310 -75.169983 18.121122 -75.169540 18.117943 -75.169029 18.114769 -75.168480 18.111608 -75.167862 18.108458 -75.167191 18.105318 -75.166458 18.102192 -75.165665 18.099079 -75.164825 18.095982 -75.163925 18.092901 -75.162964 18.089832 -75.161949 18.086784 -75.160873 18.083754 -75.159752 18.080744 -75.158569 18.077751 -75.157341 18.074783 -75.156052 18.071835 -75.154701 18.068909 -75.153305 18.066694 -75.152199 18.065483 -75.152550 18.063501 -75.153084 18.061512 -75.153580 18.059513 -75.154037 18.057507 -75.154472 18.055494 -75.154861 18.053478 -75.155205 18.051453 -75.155525 18.049421 -75.155800 18.047388 -75.156044 18.045351 -75.156242 18.043312 -75.156410 18.041269 -75.156540 18.039225 -75.156639 18.037382 -75.156685 18.036436 -75.157089 18.027512 -75.160553 18.018587 -75.163696 18.009678 -75.166527 18.000801 -75.169045 17.998186 -75.169701 17.993780 -75.173134 17.985540 -75.179131 17.977156 -75.184822 17.968634 -75.190201 17.960001 -75.195259 17.951273 -75.199997 17.948164 -75.201561 17.947796 -75.201965 17.940578 -75.209389 17.933123 -75.216545 17.925447 -75.223419 17.917564 -75.230003 17.909496 -75.236298 17.901260 -75.242294 17.892874 -75.247978 17.884354 -75.253349 17.875719 -75.258408 17.866989 -75.263145 17.858183 -75.267563 17.856039 -75.268555 17.852682 -75.272003 17.845228 -75.279152 17.837551 -75.286018 17.829670 -75.292603 17.821602 -75.298897 17.813364 -75.304886 17.804977 -75.310570 17.796457 -75.315933 17.787823 -75.320991 17.779093 -75.325729 17.770287 -75.330147 17.768053 -75.331177 17.764765 -75.334557 17.757311 -75.341698 17.749634 -75.348564 17.741753 -75.355148 17.733685 -75.361435 17.725447 -75.367424 17.717060 -75.373100 17.708540 -75.378464 17.699904 -75.383522 17.691176 -75.388252 17.682369 -75.392670 17.680042 -75.393745 17.676830 -75.397041 17.669376 -75.404190 17.661697 -75.411057 17.653816 -75.417633 17.645750 -75.423912 17.637512 -75.429901 17.629126 -75.435570 17.620604 -75.440941 17.611969 -75.445992 17.603239 -75.450722 17.594433 -75.455132 17.592022 -75.456245 17.588871 -75.459480 17.581415 -75.466614 17.573738 -75.473480 17.565859 -75.480049 17.557789 -75.486336 17.549551 -75.492317 17.541166 -75.497986 17.532642 -75.503349 17.524010 -75.508400 17.515280 -75.513130 17.506474 -75.517540 17.503971 -75.518700 17.500895 -75.521851 17.493439 -75.528992 17.485762 -75.535851 17.477880 -75.542419 17.469812 -75.548698 17.461575 -75.554672 17.453188 -75.560341 17.444666 -75.565704 17.436031 -75.570747 17.427301 -75.575478 17.418495 -75.579880 17.415911 -75.581077 17.412897 -75.584168 17.405443 -75.591293 17.397766 -75.598145 17.389883 -75.604713 17.381815 -75.610992 17.373579 -75.616966 17.365190 -75.622635 17.356670 -75.627991 17.348036 -75.633034 17.339304 -75.637764 17.330498 -75.642166 17.327846 -75.643387 17.324883 -75.646423 17.317427 -75.653549 17.309750 -75.660400 17.301868 -75.666969 17.293800 -75.673241 17.285562 -75.679214 17.277176 -75.684875 17.268652 -75.690231 17.260019 -75.695274 17.251289 -75.699997 17.242481 -75.704399 17.233618 -75.708488 17.224714 -75.712250 17.215790 -75.715698 17.206861 -75.718826 17.197952 -75.721642 17.189075 -75.724152 17.180252 -75.726349 17.171497 -75.728256 17.162828 -75.729866 17.154264 -75.731194 17.145821 -75.732239 17.137512 -75.733017 17.129353 -75.733543 17.121361 -75.733810 17.113548 -75.733856 17.105927 -75.733681 17.098513 -75.733284 17.091316 -75.732697 17.084349 -75.731918 17.077620 -75.730980 17.071138 -75.729881 17.064918 -75.728653 17.058964 -75.727287 17.053282 -75.725830 17.047878 -75.724274 17.042759 -75.722649 17.037933 -75.720963 17.033398 -75.719238 17.029154 -75.717499 17.025213 -75.715744 17.021568 -75.714004 17.018221 -75.712295 17.015169 -75.710632 17.012413 -75.709030 17.009951 -75.707512 17.007776 -75.706085 17.005882 -75.704773 17.004269 -75.703590 17.002924 -75.702545 17.001844 -75.701668 17.001024 -75.700951 17.000446 -75.700432 17.000111 -75.700104 17.000002 -75.699997 16.999889 -75.700104 16.999554 -75.700432 16.998978 -75.700951 16.998156 -75.701668 16.997076 -75.702545 16.995733 -75.703590 16.994118 -75.704773 16.992226 -75.706085 16.990049 -75.707512 16.987585 -75.709030 16.984829 -75.710632 16.981779 -75.712295 16.978432 -75.713997 16.974787 -75.715744 16.970844 -75.717491 16.966602 -75.719231 16.962067 -75.720955 16.957237 -75.722641 16.952118 -75.724258 16.946714 -75.725815 16.941032 -75.727272 16.935076 -75.728630 16.928856 -75.729858 16.922377 -75.730949 16.915646 -75.731888 16.908678 -75.732658 16.901482 -75.733246 16.894066 -75.733635 16.886446 -75.733810 16.878632 -75.733772 16.870640 -75.733490 16.862482 -75.732964 16.854174 -75.732185 16.845730 -75.731132 16.837164 -75.729813 16.828497 -75.728203 16.819742 -75.726303 16.810919 -75.724098 16.802044 -75.721603 16.793131 -75.718788 16.784204 -75.715660 16.775282 -75.712227 16.766378 -75.708466 16.757513 -75.704392 16.748707 -75.699997 16.739975 -75.695282 16.731338 -75.690254 16.722818 -75.684921 16.714428 -75.679276 16.706188 -75.673325 16.698118 -75.667076 16.690233 -75.660530 16.682552 -75.653709 16.675093 -75.646607 16.667872 -75.639244 16.660902 -75.631622 16.654203 -75.623749 16.647791 -75.615654 16.641676 -75.607330 16.635876 -75.598801 16.630402 -75.590080 16.625267 -75.581177 16.620485 -75.572105 16.616064 -75.562904 16.612017 -75.553558 16.608355 -75.544098 16.605081 -75.534554 16.602209 -75.524910 16.599741 -75.515221 16.597687 -75.505486 16.596052 -75.495727 16.594837 -75.485970 16.594049 -75.476219 16.593687 -75.466507 16.593756 -75.456848 16.594252 -75.447258 16.595177 -75.437775 16.596531 -75.428390 16.598310 -75.419144 16.600508 -75.410049 16.603126 -75.401115 16.606155 -75.392380 16.609589 -75.383850 16.613424 -75.375534 16.617647 -75.367470 16.622251 -75.359665 16.627230 -75.352127 16.632568 -75.344887 16.638256 -75.337959 16.644283 -75.331345 16.650526 -75.324959 16.656880 -75.318680 16.663334 -75.312523 16.669893 -75.306473 16.676550 -75.300552 16.683308 -75.294746 16.690161 -75.289062 16.697109 -75.283516 16.704149 -75.278084 16.711281 -75.272781 16.718498 -75.267609 16.725803 -75.262573 16.733191 -75.257660 16.740660 -75.252884 16.748205 -75.248245 16.755831 -75.243744 16.762548 -75.239937 16.764570 -75.238136 16.771326 -75.232330 16.778181 -75.226646 16.785128 -75.221085 16.792170 -75.215653 16.799299 -75.210350 16.806517 -75.205177 16.813820 -75.200127 16.821207 -75.195221 16.828676 -75.190445 16.836224 -75.185799 16.843849 -75.181297 16.850449 -75.177559 16.852570 -75.175667 16.859327 -75.169853 16.866180 -75.164169 16.873129 -75.158608 16.880169 -75.153175 16.887299 -75.147865 16.894516 -75.142685 16.901819 -75.137649 16.909206 -75.132729 16.916676 -75.127953 16.924221 -75.123314 16.931849 -75.118805 16.938276 -75.115158 16.940550 -75.113136 16.947306 -75.107323 16.954161 -75.101631 16.961109 -75.096062 16.968149 -75.090630 16.975277 -75.085320 16.982494 -75.080147 16.989798 -75.075096 16.997187 -75.070175 17.004656 -75.065399 17.012201 -75.060753 17.019827 -75.056244 17.026123 -75.052666 17.028513 -75.050537 17.035271 -75.044723 17.042122 -75.039032 17.049068 -75.033470 17.056110 -75.028030 17.063240 -75.022713 17.070458 -75.017532 17.077761 -75.012482 17.085148 -75.007568 17.092617 -75.002777 17.100164 -74.998131 17.107788 -74.993629 17.113905 -74.990158 17.116453 -74.987885 17.123207 -74.982063 17.130062 -74.976372 17.137009 -74.970802 17.144049 -74.965355 17.151178 -74.960045 17.158396 -74.954857 17.165697 -74.949814 17.173086 -74.944885 17.180553 -74.940102 17.188101 -74.935455 17.195724 -74.930939 17.201725 -74.927528 17.204372 -74.925171 17.211128 -74.919350 17.217981 -74.913650 17.224928 -74.908081 17.231968 -74.902634 17.239099 -74.897324 17.246315 -74.892128 17.253618 -74.887077 17.261005 -74.882156 17.268473 -74.877373 17.276020 -74.872711 17.283646 -74.868195 17.289499 -74.864868 17.292271 -74.862396 17.299027 -74.856575 17.305882 -74.850876 17.312828 -74.845291 17.319868 -74.839851 17.326996 -74.834534 17.334213 -74.829338 17.341517 -74.824287 17.348904 -74.819359 17.356371 -74.814568 17.363918 -74.809914 17.365818 -74.808792 17.369900 -74.805008 17.376556 -74.799065 17.383312 -74.793243 17.390165 -74.787537 17.397112 -74.781967 17.404152 -74.776512 17.411282 -74.771187 17.418499 -74.765999 17.425800 -74.760933 17.433188 -74.756012 17.440657 -74.751213 17.448202 -74.746559 17.455826 -74.742043 17.463524 -74.737663 17.471294 -74.733421 17.479134 -74.729324 17.487042 -74.725372 17.495012 -74.721558 17.503048 -74.717888 17.511141 -74.714371 17.519295 -74.710999 17.527504 -74.707779 17.535763 -74.704704 17.541893 -74.702545 17.544930 -74.700523 17.552397 -74.695725 17.559942 -74.691071 17.567566 -74.686546 17.575264 -74.682159 17.583033 -74.677917 17.590872 -74.673821 17.598780 -74.669861 17.606752 -74.666054 17.614786 -74.662384 17.622881 -74.658859 17.631033 -74.655487 17.639242 -74.652260 17.647501 -74.649178 17.650549 -74.648110 17.656202 -74.644211 17.663616 -74.639282 17.671104 -74.634491 17.678673 -74.629814 17.686316 -74.625275 17.694031 -74.620857 17.701817 -74.616577 17.709673 -74.612427 17.717598 -74.608414 17.725588 -74.604538 17.733643 -74.600792 17.741758 -74.597199 17.749937 -74.593735 17.758169 -74.590416 17.766460 -74.587227 17.767158 -74.586975 17.774303 -74.581894 17.781681 -74.576820 17.789133 -74.571846 17.796665 -74.566986 17.804272 -74.562241 17.811953 -74.557594 17.819710 -74.553070 17.827537 -74.548660 17.835442 -74.544365 17.843414 -74.540184 17.851460 -74.536133 17.859573 -74.532196 17.867758 -74.528389 17.876009 -74.524704 17.884327 -74.521156 17.892712 -74.517731 17.895782 -74.516540 17.899584 -74.513809 17.907002 -74.508637 17.914499 -74.503540 17.922075 -74.498543 17.929729 -74.493637 17.937464 -74.488830 17.945278 -74.484116 17.953173 -74.479500 17.961143 -74.474991 17.969198 -74.470581 17.977331 -74.466286 17.985542 -74.462105 17.993835 -74.458038 18.002203 -74.454079 18.010653 -74.450241 18.019178 -74.446526 18.026516 -74.443466 18.032181 -74.439407 18.039736 -74.434120 18.047375 -74.428909 18.055098 -74.423782 18.062914 -74.418732 18.070814 -74.413773 18.078808 -74.408897 18.086885 -74.404106 18.095060 -74.399414 18.103325 -74.394821 18.111681 -74.390335 18.120129 -74.385948 18.128672 -74.381683 18.137304 -74.377525 18.146032 -74.373482 18.154850 -74.369568 18.158560 -74.367989 18.164906 -74.363380 18.172636 -74.357895 18.180466 -74.352478 18.188398 -74.347122 18.196428 -74.341850 18.204559 -74.336655 18.212797 -74.331543 18.221142 -74.326523 18.229591 -74.321587 18.238148 -74.316757 18.246815 -74.312019 18.255588 -74.307396 18.264473 -74.302887 18.273464 -74.298500 18.282566 -74.294228 18.290947 -74.290466 18.297968 -74.285271 18.305946 -74.279510 18.314043 -74.273804 18.322252 -74.268181 18.330580 -74.262619 18.339031 -74.257133 18.347605 -74.251740 18.356302 -74.246437 18.365124 -74.241226 18.374073 -74.236122 18.383148 -74.231133 18.392353 -74.226257 18.401680 -74.221504 18.411138 -74.216881 18.420721 -74.212402 18.422630 -74.211548 18.423504 -74.210876 18.431688 -74.204727 18.440004 -74.198631 18.448456 -74.192604 18.457045 -74.186645 18.465773 -74.180763 18.474642 -74.174973 18.483658 -74.169273 18.492815 -74.163681 18.502121 -74.158188 18.511570 -74.152832 18.521162 -74.147583 18.530905 -74.142479 18.538757 -74.138542 18.544363 -74.134064 18.552814 -74.127480 18.561419 -74.120956 18.570177 -74.114502 18.579096 -74.108124 18.588175 -74.101837 18.597416 -74.095634 18.606819 -74.089539 18.616388 -74.083557 18.626123 -74.077690 18.636023 -74.071960 18.646088 -74.066368 18.656315 -74.060928 18.666708 -74.055641 18.677259 -74.050537 18.682312 -74.048210 18.688751 -74.041992 18.695902 -74.035172 18.703159 -74.028351 18.710531 -74.021530 18.718023 -74.014725 18.725636 -74.007927 18.733377 -74.001152 18.741255 -73.994400 18.749269 -73.987671 18.757425 -73.980980 18.765728 -73.974342 18.774179 -73.967750 18.782782 -73.961220 18.790695 -73.955383 18.796673 -73.949379 18.803509 -73.942596 18.810398 -73.935844 18.817339 -73.929115 18.824339 -73.922417 18.831402 -73.915741 18.838530 -73.909096 18.845726 -73.902474 18.852995 -73.895889 18.860342 -73.889328 18.867767 -73.882805 18.875275 -73.876312 18.882872 -73.869850 18.890556 -73.863426 18.892838 -73.861557 18.897737 -73.853180 18.903317 -73.844200 18.909130 -73.835373 18.915173 -73.826714 18.921438 -73.818222 18.927927 -73.809921 18.934627 -73.801796 18.941540 -73.793869 18.948656 -73.786148 18.955912 -73.778564 18.963242 -73.771057 18.970650 -73.763634 18.978134 -73.756279 18.985697 -73.749016 18.993340 -73.741821 19.001062 -73.734703 19.008865 -73.727669 19.016752 -73.720718 19.024719 -73.713837 19.032774 -73.707046 19.040913 -73.700340 19.049139 -73.693703 19.057455 -73.687164 19.065859 -73.680710 19.074354 -73.674339 19.082939 -73.668060 19.091618 -73.661880 19.100389 -73.655792 19.104965 -73.652702 19.110893 -73.643776 19.117357 -73.634659 19.124090 -73.625755 19.131090 -73.617081 19.138346 -73.608650 19.145851 -73.600449 19.153530 -73.592438 19.161314 -73.584534 19.169199 -73.576736 19.177189 -73.569061 19.185280 -73.561493 19.193470 -73.554031 19.201763 -73.546700 19.210154 -73.539475 19.218647 -73.532372 19.227238 -73.525383 19.235924 -73.518516 19.244709 -73.511772 19.253591 -73.505157 19.259247 -73.501068 19.264175 -73.490425 19.269653 -73.479553 19.275488 -73.468880 19.281666 -73.458435 19.288181 -73.448204 19.295031 -73.438225 19.302204 -73.428505 19.309696 -73.419052 19.317495 -73.409874 19.325594 -73.400993 19.333908 -73.392326 19.342365 -73.383827 19.350960 -73.375481 19.359693 -73.367287 19.360809 -73.366280 19.364916 -73.357407 19.370396 -73.346527 19.376226 -73.335854 19.382404 -73.325386 19.388920 -73.315163 19.395771 -73.305176 19.402943 -73.295441 19.410437 -73.285980 19.418234 -73.276802 19.426332 -73.267914 19.434647 -73.259247 19.443104 -73.250740 19.451698 -73.242378 19.459398 -73.235153 19.459602 -73.234695 19.464888 -73.223724 19.470514 -73.212936 19.476473 -73.202339 19.482756 -73.191956 19.489363 -73.181786 19.496282 -73.171860 19.503513 -73.162163 19.511042 -73.152733 19.518862 -73.143570 19.526966 -73.134682 19.535288 -73.126022 19.543766 -73.117531 19.552395 -73.109207 19.557644 -73.104332 19.559315 -73.100738 19.564766 -73.089851 19.570536 -73.079155 19.576620 -73.068642 19.583012 -73.058327 19.589706 -73.048225 19.596699 -73.038345 19.603985 -73.028702 19.611551 -73.019295 19.619394 -73.010155 19.627506 -73.001267 19.635834 -72.992607 19.644333 -72.984131 19.652996 -72.975845 19.655592 -72.973465 19.658920 -72.966606 19.664537 -72.955826 19.670452 -72.945213 19.676662 -72.934784 19.683163 -72.924545 19.689947 -72.914505 19.697010 -72.904671 19.704350 -72.895073 19.711954 -72.885696 19.719820 -72.876572 19.727940 -72.867683 19.736275 -72.859032 19.744795 -72.850563 19.753225 -72.842575 19.758431 -72.832298 19.764212 -72.821617 19.770269 -72.811096 19.776606 -72.800743 19.783213 -72.790581 19.790087 -72.780602 19.797224 -72.770836 19.804617 -72.761276 19.812262 -72.751930 19.820149 -72.742813 19.828276 -72.733925 19.836617 -72.725273 19.844278 -72.717705 19.849253 -72.707695 19.854931 -72.696953 19.860876 -72.686371 19.867081 -72.675934 19.873543 -72.665665 19.880259 -72.655571 19.887220 -72.645668 19.894430 -72.635948 19.901878 -72.626427 19.909559 -72.617111 19.917469 -72.608009 19.925604 -72.599129 19.933952 -72.590477 19.942512 -72.582054 19.951275 -72.573875 19.960236 -72.565941 19.969315 -72.558319 19.969980 -72.556892 19.975391 -72.546005 19.981071 -72.535255 19.987015 -72.524666 19.993219 -72.514221 19.999682 -72.503937 20.006395 -72.493843 20.013359 -72.483925 20.020567 -72.474205 20.028015 -72.464676 20.035696 -72.455353 20.043606 -72.446236 20.051741 -72.437355 20.060087 -72.428696 20.068649 -72.420265 20.077412 -72.412079 20.086372 -72.404137 20.095104 -72.396805 20.095968 -72.394951 20.101379 -72.384048 20.107059 -72.373291 20.113003 -72.362686 20.119207 -72.352234 20.125668 -72.341957 20.132382 -72.331848 20.139347 -72.321922 20.146553 -72.312179 20.154003 -72.302651 20.161682 -72.293320 20.169592 -72.284203 20.177725 -72.275307 20.186073 -72.266640 20.194633 -72.258209 20.203396 -72.250015 20.212356 -72.242073 20.220743 -72.235016 20.221806 -72.232735 20.227217 -72.221825 20.232895 -72.211060 20.238840 -72.200447 20.245043 -72.189987 20.251505 -72.179695 20.258219 -72.169579 20.265181 -72.159645 20.272388 -72.149902 20.279835 -72.140358 20.287516 -72.131020 20.295425 -72.121902 20.303558 -72.112991 20.311907 -72.104317 20.320467 -72.095879 20.329227 -72.087685 20.338190 -72.079727 20.346216 -72.072975 20.347483 -72.070252 20.352896 -72.059334 20.358572 -72.048561 20.364515 -72.037933 20.370718 -72.027466 20.377180 -72.017166 20.383894 -72.007042 20.390860 -71.997101 20.398064 -71.987350 20.405512 -71.977799 20.413191 -71.968452 20.421099 -71.959320 20.429233 -71.950417 20.437580 -71.941734 20.446140 -71.933281 20.454903 -71.925072 20.463863 -71.917114 20.471535 -71.910652 20.473007 -71.907486 20.478420 -71.896568 20.484097 -71.885780 20.490040 -71.875145 20.496243 -71.864677 20.502703 -71.854362 20.509416 -71.844231 20.516380 -71.834282 20.523588 -71.824524 20.531034 -71.814964 20.538713 -71.805611 20.546623 -71.796471 20.554754 -71.787560 20.563103 -71.778870 20.571661 -71.770409 20.580422 -71.762192 20.589382 -71.754234 20.596699 -71.748055 20.598375 -71.744453 20.603786 -71.733513 20.609465 -71.722725 20.615406 -71.712082 20.621611 -71.701599 20.628071 -71.691277 20.634783 -71.681137 20.641745 -71.671173 20.648953 -71.661407 20.656399 -71.651848 20.664080 -71.642479 20.671988 -71.633339 20.680119 -71.624413 20.688467 -71.615715 20.697027 -71.607254 20.705786 -71.599037 20.714746 -71.591057 20.721706 -71.585190 20.723583 -71.581146 20.728994 -71.570206 20.734673 -71.559402 20.740614 -71.548752 20.746817 -71.538254 20.753277 -71.527931 20.759989 -71.517784 20.766953 -71.507813 20.774158 -71.498039 20.781605 -71.488464 20.789284 -71.479095 20.797194 -71.469948 20.805323 -71.461014 20.813671 -71.452301 20.822229 -71.443840 20.830992 -71.435608 20.837671 -71.429665 20.838741 -71.427200 20.843882 -71.416115 20.849295 -71.405167 20.854971 -71.394356 20.860912 -71.383690 20.867115 -71.373192 20.873573 -71.362862 20.880287 -71.352707 20.887249 -71.342728 20.894453 -71.332947 20.901899 -71.323364 20.909578 -71.313988 20.917486 -71.304825 20.925617 -71.295883 20.933966 -71.287178 20.942524 -71.278702 20.951284 -71.270462 20.960241 -71.262482 20.969389 -71.254745 20.978720 -71.247269 20.988226 -71.240051 20.997896 -71.233116 21.007729 -71.226440 21.017712 -71.220047 21.027838 -71.213936 21.038099 -71.208099 21.048487 -71.202561 21.058992 -71.197304 21.068323 -71.192940 21.068461 -71.192779 21.076590 -71.183838 21.084936 -71.175110 21.093494 -71.166634 21.102253 -71.158386 21.111212 -71.150398 21.120359 -71.142647 21.129688 -71.135170 21.139193 -71.127953 21.148865 -71.120995 21.158697 -71.114319 21.168678 -71.107918 21.178804 -71.101799 21.189066 -71.095962 21.199453 -71.090408 21.209959 -71.085152 21.220574 -71.080177 21.231291 -71.075500 21.242102 -71.071121 21.252993 -71.067032 21.258036 -71.065292 21.264393 -71.059311 21.273134 -71.051514 21.282061 -71.043968 21.291164 -71.036675 21.300442 -71.029640 21.309883 -71.022873 21.319479 -71.016380 21.329226 -71.010147 21.339113 -71.004211 21.349129 -70.998535 21.359272 -70.993149 21.369530 -70.988045 21.379892 -70.983231 21.390356 -70.978706 21.400909 -70.974472 21.411541 -70.970520 21.417475 -70.968498 21.418125 -70.967850 21.426455 -70.960014 21.434978 -70.952415 21.443682 -70.945068 21.452560 -70.937965 21.461613 -70.931122 21.470820 -70.924538 21.480183 -70.918221 21.489693 -70.912178 21.499336 -70.906403 21.509113 -70.900894 21.519009 -70.895676 21.529018 -70.890732 21.539129 -70.886070 21.549341 -70.881699 21.559635 -70.877602 21.570013 -70.873802 21.576975 -70.871460 21.580316 -70.868141 21.588434 -70.860512 21.596739 -70.853119 21.605221 -70.845963 21.613876 -70.839058 21.622698 -70.832405 21.631676 -70.826004 21.640806 -70.819862 21.650078 -70.813995 21.659483 -70.808388 21.669014 -70.803055 21.678665 -70.797989 21.688423 -70.793213 21.698284 -70.788712 21.700771 -70.787651 21.707808 -70.779450 21.715326 -70.771126 21.723049 -70.763031 21.730974 -70.755157 21.739090 -70.747521 21.747396 -70.740120 21.755877 -70.732956 21.764532 -70.726044 21.773354 -70.719376 21.782331 -70.712975 21.791460 -70.706825 21.800734 -70.700951 21.810137 -70.695343 21.819670 -70.690002 21.829321 -70.684937 21.839081 -70.680153 21.848940 -70.675636 21.858894 -70.671410 21.868937 -70.667458 21.879055 -70.663788 21.886747 -70.661232 21.893007 -70.655014 21.900906 -70.647575 21.908995 -70.640373 21.917255 -70.633408 21.925686 -70.626686 21.934278 -70.620209 21.943024 -70.613991 21.951921 -70.608032 21.960953 -70.602325 21.970119 -70.596893 21.979406 -70.591720 21.988811 -70.586815 21.998325 -70.582192 22.007934 -70.577835 22.017637 -70.573753 22.027420 -70.569962 22.037277 -70.566437 22.046074 -70.563560 22.047459 -70.562103 22.054960 -70.554642 22.062647 -70.547409 22.070515 -70.540413 22.078554 -70.533646 22.086762 -70.527115 22.095125 -70.520828 22.103643 -70.514801 22.112303 -70.509010 22.121101 -70.503487 22.130026 -70.498230 22.139070 -70.493225 22.148230 -70.488487 22.157494 -70.484024 22.162453 -70.481796 22.164312 -70.479362 22.171009 -70.471062 22.177914 -70.462967 22.185024 -70.455078 22.192333 -70.447388 22.199837 -70.439926 22.207521 -70.432686 22.215389 -70.425674 22.223429 -70.418900 22.231636 -70.412369 22.240002 -70.406074 22.248514 -70.400040 22.257177 -70.394241 22.265974 -70.388718 22.274899 -70.383446 22.283943 -70.378441 22.293102 -70.373703 22.302364 -70.369225 22.311724 -70.365028 22.321171 -70.361092 22.330700 -70.357437 22.340300 -70.354050 22.349962 -70.350945 22.359682 -70.348099 22.364407 -70.346855 22.365683 -70.345840 22.374048 -70.339539 22.382565 -70.333496 22.391224 -70.327705 22.400023 -70.322166 22.408945 -70.316895 22.417990 -70.311882 22.427149 -70.307137 22.436413 -70.302658 22.445770 -70.298454 22.455217 -70.294518 22.464747 -70.290855 22.474344 -70.287468 22.484007 -70.284355 22.493727 -70.281509 22.497866 -70.280426 22.499590 -70.279030 22.507917 -70.272674 22.516392 -70.266556 22.525005 -70.260674 22.533752 -70.255043 22.542624 -70.249664 22.551617 -70.244537 22.560719 -70.239670 22.569925 -70.235062 22.579228 -70.230705 22.588617 -70.226608 22.592184 -70.225166 22.598282 -70.219338 22.606321 -70.212044 22.614525 -70.204964 22.622887 -70.198113 22.631401 -70.191490 22.640062 -70.185104 22.648865 -70.178947 22.657799 -70.173042 22.666859 -70.167381 22.676039 -70.161964 22.685333 -70.156799 22.694731 -70.151886 22.704226 -70.147224 22.713814 -70.142822 22.723482 -70.138672 22.733232 -70.134788 22.743050 -70.131149 22.752932 -70.127777 22.762863 -70.124672 22.765204 -70.124001 22.773630 -70.117592 22.782341 -70.111275 22.791176 -70.105194 22.800133 -70.099327 22.809204 -70.093681 22.818388 -70.088265 22.827673 -70.083092 22.837055 -70.078140 22.846529 -70.073433 22.856089 -70.068947 22.859673 -70.067375 22.863026 -70.064255 22.871363 -70.056839 22.879850 -70.049629 22.888475 -70.042618 22.897242 -70.035828 22.906137 -70.029243 22.915159 -70.022865 22.924303 -70.016724 22.933565 -70.010788 22.942936 -70.005074 22.952415 -69.999596 22.961990 -69.994339 22.971662 -69.989311 22.981421 -69.984512 22.987944 -69.981491 22.994373 -69.975708 23.003050 -69.968239 23.011866 -69.960976 23.020817 -69.953903 23.029901 -69.947044 23.039112 -69.940399 23.048447 -69.933960 23.057894 -69.927734 23.067455 -69.921730 23.077122 -69.915939 23.086893 -69.910377 23.096760 -69.905029 23.106720 -69.899918 23.116764 -69.895027 23.126890 -69.890358 23.137093 -69.885925 23.147369 -69.881714 23.157707 -69.877739 23.168108 -69.873993 23.171312 -69.872917 23.172398 -69.872101 23.181625 -69.865456 23.190966 -69.859009 23.200419 -69.852753 23.209972 -69.846703 23.219627 -69.840843 23.229383 -69.835197 23.239231 -69.829743 23.249165 -69.824501 23.259052 -69.819527 23.259821 -69.818840 23.268751 -69.811188 23.277807 -69.803703 23.286987 -69.796410 23.296284 -69.789291 23.305702 -69.782371 23.315231 -69.775627 23.324871 -69.769074 23.334618 -69.762711 23.344469 -69.756554 23.354418 -69.750572 23.364466 -69.744804 23.373804 -69.739670 23.377575 -69.736275 23.386690 -69.728348 23.395933 -69.720604 23.405302 -69.713028 23.414787 -69.705635 23.424391 -69.698410 23.434109 -69.691376 23.443937 -69.684524 23.453878 -69.677864 23.463919 -69.671387 23.474066 -69.665100 23.484312 -69.659004 23.494652 -69.653099 23.505087 -69.647400 23.515612 -69.641891 23.526224 -69.636581 23.536919 -69.631470 23.547695 -69.626564 23.558546 -69.621864 23.569475 -69.617363 23.580471 -69.613075 23.591538 -69.609001 23.597403 -69.606957 23.599085 -69.605644 23.608688 -69.598419 23.618406 -69.591370 23.628235 -69.584511 23.638174 -69.577835 23.648214 -69.571350 23.658360 -69.565056 23.668606 -69.558945 23.678947 -69.553039 23.689381 -69.547325 23.699905 -69.541809 23.710516 -69.536491 23.721210 -69.531372 23.731987 -69.526466 23.742840 -69.521759 23.753767 -69.517250 23.764763 -69.512955 23.775827 -69.508865 23.781254 -69.506973 23.783316 -69.505363 23.792917 -69.498131 23.802635 -69.491074 23.812464 -69.484207 23.822401 -69.477516 23.832443 -69.471023 23.842588 -69.464714 23.852833 -69.458603 23.863173 -69.452683 23.873608 -69.446968 23.884132 -69.441437 23.894743 -69.436111 23.905436 -69.430992 23.916212 -69.426064 23.927063 -69.421356 23.937990 -69.416847 23.948988 -69.412544 23.960051 -69.408447 23.965046 -69.406708 23.967476 -69.404800 23.977076 -69.397560 23.986793 -69.390488 23.996622 -69.383606 24.006558 -69.376915 24.016598 -69.370407 24.026745 -69.364098 24.036987 -69.357971 24.047329 -69.352043 24.057762 -69.346306 24.068285 -69.340775 24.078896 -69.335442 24.089588 -69.330315 24.100363 -69.325386 24.111217 -69.320663 24.122143 -69.316147 24.133137 -69.311836 24.144201 -69.307739 24.148729 -69.306152 24.151564 -69.303932 24.161163 -69.296677 24.170879 -69.289596 24.180708 -69.282707 24.190645 -69.276009 24.200686 -69.269493 24.210831 -69.263168 24.221073 -69.257034 24.231413 -69.251099 24.241846 -69.245361 24.252369 -69.239815 24.262980 -69.234474 24.273670 -69.229332 24.284445 -69.224396 24.295298 -69.219673 24.306221 -69.215141 24.317217 -69.210831 24.328281 -69.206718 24.332394 -69.205276 24.335583 -69.202774 24.345182 -69.195503 24.354899 -69.188415 24.364725 -69.181519 24.374662 -69.174805 24.384703 -69.168274 24.394848 -69.161942 24.405088 -69.155800 24.415428 -69.149857 24.425861 -69.144112 24.436384 -69.138557 24.446995 -69.133209 24.457687 -69.128067 24.468462 -69.123123 24.479309 -69.118378 24.490236 -69.113854 24.501228 -69.109528 24.505327 -69.108002 24.514782 -69.100563 24.524384 -69.093277 24.534098 -69.086182 24.543926 -69.079269 24.553862 -69.072548 24.563902 -69.066010 24.574045 -69.059669 24.584288 -69.053520 24.594626 -69.047562 24.605059 -69.041809 24.615580 -69.036247 24.626188 -69.030891 24.636881 -69.025734 24.647656 -69.020790 24.658504 -69.016045 24.669430 -69.011497 24.680424 -69.007179 24.691486 -69.003052 24.702612 -68.999145 24.713799 -68.995453 24.725042 -68.991966 24.736338 -68.988701 24.747686 -68.985649 24.759083 -68.982811 24.770519 -68.980194 24.781996 -68.977798 24.793510 -68.975616 24.801254 -68.974304 24.803038 -68.973679 24.814224 -68.969978 24.825466 -68.966499 24.836763 -68.963226 24.848110 -68.960175 24.859505 -68.957329 24.870943 -68.954712 24.882420 -68.952309 24.893934 -68.950134 24.901529 -68.948845 24.903458 -68.948166 24.914642 -68.944466 24.925884 -68.940971 24.937181 -68.937698 24.948530 -68.934639 24.959921 -68.931801 24.971359 -68.929176 24.982838 -68.926773 24.994351 -68.924591 25.001888 -68.923309 25.003872 -68.922607 25.015057 -68.918907 25.026299 -68.915413 25.037596 -68.912132 25.048944 -68.909073 25.060337 -68.906235 25.071773 -68.903603 25.083252 -68.901199 25.094765 -68.899017 25.098190 -68.898430 25.102592 -68.896881 25.113779 -68.893173 25.125019 -68.889679 25.136316 -68.886398 25.147661 -68.883339 25.159056 -68.880493 25.170494 -68.877861 25.181971 -68.875458 25.193483 -68.873268 25.205029 -68.871307 25.216604 -68.869553 25.228205 -68.868034 25.239830 -68.866737 25.251473 -68.865654 25.263132 -68.864800 25.274799 -68.864166 25.286476 -68.863762 25.298160 -68.863579 25.309843 -68.863617 25.321526 -68.863884 25.333202 -68.864380 25.344868 -68.865089 25.348394 -68.865372 25.351881 -68.865051 25.363541 -68.864197 25.375210 -68.863556 25.386889 -68.863159 25.398571 -68.862968 25.410253 -68.863014 25.421934 -68.863281 25.433611 -68.863770 25.445276 -68.864479 25.456928 -68.865425 25.468565 -68.866585 25.480181 -68.867973 25.491772 -68.869583 25.503336 -68.871414 25.514870 -68.873466 25.526369 -68.875748 25.537830 -68.878242 25.549250 -68.880966 25.560625 -68.883903 25.571953 -68.887062 25.583227 -68.890442 25.594446 -68.894035 25.605608 -68.897842 25.616707 -68.901871 25.627741 -68.906105 25.638704 -68.910561 25.649597 -68.915215 25.660414 -68.920090 25.671150 -68.925163 25.681807 -68.930450 25.692377 -68.935951 25.702860 -68.941650 25.713249 -68.947540 25.723543 -68.953644 25.733738 -68.959938 25.743835 -68.966438 25.753824 -68.973122 25.763706 -68.980003 25.773478 -68.987076 25.783138 -68.994331 25.792679 -69.001778 25.802101 -69.009407 25.811403 -69.017220 25.820578 -69.025208 25.829624 -69.033379 25.838539 -69.041725 25.847323 -69.050232 25.855969 -69.058922 25.864475 -69.067764 25.872841 -69.076782 25.873682 -69.077736 25.879070 -69.082436 25.887209 -69.089798 25.895231 -69.097305 25.903132 -69.104980 25.904232 -69.106087 25.909950 -69.106674 25.917210 -69.107559 25.924452 -69.108581 25.931677 -69.109756 25.938881 -69.111061 25.946068 -69.112495 25.953226 -69.114082 25.960362 -69.115807 25.967468 -69.117661 25.974543 -69.119660 25.981585 -69.121796 25.988594 -69.124062 25.995564 -69.126465 26.002499 -69.128998 26.009388 -69.131668 26.016237 -69.134476 26.023037 -69.137413 26.029793 -69.140480 26.036499 -69.143684 26.043152 -69.147011 26.049753 -69.150467 26.056297 -69.154053 26.062786 -69.157761 26.069212 -69.161591 26.075579 -69.165558 26.081883 -69.169640 26.088118 -69.173843 26.094288 -69.178162 26.100389 -69.182609 26.106417 -69.187172 26.112375 -69.191849 26.118258 -69.196640 26.124063 -69.201546 26.129789 -69.206566 26.135435 -69.211693 26.141003 -69.216934 26.146482 -69.222275 26.151876 -69.227722 26.157188 -69.233276 26.162409 -69.238930 26.167540 -69.244690 26.172579 -69.250549 26.177525 -69.256500 26.182375 -69.262550 26.187130 -69.268692 26.191786 -69.274918 26.196344 -69.281242 26.200802 -69.287659 26.205158 -69.294151 26.209410 -69.300735 26.213558 -69.307388 26.217602 -69.314133 26.221533 -69.320953 26.225361 -69.327850 26.229078 -69.334816 26.232685 -69.341858 26.236181 -69.348968 26.239561 -69.356140 26.242830 -69.363380 26.245983 -69.370689 26.249021 -69.378052 26.251944 -69.385468 26.254745 -69.392944 26.257433 -69.400474 26.259996 -69.408058 26.262442 -69.415688 26.264765 -69.423363 26.266970 -69.431084 26.269051 -69.438843 26.271007 -69.446655 26.272842 -69.454483 26.274553 -69.462364 26.276136 -69.470261 26.276775 -69.473732 26.287405 -69.477707 26.299293 -69.482597 26.311152 -69.487946 26.322958 -69.493744 26.334688 -69.500000 26.346315 -69.506706 26.357815 -69.513878 26.369165 -69.521477 26.380335 -69.529526 26.391304 -69.538010 26.402050 -69.546928 26.412544 -69.556259 26.422768 -69.565994 26.432695 -69.576126 26.442305 -69.586639 26.451576 -69.597519 26.460486 -69.608749 26.469013 -69.620323 26.477140 -69.632202 26.484850 -69.644386 26.492121 -69.656845 26.498936 -69.669563 26.505281 -69.682510 26.511143 -69.695671 26.516506 -69.709023 26.521355 -69.722527 26.525681 -69.736183 26.529474 -69.749939 26.532724 -69.763794 26.535419 -69.777695 26.537559 -69.791641 26.539135 -69.805580 26.540142 -69.819496 + + + + + + + + + + + 14.537895 -63.266724 14.537834 -63.277012 14.537489 -63.287270 14.536867 -63.297482 14.535970 -63.307652 14.534803 -63.317753 14.533376 -63.327793 14.531691 -63.337749 14.529754 -63.347622 14.527576 -63.357403 14.525163 -63.367081 14.522519 -63.376648 14.519659 -63.386101 14.516584 -63.395432 14.513305 -63.404640 14.509831 -63.413712 14.509700 -63.414032 14.510077 -63.416790 14.511066 -63.425873 14.511805 -63.434967 14.512293 -63.444050 14.512538 -63.453125 14.512540 -63.462185 14.512306 -63.471214 14.511837 -63.480209 14.511138 -63.489162 14.510216 -63.498062 14.509072 -63.506901 14.507712 -63.515678 14.506145 -63.524387 14.504375 -63.533012 14.502406 -63.541557 14.500246 -63.550007 14.497901 -63.558365 14.495378 -63.566616 14.493466 -63.572399 14.494184 -63.575756 14.495691 -63.583885 14.496978 -63.592041 14.498043 -63.600208 14.498890 -63.608391 14.499518 -63.616573 14.499935 -63.624748 14.500136 -63.632912 14.500132 -63.641052 14.499921 -63.649174 14.499510 -63.657261 14.498899 -63.665306 14.498095 -63.673305 14.497097 -63.681255 14.495919 -63.689144 14.494558 -63.696972 14.493021 -63.704739 14.491315 -63.712421 14.489444 -63.720032 14.487411 -63.727558 14.485228 -63.734997 14.482895 -63.742344 14.480421 -63.749600 14.480251 -63.750065 14.480920 -63.752869 14.482443 -63.760082 14.483773 -63.767323 14.484916 -63.774574 14.485873 -63.781845 14.486644 -63.789124 14.487229 -63.796398 14.487632 -63.803673 14.487858 -63.810924 14.487904 -63.818172 14.487777 -63.825394 14.487478 -63.832584 14.487014 -63.839745 14.486381 -63.846867 14.485590 -63.853943 14.484640 -63.860970 14.483536 -63.867943 14.482284 -63.874870 14.480887 -63.881729 14.479347 -63.888523 14.477672 -63.895252 14.475865 -63.901913 14.473932 -63.908497 14.471876 -63.914997 14.469705 -63.921425 14.467418 -63.927769 14.465026 -63.934032 14.462531 -63.940208 14.459939 -63.946293 14.457790 -63.951092 14.458524 -63.954449 14.459697 -63.960495 14.460730 -63.966553 14.461621 -63.972618 14.462373 -63.978695 14.462985 -63.984768 14.463462 -63.990841 14.463803 -63.996906 14.464010 -64.002960 14.464087 -64.009010 14.464032 -64.015030 14.463851 -64.021034 14.463544 -64.027016 14.463114 -64.032959 14.462564 -64.038887 14.461894 -64.044769 14.461110 -64.050629 14.460214 -64.056427 14.459210 -64.062202 14.458097 -64.067925 14.456881 -64.073601 14.455564 -64.079231 14.454150 -64.084808 14.452640 -64.090332 14.451039 -64.095810 14.449352 -64.101219 14.447578 -64.106583 14.445722 -64.111885 14.443788 -64.117126 14.442673 -64.120003 14.443794 -64.123779 14.445187 -64.128899 14.446471 -64.134025 14.447645 -64.139183 14.448707 -64.144348 14.449659 -64.149536 14.450501 -64.154724 14.451238 -64.159912 14.451864 -64.165123 14.452385 -64.170326 14.452798 -64.175522 14.453109 -64.180717 14.453316 -64.185913 14.453420 -64.191086 14.453422 -64.196259 14.453325 -64.201416 14.453130 -64.206551 14.452839 -64.211677 14.452454 -64.216766 14.451973 -64.221847 14.451403 -64.226898 14.450742 -64.231926 14.449992 -64.236923 14.449158 -64.241890 14.448239 -64.246826 14.447237 -64.251732 14.446156 -64.256599 14.444995 -64.261429 14.443757 -64.266228 14.442445 -64.270988 14.441060 -64.275703 14.439604 -64.280388 14.438079 -64.285027 14.436487 -64.289627 14.434830 -64.294182 14.433110 -64.298698 14.432128 -64.301155 14.433030 -64.303390 14.434640 -64.307579 14.436178 -64.311790 14.437644 -64.316032 14.439037 -64.320305 14.440357 -64.324600 14.441606 -64.328911 14.442779 -64.333244 14.443878 -64.337601 14.444904 -64.341980 14.445853 -64.346382 14.446730 -64.350792 14.447531 -64.355217 14.448255 -64.359657 14.448905 -64.364105 14.449477 -64.368568 14.449974 -64.373047 14.450394 -64.377525 14.450739 -64.382011 14.451009 -64.386505 14.451199 -64.390999 14.451312 -64.395500 14.451353 -64.400002 14.451312 -64.404503 14.451199 -64.409004 14.451009 -64.413498 14.450739 -64.417992 14.450394 -64.422478 14.449974 -64.426964 14.449477 -64.431435 14.448905 -64.435905 14.448255 -64.440346 14.447531 -64.444786 14.446730 -64.449211 14.445853 -64.453628 14.444904 -64.458023 14.443878 -64.462402 14.442779 -64.466759 14.441606 -64.471100 14.440357 -64.475410 14.439037 -64.479706 14.437644 -64.483971 14.436177 -64.488213 14.434640 -64.492432 14.433030 -64.496612 14.431350 -64.500778 14.429600 -64.504898 14.427777 -64.508995 14.425887 -64.513062 14.423928 -64.517082 14.421900 -64.521080 14.419806 -64.525040 14.417644 -64.528954 14.415415 -64.532829 14.413120 -64.536659 14.410762 -64.540459 14.408337 -64.544205 14.405850 -64.547920 14.403299 -64.551575 14.400689 -64.555199 14.398017 -64.558762 14.395283 -64.562279 14.392489 -64.565758 14.389638 -64.569176 14.386729 -64.572540 14.383763 -64.575859 14.380741 -64.579117 14.377665 -64.582329 14.374478 -64.585419 14.371140 -64.588348 14.367649 -64.591087 14.364022 -64.593643 14.360259 -64.596008 14.356371 -64.598183 14.352367 -64.600151 14.348253 -64.601914 14.344039 -64.603470 14.339735 -64.604813 14.335348 -64.605949 14.330890 -64.606865 14.326366 -64.607559 14.321789 -64.608040 14.317166 -64.608292 14.312509 -64.608330 14.307826 -64.608147 14.303125 -64.607742 14.298418 -64.607117 14.293712 -64.606277 14.289017 -64.605225 14.284343 -64.603958 14.279698 -64.602493 14.275091 -64.600807 14.270532 -64.598930 14.266025 -64.596855 14.261585 -64.594589 14.257214 -64.592133 14.252923 -64.589500 14.248718 -64.586693 14.244606 -64.583717 14.240596 -64.580582 14.236692 -64.577293 14.232901 -64.573860 14.229228 -64.570282 14.225677 -64.566574 14.222256 -64.562752 14.218967 -64.558815 14.215817 -64.554771 14.212809 -64.550629 14.209942 -64.546402 14.207223 -64.542099 14.204652 -64.537735 14.202231 -64.533302 14.199964 -64.528824 14.197850 -64.524315 14.195889 -64.519760 14.194082 -64.515198 14.192427 -64.510628 14.190926 -64.506050 14.189573 -64.501480 14.188368 -64.496933 14.187312 -64.492401 14.186399 -64.487915 14.185626 -64.483475 14.184989 -64.479080 14.184486 -64.474754 14.184111 -64.470497 14.183860 -64.466309 14.183728 -64.462212 14.183708 -64.458206 14.183796 -64.454300 14.183986 -64.450508 14.184269 -64.446815 14.184642 -64.443245 14.185094 -64.439796 14.185620 -64.436470 14.186215 -64.433281 14.186868 -64.430229 14.187572 -64.427315 14.188319 -64.424545 14.189101 -64.421921 14.189912 -64.419449 14.190740 -64.417130 14.191581 -64.414948 14.192422 -64.412926 14.193258 -64.411064 14.194081 -64.409348 14.194210 -64.409096 14.192409 -64.407143 14.189176 -64.403404 14.186077 -64.399567 14.183111 -64.395645 14.180282 -64.391647 14.177590 -64.387588 14.175040 -64.383461 14.172630 -64.379288 14.170364 -64.375069 14.168243 -64.370819 14.166264 -64.366539 14.164428 -64.362251 14.162733 -64.357964 14.161180 -64.353668 14.159767 -64.349388 14.158490 -64.345131 14.157350 -64.340897 14.156340 -64.336701 14.155456 -64.332550 14.154701 -64.328453 14.154067 -64.324409 14.153548 -64.320435 14.153141 -64.316536 14.152841 -64.312721 14.152644 -64.308983 14.152541 -64.305351 14.152529 -64.301811 14.152600 -64.298378 14.152750 -64.295059 14.152970 -64.291847 14.153255 -64.288750 14.153596 -64.285790 14.153987 -64.282944 14.154421 -64.280228 14.154888 -64.277649 14.155386 -64.275200 14.155904 -64.272888 14.156433 -64.270706 14.156966 -64.268669 14.157498 -64.266769 14.158018 -64.265015 14.158033 -64.264969 14.156244 -64.263054 14.153011 -64.259384 14.149907 -64.255630 14.146935 -64.251816 14.144093 -64.247940 14.141382 -64.244019 14.138806 -64.240059 14.136365 -64.236061 14.134055 -64.232048 14.131878 -64.228012 14.129835 -64.223961 14.127920 -64.219917 14.126136 -64.215881 14.124477 -64.211861 14.122941 -64.207863 14.121527 -64.203896 14.120233 -64.199959 14.119051 -64.196075 14.117982 -64.192245 14.117019 -64.188461 14.116157 -64.184753 14.115393 -64.181114 14.114720 -64.177551 14.114135 -64.174072 14.113631 -64.170670 14.113202 -64.167374 14.112845 -64.164162 14.112549 -64.161057 14.112310 -64.158058 14.112122 -64.155151 14.111979 -64.152367 14.111872 -64.149696 14.111795 -64.147133 14.111744 -64.144692 14.111709 -64.142365 14.111683 -64.140160 14.111660 -64.138069 14.111632 -64.136101 14.111596 -64.134247 14.111541 -64.132523 14.111461 -64.130898 14.111349 -64.129394 14.111201 -64.128014 14.111010 -64.126732 14.110766 -64.125565 14.110467 -64.124504 14.110107 -64.123543 14.109678 -64.122673 14.109177 -64.121910 14.108598 -64.121239 14.107980 -64.120590 14.107365 -64.119949 14.106751 -64.119308 14.106143 -64.118660 14.105537 -64.118004 14.104935 -64.117340 14.104335 -64.116676 14.103738 -64.116013 14.103143 -64.115334 14.102552 -64.114655 14.101963 -64.113960 14.101377 -64.113266 14.100794 -64.112564 14.100214 -64.111855 14.099638 -64.111137 14.099064 -64.110413 14.098494 -64.109680 14.097929 -64.108932 14.097366 -64.108192 14.096806 -64.107422 14.096255 -64.106651 14.095707 -64.105873 14.095164 -64.105087 14.094626 -64.104286 14.094094 -64.103478 14.093570 -64.102653 14.093051 -64.101814 14.092541 -64.100975 14.092038 -64.100113 14.091541 -64.099251 14.091056 -64.098373 14.090580 -64.097481 14.090113 -64.096580 14.089656 -64.095665 14.089211 -64.094734 14.088777 -64.093788 14.088355 -64.092842 14.087947 -64.091881 14.087551 -64.090904 14.087170 -64.089920 14.086803 -64.088913 14.086452 -64.087914 14.086118 -64.086884 14.085798 -64.085854 14.085497 -64.084808 14.085215 -64.083756 14.084949 -64.082695 14.084703 -64.081619 14.084476 -64.080536 14.084271 -64.079445 14.084086 -64.078339 14.083923 -64.077232 14.083782 -64.076118 14.083662 -64.074997 14.083567 -64.073868 14.083494 -64.072731 14.083446 -64.071594 14.083422 -64.070450 14.083424 -64.069298 14.083448 -64.068146 14.083501 -64.066994 14.083513 -64.066818 14.082311 -64.064079 14.080791 -64.060432 14.079367 -64.056824 14.078036 -64.053276 14.076794 -64.049782 14.075636 -64.046364 14.074556 -64.042999 14.073549 -64.039719 14.072612 -64.036514 14.071736 -64.033394 14.070920 -64.030350 14.070153 -64.027405 14.069432 -64.024544 14.068749 -64.021774 14.068101 -64.019104 14.067480 -64.016525 14.066879 -64.014053 14.066295 -64.011681 14.065718 -64.009399 14.065143 -64.007225 14.064565 -64.005142 14.063975 -64.003166 14.063372 -64.001282 14.062745 -63.999500 14.062092 -63.997814 14.061402 -63.996223 14.060676 -63.994721 14.059904 -63.993305 14.059084 -63.991974 14.058207 -63.990723 14.057270 -63.989555 14.056271 -63.988457 14.055239 -63.987396 14.054210 -63.986332 14.053184 -63.985260 14.052159 -63.984188 14.051139 -63.983109 14.050119 -63.982018 14.049101 -63.980923 14.048085 -63.979824 14.047071 -63.978710 14.046057 -63.977589 14.045046 -63.976463 14.044034 -63.975323 14.043026 -63.974167 14.042020 -63.973007 14.041015 -63.971832 14.040012 -63.970642 14.039012 -63.969440 14.038015 -63.968220 14.037022 -63.966988 14.036031 -63.965740 14.035047 -63.964470 14.034066 -63.963184 14.033091 -63.961880 14.032125 -63.960564 14.031164 -63.959217 14.030210 -63.957859 14.029267 -63.956478 14.028334 -63.955070 14.027411 -63.953652 14.026499 -63.952202 14.025598 -63.950733 14.024714 -63.949245 14.023845 -63.947727 14.022989 -63.946190 14.022151 -63.944633 14.021333 -63.943050 14.020533 -63.941444 14.019753 -63.939812 14.018995 -63.938160 14.018262 -63.936485 14.017552 -63.934784 14.016868 -63.933064 14.016210 -63.931320 14.015580 -63.929562 14.014980 -63.927769 14.014411 -63.925961 14.013874 -63.924137 14.013370 -63.922287 14.012898 -63.920422 14.012464 -63.918537 14.012066 -63.916630 14.011706 -63.914719 14.011384 -63.912777 14.011103 -63.910832 14.010862 -63.908871 14.010665 -63.906899 14.010510 -63.904911 14.010398 -63.902916 14.010332 -63.900906 14.010312 -63.898899 14.010338 -63.896877 14.010410 -63.894856 14.010531 -63.892834 14.010700 -63.890804 14.010919 -63.888775 14.011188 -63.886753 14.011505 -63.884728 14.011872 -63.882713 14.012292 -63.880695 14.012762 -63.878696 14.013282 -63.876701 14.013854 -63.874722 14.014478 -63.872745 14.015150 -63.870792 14.015875 -63.868854 14.016651 -63.866928 14.017478 -63.865028 14.018353 -63.863144 14.019280 -63.861286 14.020255 -63.859455 14.021278 -63.857643 14.022351 -63.855869 14.023167 -63.854595 14.023042 -63.854332 14.022124 -63.852550 14.021172 -63.850857 14.020178 -63.849243 14.019138 -63.847721 14.018045 -63.846264 14.016897 -63.844894 14.015689 -63.843590 14.014448 -63.842320 14.013207 -63.841042 14.011964 -63.839771 14.010720 -63.838493 14.009473 -63.837215 14.008222 -63.835926 14.006968 -63.834641 14.005712 -63.833344 14.004450 -63.832039 14.003186 -63.830719 14.001916 -63.829403 14.000642 -63.828064 13.999366 -63.826717 13.998084 -63.825359 13.996800 -63.823978 13.995512 -63.822586 13.994221 -63.821178 13.992929 -63.819752 13.991633 -63.818302 13.990337 -63.816833 13.989041 -63.815338 13.987746 -63.813824 13.986453 -63.812286 13.985163 -63.810722 13.983875 -63.809132 13.982592 -63.807510 13.981317 -63.805866 13.980047 -63.804192 13.978786 -63.802483 13.977536 -63.800751 13.976297 -63.798981 13.975072 -63.797184 13.973861 -63.795353 13.972668 -63.793488 13.971491 -63.791592 13.970334 -63.789658 13.969199 -63.787697 13.968088 -63.785694 13.967001 -63.783669 13.965941 -63.781597 13.964911 -63.779499 13.963912 -63.777363 13.962945 -63.775196 13.962011 -63.773006 13.961116 -63.770771 13.960258 -63.768509 13.959440 -63.766216 13.958664 -63.763893 13.957933 -63.761543 13.957246 -63.759167 13.956606 -63.756763 13.956017 -63.754330 13.955477 -63.751873 13.954990 -63.749401 13.954558 -63.746899 13.954181 -63.744381 13.953860 -63.741840 13.953598 -63.739285 13.953397 -63.736717 13.953256 -63.734135 13.953177 -63.731541 13.953161 -63.728943 13.953212 -63.726334 13.953326 -63.723717 13.953507 -63.721104 13.953755 -63.718487 13.954071 -63.715870 13.954455 -63.713253 13.954909 -63.710651 13.955432 -63.708057 13.956024 -63.705467 13.956410 -63.703964 13.954864 -63.702373 13.953197 -63.700661 13.951526 -63.698940 13.949850 -63.697212 13.948169 -63.695477 13.946482 -63.693722 13.944789 -63.691959 13.943091 -63.690174 13.941389 -63.688377 13.939682 -63.686569 13.937969 -63.684731 13.936252 -63.682873 13.934530 -63.680996 13.932806 -63.679089 13.931080 -63.677162 13.929353 -63.675205 13.927625 -63.673218 13.925899 -63.671196 13.924174 -63.669144 13.922453 -63.667061 13.920736 -63.664936 13.919026 -63.662781 13.917324 -63.660587 13.915633 -63.658352 13.913953 -63.656078 13.912285 -63.653771 13.910634 -63.651413 13.908999 -63.649017 13.907385 -63.646572 13.905793 -63.644085 13.904224 -63.641560 13.902682 -63.638985 13.901170 -63.636368 13.899688 -63.633705 13.898238 -63.630993 13.896826 -63.628239 13.895452 -63.625439 13.894119 -63.622597 13.892830 -63.619709 13.891586 -63.616779 13.890391 -63.613808 13.889248 -63.610794 13.888158 -63.607735 13.887123 -63.604641 13.886146 -63.601505 13.885231 -63.598335 13.884378 -63.595135 13.883593 -63.591888 13.882874 -63.588615 13.882223 -63.585320 13.881647 -63.581985 13.881144 -63.578625 13.880717 -63.575245 13.880366 -63.571842 13.880097 -63.568413 13.879911 -63.564972 13.879806 -63.561516 13.879785 -63.558052 13.879851 -63.554569 13.880003 -63.551086 13.880244 -63.547604 13.880312 -63.546886 13.879035 -63.545517 13.876887 -63.543198 13.874737 -63.540848 13.872582 -63.538471 13.870423 -63.536060 13.868265 -63.533608 13.866105 -63.531128 13.863948 -63.528599 13.861792 -63.526039 13.859640 -63.523430 13.857495 -63.520779 13.855357 -63.518089 13.853231 -63.515343 13.851115 -63.512550 13.849015 -63.509708 13.846931 -63.506821 13.844868 -63.503876 13.842826 -63.500877 13.840807 -63.497829 13.838817 -63.494724 13.836857 -63.491562 13.834930 -63.488342 13.833037 -63.485073 13.831186 -63.481747 13.829375 -63.478359 13.827610 -63.474914 13.825891 -63.471416 13.824226 -63.467865 13.822614 -63.464260 13.821059 -63.460598 13.819566 -63.456882 13.818135 -63.453114 13.816772 -63.449295 13.815480 -63.445431 13.814259 -63.441517 13.813115 -63.437553 13.812050 -63.433544 13.811067 -63.429493 13.810168 -63.425411 13.809355 -63.421276 13.808634 -63.417118 13.808005 -63.412926 13.807471 -63.408695 13.807034 -63.404442 13.806698 -63.400158 13.806462 -63.395863 13.806332 -63.391541 13.806306 -63.387207 13.806387 -63.382866 13.806578 -63.378506 13.806880 -63.374149 13.807292 -63.369793 13.807818 -63.365433 13.808458 -63.361084 13.809215 -63.356747 13.810084 -63.352421 13.811069 -63.348114 13.812172 -63.343830 13.812628 -63.342235 13.811773 -63.340942 13.809783 -63.337833 13.807822 -63.334679 13.805896 -63.331459 13.804005 -63.328190 13.802152 -63.324856 13.800341 -63.321476 13.798575 -63.318031 13.796858 -63.314537 13.795192 -63.310986 13.793580 -63.307377 13.792026 -63.303715 13.790532 -63.299999 13.789102 -63.296238 13.787738 -63.292419 13.786446 -63.288547 13.785225 -63.284634 13.784082 -63.280670 13.783015 -63.276669 13.782033 -63.272617 13.781134 -63.268528 13.780321 -63.264400 13.779600 -63.260242 13.778972 -63.256042 13.778438 -63.251820 13.778000 -63.247566 13.777664 -63.243282 13.777429 -63.238987 13.777298 -63.234669 13.777271 -63.230331 13.777354 -63.225990 13.777544 -63.221638 13.777844 -63.217281 13.778259 -63.212921 13.778784 -63.208565 13.779425 -63.204216 13.780179 -63.199879 13.781050 -63.195553 13.781590 -63.193192 13.779580 -63.190151 13.777590 -63.187050 13.775629 -63.183887 13.773702 -63.180672 13.771811 -63.177399 13.769958 -63.174072 13.768147 -63.170685 13.766382 -63.167248 13.764665 -63.163754 13.762999 -63.160202 13.761387 -63.156593 13.759832 -63.152931 13.758339 -63.149216 13.756907 -63.145454 13.755545 -63.141636 13.754251 -63.137772 13.753032 -63.133858 13.751887 -63.129894 13.750821 -63.125885 13.749839 -63.121841 13.748940 -63.117752 13.748128 -63.113624 13.747406 -63.109459 13.746778 -63.105267 13.746244 -63.101044 13.745807 -63.096790 13.745471 -63.092514 13.745234 -63.088211 13.745104 -63.083893 13.745078 -63.079563 13.745161 -63.075218 13.745351 -63.070862 13.745651 -63.066506 13.746065 -63.062145 13.746591 -63.057797 13.747231 -63.053444 13.747986 -63.049107 13.748856 -63.044785 13.748957 -63.044346 13.748218 -63.043266 13.746203 -63.040215 13.744211 -63.037113 13.742251 -63.033951 13.740323 -63.030735 13.738433 -63.027462 13.736579 -63.024136 13.734770 -63.020756 13.733004 -63.017311 13.731286 -63.013817 13.729620 -63.010269 13.728008 -63.006664 13.726454 -63.003002 13.724960 -62.999287 13.723530 -62.995525 13.722167 -62.991707 13.720873 -62.987839 13.719653 -62.983929 13.718510 -62.979965 13.717443 -62.975964 13.716460 -62.971912 13.715562 -62.967827 13.714749 -62.963703 13.714027 -62.959538 13.713399 -62.955341 13.712865 -62.951122 13.712428 -62.946865 13.712092 -62.942589 13.711857 -62.938286 13.711725 -62.933971 13.711699 -62.929642 13.711783 -62.925297 13.711972 -62.920944 13.712274 -62.916588 13.712687 -62.912231 13.713212 -62.907879 13.713853 -62.903530 13.714607 -62.899193 13.715478 -62.894867 13.715551 -62.894547 13.714749 -62.893372 13.712731 -62.890320 13.710742 -62.887218 13.708781 -62.884056 13.706854 -62.880844 13.704964 -62.877575 13.703110 -62.874248 13.701300 -62.870861 13.699534 -62.867424 13.697816 -62.863926 13.696151 -62.860374 13.694538 -62.856770 13.692984 -62.853115 13.691490 -62.849400 13.690060 -62.845634 13.688697 -62.841820 13.687404 -62.837952 13.686183 -62.834038 13.685039 -62.830078 13.683973 -62.826073 13.682990 -62.822029 13.682092 -62.817940 13.681279 -62.813816 13.680558 -62.809654 13.679930 -62.805462 13.679396 -62.801239 13.678959 -62.796986 13.678622 -62.792709 13.678386 -62.788414 13.678255 -62.784096 13.678230 -62.779758 13.678312 -62.775421 13.678502 -62.771072 13.678803 -62.766712 13.679216 -62.762356 13.679742 -62.757999 13.680383 -62.753654 13.681138 -62.749317 13.682008 -62.744995 13.682054 -62.744793 13.681188 -62.743526 13.679170 -62.740479 13.677179 -62.737370 13.675219 -62.734215 13.673291 -62.730999 13.671401 -62.727726 13.669548 -62.724400 13.667737 -62.721020 13.665972 -62.717575 13.664254 -62.714089 13.662589 -62.710533 13.660976 -62.706928 13.659421 -62.703274 13.657929 -62.699558 13.656498 -62.695797 13.655134 -62.691978 13.653842 -62.688110 13.652621 -62.684197 13.651477 -62.680244 13.650412 -62.676239 13.649428 -62.672192 13.648530 -62.668106 13.647717 -62.663979 13.646995 -62.659821 13.646367 -62.655628 13.645833 -62.651405 13.645396 -62.647152 13.645060 -62.642876 13.644824 -62.638580 13.644693 -62.634262 13.644668 -62.629932 13.644750 -62.625587 13.644940 -62.621239 13.645241 -62.616879 13.645654 -62.612530 13.646181 -62.608170 13.646820 -62.603828 13.647575 -62.599491 13.648446 -62.595165 13.648465 -62.595081 13.647533 -62.593719 13.645515 -62.590671 13.643527 -62.587563 13.641565 -62.584408 13.639639 -62.581192 13.637747 -62.577927 13.635895 -62.574600 13.634083 -62.571220 13.632318 -62.567776 13.630600 -62.564285 13.628934 -62.560734 13.627322 -62.557129 13.625767 -62.553467 13.624274 -62.549759 13.622845 -62.545994 13.621481 -62.542179 13.620189 -62.538319 13.618968 -62.534405 13.617823 -62.530445 13.616758 -62.526440 13.615775 -62.522396 13.614876 -62.518314 13.614063 -62.514187 13.613342 -62.510029 13.612713 -62.505833 13.612180 -62.501614 13.611743 -62.497356 13.611406 -62.493084 13.611171 -62.488785 13.611039 -62.484470 13.611014 -62.480141 13.611096 -62.475803 13.611286 -62.471451 13.611588 -62.467094 13.612001 -62.462734 13.612527 -62.458385 13.613167 -62.454040 13.613921 -62.449703 13.614785 -62.445412 13.613789 -62.443955 13.611772 -62.440907 13.609780 -62.437805 13.607821 -62.434643 13.605893 -62.431435 13.604002 -62.428162 13.602148 -62.424835 13.600338 -62.421455 13.598572 -62.418018 13.596855 -62.414520 13.595189 -62.410976 13.593576 -62.407372 13.592023 -62.403709 13.590529 -62.400002 13.589099 -62.396236 13.587736 -62.392426 13.586443 -62.388561 13.585221 -62.384647 13.584078 -62.380692 13.583013 -62.376690 13.582029 -62.372639 13.581130 -62.368553 13.580319 -62.364430 13.579597 -62.360275 13.578968 -62.356083 13.578434 -62.351860 13.578099 -62.348606 13.577150 -62.347557 13.574781 -62.344894 13.572414 -62.342174 13.570052 -62.339397 13.567698 -62.336567 13.565353 -62.333679 13.563023 -62.330730 13.560708 -62.327717 13.558414 -62.324642 13.556142 -62.321506 13.553896 -62.318306 13.551680 -62.315041 13.549497 -62.311714 13.547349 -62.308311 13.545242 -62.304848 13.543180 -62.301319 13.541165 -62.297726 13.539203 -62.294064 13.537292 -62.290337 13.535442 -62.286545 13.533655 -62.282692 13.531934 -62.278771 13.530283 -62.274795 13.528706 -62.270760 13.527205 -62.266663 13.525786 -62.262508 13.524451 -62.258301 13.523205 -62.254047 13.522051 -62.249737 13.520990 -62.245380 13.520028 -62.240978 13.519167 -62.236542 13.518410 -62.232060 13.517759 -62.227547 13.517464 -62.225060 13.516328 -62.223858 13.513720 -62.221027 13.511114 -62.218140 13.508517 -62.215183 13.505932 -62.212158 13.503360 -62.209057 13.500807 -62.205887 13.498274 -62.202641 13.495768 -62.199329 13.493294 -62.195934 13.490853 -62.192467 13.488450 -62.188919 13.486091 -62.185299 13.483778 -62.181606 13.481517 -62.177830 13.479311 -62.173981 13.477164 -62.170055 13.475084 -62.166061 13.473071 -62.161987 13.471132 -62.157848 13.469273 -62.153637 13.467491 -62.149353 13.465798 -62.145008 13.464194 -62.140598 13.462686 -62.136124 13.461273 -62.131588 13.459965 -62.127003 13.458761 -62.122360 13.457668 -62.117676 13.456687 -62.112934 13.455823 -62.108154 13.455078 -62.103336 13.454709 -62.100460 13.453956 -62.099678 13.451096 -62.096638 13.448249 -62.093517 13.445415 -62.090305 13.442596 -62.087021 13.439802 -62.083652 13.437036 -62.080196 13.434299 -62.076660 13.431602 -62.073032 13.428945 -62.069325 13.426334 -62.065517 13.423776 -62.061638 13.421273 -62.057663 13.418831 -62.053608 13.416457 -62.049469 13.414153 -62.045246 13.411926 -62.040936 13.409781 -62.036552 13.407723 -62.032085 13.405753 -62.027542 13.403880 -62.022926 13.402108 -62.018242 13.400441 -62.013485 13.398883 -62.008671 13.397439 -62.003788 13.396113 -61.998848 13.394909 -61.993851 13.393830 -61.988808 13.392882 -61.983715 13.392067 -61.978584 13.391821 -61.976711 13.389968 -61.974789 13.386865 -61.971455 13.383780 -61.968033 13.380723 -61.964520 13.377693 -61.960907 13.374698 -61.957199 13.371745 -61.953396 13.368836 -61.949493 13.365980 -61.945499 13.363180 -61.941406 13.360444 -61.937214 13.357776 -61.932930 13.355181 -61.928555 13.352666 -61.924088 13.350237 -61.919525 13.347898 -61.914871 13.345654 -61.910141 13.343512 -61.905315 13.341476 -61.900421 13.339553 -61.895439 13.337747 -61.890392 13.336062 -61.885269 13.334504 -61.880081 13.333076 -61.874828 13.331784 -61.869518 13.330632 -61.864159 13.329623 -61.858742 13.328813 -61.853603 13.327707 -61.852467 13.324357 -61.848885 13.321033 -61.845203 13.317742 -61.841415 13.314490 -61.837521 13.311286 -61.833519 13.308132 -61.829407 13.305036 -61.825192 13.302003 -61.820869 13.299041 -61.816444 13.296155 -61.811912 13.293352 -61.807278 13.290639 -61.802544 13.288018 -61.797707 13.285500 -61.792782 13.283091 -61.787754 13.280793 -61.782646 13.278612 -61.777443 13.276558 -61.772163 13.274632 -61.766800 13.272842 -61.761356 13.271190 -61.755852 13.269685 -61.750279 13.268328 -61.744644 13.267126 -61.738953 13.266083 -61.733212 13.265201 -61.727425 13.264486 -61.721607 13.264482 -61.721554 13.264079 -61.721073 13.260873 -61.717072 13.257720 -61.712967 13.254623 -61.708752 13.251590 -61.704426 13.248629 -61.700001 13.245742 -61.695473 13.242939 -61.690834 13.240227 -61.686104 13.237607 -61.681274 13.235089 -61.676342 13.232677 -61.671322 13.230380 -61.666214 13.228201 -61.661007 13.226146 -61.655727 13.224219 -61.650368 13.222429 -61.644928 13.220779 -61.639423 13.219272 -61.633850 13.217915 -61.628216 13.216714 -61.622528 13.215670 -61.616791 13.214787 -61.611004 13.214073 -61.605186 13.213527 -61.599323 13.213154 -61.593445 13.212955 -61.587551 13.212936 -61.581635 13.213098 -61.575714 13.213442 -61.569790 13.213970 -61.563881 13.214683 -61.557980 13.215583 -61.552109 13.215999 -61.549877 13.214558 -61.545353 13.213016 -61.539955 13.211633 -61.534512 13.210416 -61.529007 13.209366 -61.523457 13.208487 -61.517868 13.207783 -61.512241 13.207258 -61.506592 13.206916 -61.500923 13.206758 -61.495232 13.206787 -61.489544 13.207005 -61.483860 13.207413 -61.478176 13.208012 -61.472515 13.208443 -61.469452 13.207521 -61.467056 13.205757 -61.462025 13.204142 -61.456921 13.202682 -61.451759 13.201381 -61.446541 13.200242 -61.441280 13.199271 -61.435966 13.198471 -61.430626 13.197846 -61.425259 13.197395 -61.419861 13.197125 -61.414452 13.197038 -61.409042 13.197134 -61.403625 13.197416 -61.398216 13.197886 -61.392822 13.198544 -61.387444 13.199388 -61.382103 13.200291 -61.377472 13.199286 -61.375000 13.197487 -61.370132 13.195849 -61.365192 13.194376 -61.360199 13.193072 -61.355160 13.191942 -61.350071 13.190989 -61.344948 13.190216 -61.339798 13.189628 -61.334629 13.189226 -61.329437 13.189011 -61.324245 13.188988 -61.319054 13.189156 -61.313877 13.189453 -61.309628 13.188004 -61.307343 13.185333 -61.302811 13.182807 -61.298195 13.180430 -61.293484 13.178209 -61.288689 13.176151 -61.283817 13.174258 -61.278873 13.172539 -61.273872 13.170994 -61.268806 13.169631 -61.263695 13.168454 -61.258545 13.167466 -61.253357 13.166670 -61.248142 13.166069 -61.242920 13.165666 -61.237679 13.165461 -61.232433 13.165460 -61.227203 13.165659 -61.221985 13.166062 -61.216793 13.166670 -61.211636 13.167482 -61.206520 13.168497 -61.201454 13.169182 -61.198639 13.168665 -61.197559 13.166611 -61.192825 13.164734 -61.188030 13.163041 -61.183174 13.161538 -61.178272 13.160227 -61.173325 13.159111 -61.168346 13.158195 -61.163345 13.157481 -61.158333 13.156971 -61.153313 13.156668 -61.148292 13.156572 -61.143288 13.156685 -61.138302 13.157007 -61.133343 13.157539 -61.128426 13.158281 -61.123562 13.159229 -61.118744 13.159914 -61.115932 13.159510 -61.115166 13.157368 -61.110722 13.155397 -61.106205 13.153607 -61.101635 13.152002 -61.097012 13.150583 -61.092339 13.149357 -61.087643 13.148324 -61.082916 13.147489 -61.078175 13.146854 -61.073421 13.146420 -61.068668 13.146190 -61.063927 13.146163 -61.059200 13.146341 -61.054508 13.146727 -61.049850 13.147314 -61.045231 13.147560 -61.043816 13.146031 -61.041771 13.143131 -61.037567 13.140395 -61.033279 13.137829 -61.028896 13.135439 -61.024433 13.133229 -61.019905 13.131207 -61.015301 13.129377 -61.010651 13.127742 -61.005951 13.126308 -61.001213 13.125077 -60.996437 13.124053 -60.991650 13.123238 -60.986847 13.122634 -60.982040 13.122242 -60.977245 13.122064 -60.972462 13.122101 -60.967709 13.122355 -60.962998 13.122820 -60.958324 13.122967 -60.957329 13.120789 -60.954411 13.117887 -60.950218 13.115151 -60.945927 13.112585 -60.941544 13.110195 -60.937084 13.107984 -60.932556 13.105965 -60.927952 13.104134 -60.923302 13.102499 -60.918602 13.101065 -60.913860 13.099833 -60.909092 13.098809 -60.904297 13.097993 -60.899498 13.097389 -60.894695 13.096998 -60.889900 13.096820 -60.885120 13.096857 -60.880363 13.097110 -60.875652 13.097577 -60.870979 13.098258 -60.866364 13.099151 -60.861813 13.099548 -60.860207 13.099022 -60.859444 13.096286 -60.855148 13.093719 -60.850769 13.091330 -60.846310 13.089120 -60.841774 13.087098 -60.837177 13.085268 -60.832527 13.083632 -60.827827 13.082198 -60.823086 13.080968 -60.818321 13.079944 -60.813526 13.079127 -60.808724 13.078523 -60.803921 13.078132 -60.799126 13.077954 -60.794346 13.077992 -60.789600 13.078245 -60.784878 13.078711 -60.780212 13.079392 -60.775597 13.080247 -60.771244 13.079022 -60.769470 13.076285 -60.765183 13.073719 -60.760803 13.071329 -60.756344 13.069118 -60.751808 13.067097 -60.747211 13.065268 -60.742558 13.063632 -60.737862 13.062198 -60.733120 13.060966 -60.728352 13.059942 -60.723557 13.059127 -60.718758 13.058523 -60.713955 13.058132 -60.709160 13.057953 -60.704384 13.057992 -60.699631 13.058245 -60.694920 13.058710 -60.690247 13.059391 -60.685638 13.060238 -60.681320 13.058991 -60.679516 13.056255 -60.675228 13.053689 -60.670841 13.051299 -60.666382 13.049089 -60.661854 13.047068 -60.657257 13.045237 -60.652607 13.043602 -60.647907 13.042168 -60.643166 13.040937 -60.638397 13.039913 -60.633606 13.039098 -60.628811 13.038493 -60.624008 13.038102 -60.619205 13.037924 -60.614433 13.037961 -60.609676 13.038215 -60.604965 13.038681 -60.600300 13.039361 -60.595684 13.040199 -60.591419 13.038928 -60.589577 13.036192 -60.585289 13.033626 -60.580910 13.031235 -60.576450 13.029025 -60.571922 13.027004 -60.567326 13.025174 -60.562672 13.023540 -60.557972 13.022105 -60.553234 13.020875 -60.548466 13.019850 -60.543678 13.019033 -60.538876 13.018430 -60.534073 13.018039 -60.529282 13.017859 -60.524498 13.017898 -60.519753 13.018151 -60.515037 13.018618 -60.510368 13.019299 -60.505756 13.020129 -60.501526 13.018832 -60.499649 13.016096 -60.495361 13.013531 -60.490982 13.011140 -60.486523 13.008930 -60.481995 13.006908 -60.477398 13.005078 -60.472748 13.003443 -60.468048 13.002008 -60.463306 13.000778 -60.458538 12.999754 -60.453751 12.998939 -60.448952 12.998334 -60.444149 12.997943 -60.439354 12.997765 -60.434578 12.997802 -60.429825 12.998055 -60.425114 12.998522 -60.420448 12.999203 -60.415829 13.000024 -60.411648 12.998708 -60.409744 12.995972 -60.405449 12.993405 -60.401070 12.991013 -60.396618 12.988806 -60.392082 12.986783 -60.387493 12.984953 -60.382839 12.983318 -60.378143 12.981884 -60.373402 12.980653 -60.368633 12.979629 -60.363846 12.978813 -60.359043 12.978208 -60.354244 12.977817 -60.349449 12.977639 -60.344673 12.977677 -60.339928 12.977930 -60.335213 12.978396 -60.330543 12.979077 -60.325932 12.979892 -60.321789 12.978549 -60.319847 12.975812 -60.315556 12.973246 -60.311180 12.970856 -60.306717 12.968646 -60.302189 12.966624 -60.297592 12.964793 -60.292942 12.963160 -60.288250 12.961725 -60.283508 12.960494 -60.278740 12.959470 -60.273952 12.958654 -60.269154 12.958051 -60.264351 12.957659 -60.259563 12.957480 -60.254780 12.957518 -60.250034 12.957770 -60.245323 12.958239 -60.240658 12.958918 -60.236038 12.959725 -60.231941 12.958359 -60.229969 12.955624 -60.225678 12.953056 -60.221298 12.950667 -60.216839 12.948458 -60.212311 12.946435 -60.207714 12.944605 -60.203064 12.942970 -60.198364 12.941536 -60.193630 12.940305 -60.188862 12.939281 -60.184074 12.938464 -60.179279 12.937859 -60.174480 12.937468 -60.169685 12.937291 -60.164909 12.937328 -60.160156 12.937582 -60.155441 12.938048 -60.150780 12.938728 -60.146168 12.939527 -60.142109 12.938138 -60.140102 12.935402 -60.135815 12.932835 -60.131443 12.930445 -60.126980 12.928235 -60.122452 12.926213 -60.117855 12.924383 -60.113205 12.922748 -60.108505 12.921313 -60.103771 12.920083 -60.099007 12.919059 -60.094215 12.918243 -60.089424 12.917639 -60.084621 12.917248 -60.079826 12.917070 -60.075050 12.917107 -60.070305 12.917359 -60.065594 12.917827 -60.060928 12.918508 -60.056316 12.919297 -60.052292 12.917886 -60.050251 12.915150 -60.045963 12.912583 -60.041584 12.910192 -60.037132 12.907984 -60.032600 12.905962 -60.028004 12.904130 -60.023354 12.902496 -60.018654 12.901062 -60.013920 12.899831 -60.009155 12.898807 -60.004368 12.897992 -59.999573 12.897388 -59.994770 12.896996 -59.989983 12.896818 -59.985199 12.896854 -59.980453 12.897108 -59.975742 12.897575 -59.971077 12.898255 -59.966465 12.899149 -59.961922 12.900252 -59.957451 12.901566 -59.953064 12.903085 -59.948769 12.904807 -59.944576 12.906729 -59.940491 12.908844 -59.936527 12.911151 -59.932690 12.913645 -59.928993 12.916319 -59.925438 12.919169 -59.922028 12.922185 -59.918785 12.925295 -59.915627 12.928424 -59.912487 12.931571 -59.909367 12.934742 -59.906265 12.937933 -59.903172 12.941149 -59.900097 12.944391 -59.897030 12.947658 -59.893982 12.950954 -59.890949 12.954279 -59.887932 12.957637 -59.884926 12.961025 -59.881935 12.964449 -59.878963 12.967909 -59.875999 12.971405 -59.873055 12.974941 -59.870132 12.978517 -59.867222 12.982137 -59.864334 12.985801 -59.861458 12.989509 -59.858608 12.993262 -59.855789 12.997066 -59.852989 13.000919 -59.850216 13.004824 -59.847469 13.008780 -59.844753 13.012789 -59.842075 13.016852 -59.839424 13.020971 -59.836815 13.025146 -59.834240 13.029379 -59.831711 13.033670 -59.829227 13.038015 -59.826794 13.042421 -59.824406 13.046886 -59.822075 13.051411 -59.819794 13.055993 -59.817581 13.060636 -59.815422 13.065336 -59.813332 13.070095 -59.811310 13.074910 -59.809357 13.079783 -59.807488 13.084713 -59.805691 13.089698 -59.803974 13.094736 -59.802341 13.099827 -59.800800 13.104969 -59.799343 13.110162 -59.797985 13.115400 -59.796730 13.120686 -59.795567 13.126014 -59.794510 13.131385 -59.793560 13.136794 -59.792721 13.142240 -59.791988 13.147718 -59.791382 13.153231 -59.790882 13.158770 -59.790505 13.164331 -59.790253 13.169918 -59.790123 13.175522 -59.790123 13.181141 -59.790245 13.186771 -59.790505 13.192410 -59.790901 13.198051 -59.791428 13.203694 -59.792091 13.209334 -59.792889 13.214965 -59.793827 13.220583 -59.794907 13.226188 -59.796127 13.231771 -59.797485 13.237330 -59.798988 13.242862 -59.800636 13.248359 -59.802418 13.253820 -59.804352 13.259239 -59.806419 13.264613 -59.808632 13.269938 -59.810982 13.275206 -59.813477 13.280415 -59.816112 13.285564 -59.818886 13.290645 -59.821789 13.295655 -59.824833 13.300588 -59.828011 13.305444 -59.831322 13.310215 -59.834759 13.314899 -59.838325 13.319494 -59.842014 13.323992 -59.845829 13.328392 -59.849758 13.332691 -59.853809 13.336886 -59.857975 13.340916 -59.862305 13.344721 -59.866848 13.348295 -59.871586 13.351625 -59.876526 13.354711 -59.881649 13.357540 -59.886936 13.360107 -59.892384 13.362413 -59.897980 13.364446 -59.903717 13.366204 -59.909576 13.367683 -59.915546 13.368882 -59.921619 13.369798 -59.927773 13.370427 -59.934010 13.370770 -59.940308 13.370827 -59.946644 13.370597 -59.953022 13.370081 -59.959431 13.369632 -59.963039 13.371877 -59.966362 13.374962 -59.971485 13.377792 -59.976772 13.380360 -59.982224 13.382664 -59.987823 13.384697 -59.993561 13.386455 -59.999413 13.387935 -60.005390 13.389133 -60.011463 13.390049 -60.017616 13.390678 -60.023853 13.391022 -60.030151 13.391078 -60.036488 13.390848 -60.042870 13.390331 -60.049274 13.389876 -60.052921 13.392097 -60.056213 13.395182 -60.061329 13.398013 -60.066624 13.400580 -60.072075 13.402885 -60.077667 13.404918 -60.083405 13.406676 -60.089264 13.408155 -60.095234 13.409354 -60.101307 13.410269 -60.107468 13.410899 -60.113705 13.411242 -60.120003 13.411299 -60.126347 13.411069 -60.132725 13.410553 -60.139126 13.410091 -60.142826 13.412286 -60.146080 13.415371 -60.151203 13.418202 -60.156486 13.420769 -60.161938 13.423073 -60.167538 13.425106 -60.173275 13.426865 -60.179138 13.428344 -60.185108 13.429543 -60.191177 13.430457 -60.197338 13.431087 -60.203575 13.431431 -60.209873 13.431487 -60.216217 13.431257 -60.222599 13.430741 -60.228996 13.430274 -60.232739 13.432444 -60.235958 13.435530 -60.241081 13.438358 -60.246372 13.440927 -60.251823 13.443232 -60.257423 13.445264 -60.263157 13.447022 -60.269016 13.448503 -60.274990 13.449701 -60.281063 13.450617 -60.287224 13.451245 -60.293461 13.451590 -60.299759 13.451645 -60.306103 13.451415 -60.312481 13.450899 -60.318890 13.450427 -60.322674 13.452569 -60.325848 13.455653 -60.330971 13.458483 -60.336266 13.461051 -60.341717 13.463356 -60.347317 13.465388 -60.353054 13.467147 -60.358913 13.468627 -60.364891 13.469826 -60.370964 13.470740 -60.377125 13.471370 -60.383358 13.471713 -60.389656 13.471769 -60.396004 13.471538 -60.402382 13.471025 -60.408787 13.470546 -60.412628 13.472664 -60.415768 13.475748 -60.420891 13.478578 -60.426178 13.481147 -60.431637 13.483451 -60.437237 13.485483 -60.442974 13.487242 -60.448833 13.488721 -60.454803 13.489920 -60.460884 13.490835 -60.467045 13.491465 -60.473278 13.491809 -60.479576 13.491864 -60.485920 13.491635 -60.492302 13.491118 -60.498707 13.490635 -60.502590 13.492726 -60.505688 13.495811 -60.510811 13.498640 -60.516106 13.501209 -60.521553 13.503512 -60.527157 13.505546 -60.532894 13.507303 -60.538754 13.508784 -60.544731 13.509984 -60.550808 13.510897 -60.556969 13.511527 -60.563206 13.511870 -60.569504 13.511928 -60.575848 13.511697 -60.582233 13.511182 -60.588642 13.510692 -60.592571 13.512755 -60.595627 13.515840 -60.600750 13.518670 -60.606045 13.521238 -60.611500 13.523542 -60.617104 13.525576 -60.622841 13.527334 -60.628700 13.528812 -60.634678 13.530011 -60.640747 13.530927 -60.646915 13.531557 -60.653152 13.531899 -60.659450 13.531957 -60.665794 13.531727 -60.672180 13.531210 -60.678589 13.530715 -60.682560 13.532756 -60.685589 13.535839 -60.690712 13.538669 -60.696003 13.541238 -60.701454 13.543542 -60.707054 13.545576 -60.712795 13.547333 -60.718662 13.548813 -60.724636 13.550012 -60.730709 13.550927 -60.736877 13.551557 -60.743115 13.551900 -60.749409 13.551956 -60.755756 13.551726 -60.762142 13.551209 -60.768547 13.550454 -60.774620 13.551619 -60.776348 13.554705 -60.781471 13.557534 -60.786766 13.560103 -60.792221 13.562407 -60.797821 13.564439 -60.803558 13.566198 -60.809425 13.567676 -60.815403 13.568877 -60.821476 13.569791 -60.827644 13.570421 -60.833878 13.570764 -60.840176 13.570821 -60.846527 13.570591 -60.852909 13.570451 -60.854645 13.573532 -60.858742 13.576862 -60.863686 13.579948 -60.868809 13.582778 -60.874103 13.585346 -60.879551 13.587649 -60.885158 13.588785 -60.888363 13.591797 -60.890732 13.596779 -60.894894 13.601645 -60.899189 13.606390 -60.903637 13.611010 -60.908211 13.615450 -60.912972 13.619660 -60.917953 13.623629 -60.923141 13.627348 -60.928532 13.630815 -60.934113 13.634016 -60.939869 13.636950 -60.945793 13.639611 -60.951870 13.640175 -60.953342 13.644326 -60.956795 13.649641 -60.961479 13.654822 -60.966324 13.659864 -60.971317 13.664719 -60.976502 13.669344 -60.981903 13.673727 -60.987518 13.677864 -60.993328 13.681746 -60.999332 13.685366 -61.005520 13.688719 -61.011875 13.691800 -61.018383 13.691999 -61.018856 13.697605 -61.023785 13.703221 -61.029026 13.708684 -61.034435 13.713954 -61.040043 13.718994 -61.045868 13.723793 -61.051907 13.728347 -61.058147 13.732645 -61.064575 13.736683 -61.071186 13.740455 -61.077976 13.743790 -61.084587 13.745521 -61.086098 13.751584 -61.091732 13.757474 -61.097553 13.763158 -61.103584 13.768612 -61.109833 13.773827 -61.116295 13.778795 -61.122959 13.783512 -61.129818 13.787968 -61.136860 13.792159 -61.144073 13.795488 -61.150333 13.799918 -61.154446 13.806229 -61.160690 13.812327 -61.167137 13.818198 -61.173817 13.823828 -61.180702 13.829213 -61.187794 13.834345 -61.195072 13.839220 -61.202545 13.843829 -61.210190 13.847170 -61.216194 13.848219 -61.217167 13.854951 -61.223827 13.861466 -61.230698 13.864325 -61.233929 13.866949 -61.235664 13.875359 -61.241627 13.883579 -61.247864 13.891599 -61.254364 13.899410 -61.261135 13.907002 -61.268162 13.914371 -61.275436 13.921502 -61.282959 13.928392 -61.290703 13.935034 -61.298672 13.941419 -61.306862 13.947540 -61.315258 13.953393 -61.323849 13.958969 -61.332626 13.964268 -61.341579 13.969282 -61.350700 13.974007 -61.359974 13.978439 -61.369400 13.982576 -61.378956 13.986415 -61.388634 13.989951 -61.398422 13.993187 -61.408310 13.996118 -61.418289 13.998745 -61.428352 14.000277 -61.435036 14.003801 -61.440208 14.009376 -61.448986 14.014677 -61.457947 14.019690 -61.467064 14.024415 -61.476349 14.028849 -61.485767 14.032985 -61.495323 14.036823 -61.505005 14.040360 -61.514793 14.043595 -61.524692 14.046527 -61.534672 14.049153 -61.544731 14.050724 -61.551582 14.054153 -61.556614 14.059731 -61.565399 14.065028 -61.574352 14.070042 -61.583477 14.074767 -61.592762 14.079200 -61.602188 14.083336 -61.611740 14.087174 -61.621426 14.090712 -61.631222 14.093947 -61.641113 14.096879 -61.651096 14.099505 -61.661160 14.101111 -61.668163 14.104451 -61.673069 14.110028 -61.681854 14.115327 -61.690815 14.120340 -61.699940 14.125066 -61.709221 14.129498 -61.718647 14.133636 -61.728210 14.137473 -61.737896 14.141010 -61.747688 14.144246 -61.757587 14.147177 -61.767574 14.149804 -61.777641 14.151446 -61.784805 14.154696 -61.789581 14.160273 -61.798363 14.165571 -61.807324 14.170585 -61.816456 14.175310 -61.825737 14.179743 -61.835163 14.183879 -61.844726 14.187717 -61.854420 14.191255 -61.864212 14.194490 -61.874111 14.197422 -61.884102 14.200048 -61.894169 14.201727 -61.901489 14.204884 -61.906132 14.210462 -61.914913 14.215760 -61.923882 14.220773 -61.933006 14.225498 -61.942295 14.229931 -61.951729 14.234068 -61.961292 14.237907 -61.970982 14.241444 -61.980778 14.244678 -61.990681 14.247610 -62.000675 14.250237 -62.010742 14.252560 -62.020878 14.252918 -62.022690 14.253374 -62.023357 14.258953 -62.032146 14.264251 -62.041107 14.269265 -62.050240 14.273990 -62.059528 14.278421 -62.068962 14.282559 -62.078529 14.286398 -62.088223 14.289935 -62.098022 14.293171 -62.107929 14.296102 -62.117920 14.298730 -62.127987 14.301052 -62.138130 14.303069 -62.148323 14.304785 -62.158562 14.306198 -62.168831 14.307310 -62.179127 14.308125 -62.189434 14.308644 -62.199738 14.308872 -62.210041 14.308863 -62.211643 14.312164 -62.218674 14.316302 -62.228241 14.320141 -62.237934 14.323678 -62.247734 14.326913 -62.257637 14.329844 -62.267639 14.332473 -62.277714 14.334795 -62.287849 14.336813 -62.298046 14.338528 -62.308285 14.339941 -62.318558 14.341053 -62.328858 14.341867 -62.339165 14.342388 -62.349472 14.342615 -62.359772 14.342605 -62.361584 14.345815 -62.368423 14.349953 -62.377994 14.353791 -62.387684 14.357329 -62.397495 14.360565 -62.407398 14.363497 -62.417397 14.366123 -62.427471 14.368445 -62.437607 14.370463 -62.447803 14.372180 -62.458050 14.373593 -62.468323 14.374703 -62.478622 14.375520 -62.488930 14.376038 -62.499237 14.376267 -62.509537 14.376255 -62.511574 14.379375 -62.518219 14.383512 -62.527786 14.387351 -62.537479 14.390889 -62.547287 14.394125 -62.557198 14.397057 -62.567188 14.399683 -62.577270 14.402005 -62.587414 14.404024 -62.597610 14.405740 -62.607857 14.407152 -62.618130 14.408263 -62.628429 14.409080 -62.638737 14.409599 -62.649048 14.409827 -62.659351 14.409814 -62.661602 14.412843 -62.668053 14.416981 -62.677628 14.420819 -62.687324 14.424357 -62.697136 14.427591 -62.707039 14.430523 -62.717037 14.433151 -62.727119 14.435473 -62.737263 14.437491 -62.747459 14.439208 -62.757706 14.440620 -62.767982 14.441731 -62.778282 14.442546 -62.788597 14.443067 -62.798912 14.443294 -62.809212 14.443280 -62.811676 14.446218 -62.817932 14.450356 -62.827507 14.454195 -62.837208 14.457733 -62.847015 14.460967 -62.856926 14.463899 -62.866924 14.466527 -62.877007 14.468849 -62.887150 14.470867 -62.897354 14.472584 -62.907600 14.473995 -62.917877 14.475109 -62.928181 14.475924 -62.938492 14.476442 -62.948807 14.476671 -62.959114 14.476637 -62.964893 14.478410 -62.968670 14.482547 -62.978245 14.486385 -62.987942 14.489922 -62.997757 14.493159 -63.007667 14.496090 -63.017670 14.498717 -63.027748 14.501040 -63.037899 14.503058 -63.048096 14.504774 -63.058350 14.506188 -63.068626 14.507299 -63.078934 14.508114 -63.089249 14.508635 -63.099564 14.508862 -63.109867 14.508802 -63.120155 14.508536 -63.128044 14.511581 -63.135086 14.515417 -63.144783 14.518955 -63.154598 14.522191 -63.164509 14.525123 -63.174515 14.527751 -63.184597 14.530071 -63.194748 14.532091 -63.204952 14.533806 -63.215198 14.535220 -63.225483 14.536331 -63.235783 14.537149 -63.246105 14.537666 -63.256416 + + + + + + + + + + + 21.602942 -71.679688 21.602772 -71.684692 21.602387 -71.689713 21.601786 -71.694748 21.600977 -71.699776 21.599958 -71.704796 21.598732 -71.709785 21.597303 -71.714752 21.595675 -71.719681 21.593849 -71.724556 21.591831 -71.729370 21.589628 -71.734116 21.587244 -71.738785 21.584681 -71.743378 21.581949 -71.747871 21.579054 -71.752274 21.576000 -71.756561 21.572800 -71.760735 21.569454 -71.764786 21.565973 -71.768715 21.562366 -71.772507 21.558640 -71.776169 21.554804 -71.779678 21.550861 -71.783051 21.546831 -71.786270 21.542711 -71.789329 21.538521 -71.792244 21.534264 -71.794990 21.529947 -71.797577 21.529430 -71.797867 21.528801 -71.801781 21.527781 -71.806801 21.526556 -71.811798 21.525125 -71.816757 21.523499 -71.821678 21.521673 -71.826546 21.519657 -71.831368 21.517450 -71.836113 21.515064 -71.840782 21.512505 -71.845367 21.509773 -71.849861 21.506878 -71.854256 21.503824 -71.858543 21.500622 -71.862717 21.497278 -71.866768 21.493795 -71.870689 21.490189 -71.874481 21.486462 -71.878136 21.482626 -71.881653 21.478685 -71.885025 21.474653 -71.888237 21.470535 -71.891296 21.466345 -71.894211 21.462086 -71.896957 21.457767 -71.899536 21.453407 -71.901962 21.451687 -71.902847 21.450790 -71.907257 21.449562 -71.912247 21.448134 -71.917206 21.446505 -71.922127 21.444679 -71.926994 21.442663 -71.931809 21.440456 -71.936546 21.438074 -71.941216 21.435511 -71.945801 21.432779 -71.950294 21.429884 -71.954681 21.426830 -71.958969 21.423628 -71.963142 21.420284 -71.967186 21.416803 -71.971108 21.413197 -71.974899 21.409470 -71.978554 21.405632 -71.982063 21.401693 -71.985435 21.397659 -71.988647 21.393543 -71.991707 21.389353 -71.994614 21.388249 -71.995323 21.388155 -71.995911 21.387070 -72.001251 21.385761 -72.006569 21.384235 -72.011856 21.382500 -72.017105 21.380552 -72.022301 21.378401 -72.027435 21.376051 -72.032486 21.373507 -72.037468 21.370773 -72.042351 21.367859 -72.047134 21.364771 -72.051819 21.361515 -72.056389 21.358099 -72.060837 21.354530 -72.065155 21.350819 -72.069336 21.346971 -72.073379 21.342995 -72.077271 21.338903 -72.081024 21.334700 -72.084610 21.330399 -72.088036 21.326008 -72.091301 21.321537 -72.094399 21.316994 -72.097328 21.312389 -72.100075 21.309977 -72.101417 21.309958 -72.101509 21.308649 -72.106827 21.307125 -72.112106 21.305389 -72.117348 21.303440 -72.122543 21.301290 -72.127663 21.298937 -72.132729 21.296392 -72.137695 21.293663 -72.142586 21.290749 -72.147369 21.287659 -72.152046 21.284403 -72.156609 21.280987 -72.161056 21.277418 -72.165375 21.273706 -72.169556 21.269857 -72.173592 21.265884 -72.177483 21.261791 -72.181229 21.257587 -72.184814 21.253286 -72.188240 21.248896 -72.191505 21.246567 -72.193123 21.246120 -72.195305 21.244732 -72.200951 21.243113 -72.206566 21.241266 -72.212135 21.239199 -72.217644 21.236912 -72.223091 21.234415 -72.228462 21.231710 -72.233742 21.228809 -72.238930 21.225712 -72.244019 21.222431 -72.248985 21.218971 -72.253830 21.215342 -72.258553 21.211550 -72.263138 21.207605 -72.267578 21.203518 -72.271874 21.199295 -72.276001 21.194946 -72.279976 21.190481 -72.283783 21.185909 -72.287422 21.181244 -72.290886 21.176495 -72.294182 21.171667 -72.297287 21.167854 -72.299561 21.167502 -72.301002 21.165880 -72.306610 21.164034 -72.312179 21.161964 -72.317688 21.159681 -72.323128 21.157183 -72.328491 21.154478 -72.333771 21.151577 -72.338959 21.148479 -72.344040 21.145199 -72.349007 21.141739 -72.353851 21.138109 -72.358566 21.134317 -72.363152 21.130373 -72.367592 21.126284 -72.371880 21.122061 -72.376007 21.117714 -72.379990 21.113247 -72.383789 21.108677 -72.387421 21.104012 -72.390884 21.099260 -72.394173 21.094433 -72.397278 21.090538 -72.399605 21.090210 -72.400932 21.088592 -72.406540 21.086748 -72.412102 21.084679 -72.417610 21.082394 -72.423050 21.079893 -72.428413 21.077190 -72.433685 21.074287 -72.438866 21.071192 -72.443947 21.067909 -72.448906 21.064449 -72.453758 21.060820 -72.458473 21.057030 -72.463051 21.053085 -72.467491 21.048996 -72.471771 21.044773 -72.475899 21.040423 -72.479874 21.035957 -72.483673 21.031389 -72.487312 21.027182 -72.490425 21.026112 -72.494766 21.024397 -72.500702 21.022444 -72.506592 21.020252 -72.512413 21.017832 -72.518173 21.015188 -72.523850 21.012323 -72.529434 21.009251 -72.534920 21.005974 -72.540291 21.002499 -72.545547 20.998837 -72.550674 20.994993 -72.555664 20.990980 -72.560509 20.986803 -72.565208 20.982473 -72.569740 20.978001 -72.574112 20.973394 -72.578316 20.968668 -72.582344 20.963829 -72.586189 20.958887 -72.589851 20.953857 -72.593330 20.948748 -72.596611 20.947962 -72.597084 20.946991 -72.600441 20.945038 -72.606323 20.942848 -72.612152 20.940428 -72.617905 20.937780 -72.623581 20.934919 -72.629158 20.931845 -72.634644 20.928568 -72.640015 20.925095 -72.645264 20.921431 -72.650383 20.917585 -72.655373 20.913572 -72.660225 20.909397 -72.664917 20.905066 -72.669441 20.900597 -72.673813 20.895990 -72.678017 20.891262 -72.682037 20.886423 -72.685883 20.884739 -72.687134 20.884491 -72.688141 20.882681 -72.694397 20.880617 -72.700607 20.878305 -72.706757 20.875752 -72.712830 20.872959 -72.718811 20.869938 -72.724701 20.866694 -72.730484 20.863235 -72.736153 20.859566 -72.741692 20.855700 -72.747101 20.851643 -72.752357 20.847406 -72.757469 20.842998 -72.762421 20.838427 -72.767212 20.833708 -72.771820 20.828846 -72.776245 20.823855 -72.780495 20.818748 -72.784554 20.813532 -72.788414 20.808222 -72.792076 20.805113 -72.794075 20.803097 -72.800140 20.800785 -72.806282 20.798227 -72.812347 20.795439 -72.818336 20.792416 -72.824219 20.789171 -72.830002 20.785711 -72.835670 20.782042 -72.841209 20.778177 -72.846611 20.774120 -72.851868 20.769882 -72.856979 20.765474 -72.861923 20.760904 -72.866707 20.756184 -72.871315 20.751324 -72.875740 20.746334 -72.879990 20.741964 -72.883453 20.740730 -72.887711 20.738560 -72.894241 20.736126 -72.900703 20.733438 -72.907082 20.730499 -72.913383 20.727318 -72.919579 20.723904 -72.925659 20.720262 -72.931618 20.716400 -72.937447 20.712332 -72.943138 20.708059 -72.948669 20.703600 -72.954040 20.698959 -72.959244 20.694149 -72.964279 20.689180 -72.969124 20.684063 -72.973785 20.678810 -72.978256 20.673433 -72.982521 20.667944 -72.986580 20.662355 -72.990433 20.661861 -72.990745 20.660923 -72.993568 20.658489 -73.000030 20.655800 -73.006409 20.652861 -73.012703 20.649681 -73.018898 20.646267 -73.024971 20.642624 -73.030930 20.638761 -73.036758 20.634695 -73.042442 20.630423 -73.047974 20.625963 -73.053337 20.621323 -73.058548 20.616510 -73.063568 20.611544 -73.068420 20.606426 -73.073082 20.601173 -73.077537 20.598261 -73.079849 20.597017 -73.083588 20.594584 -73.090042 20.591894 -73.096428 20.588957 -73.102715 20.585777 -73.108902 20.582361 -73.114983 20.578720 -73.120933 20.574860 -73.126755 20.570787 -73.132431 20.566519 -73.137970 20.562059 -73.143333 20.557419 -73.148537 20.552607 -73.153557 20.547638 -73.158409 20.542521 -73.163063 20.537268 -73.167526 20.531893 -73.171791 20.529953 -73.173225 20.527735 -73.179108 20.525047 -73.185486 20.522108 -73.191765 20.518927 -73.197952 20.515512 -73.204025 20.511871 -73.209984 20.508011 -73.215805 20.503939 -73.221481 20.499668 -73.227005 20.495209 -73.232376 20.490570 -73.237572 20.485758 -73.242599 20.480789 -73.247444 20.475672 -73.252090 20.470419 -73.256554 20.465042 -73.260811 20.463015 -73.262306 20.460836 -73.268097 20.458147 -73.274467 20.455208 -73.280754 20.452026 -73.286934 20.448612 -73.293007 20.444969 -73.298950 20.441109 -73.304771 20.437038 -73.310448 20.432768 -73.315971 20.428309 -73.321335 20.423668 -73.326531 20.418856 -73.331551 20.413887 -73.336395 20.408771 -73.341049 20.403517 -73.345505 20.398140 -73.349762 20.396042 -73.351311 20.393894 -73.357002 20.391205 -73.363373 20.388268 -73.369652 20.385086 -73.375832 20.381670 -73.381905 20.378029 -73.387848 20.374166 -73.393669 20.370096 -73.399338 20.365826 -73.404861 20.361366 -73.410225 20.356726 -73.415413 20.351915 -73.420433 20.346945 -73.425278 20.341829 -73.429932 20.336576 -73.434380 20.331200 -73.438637 20.329021 -73.440247 20.326906 -73.445839 20.324217 -73.452210 20.321279 -73.458489 20.318098 -73.464661 20.314684 -73.470734 20.311041 -73.476677 20.307179 -73.482490 20.303110 -73.488159 20.298840 -73.493675 20.294378 -73.499039 20.289738 -73.504227 20.284927 -73.509247 20.279959 -73.514084 20.274841 -73.518730 20.269589 -73.523186 20.264210 -73.527435 20.261946 -73.529106 20.259870 -73.534599 20.257181 -73.540970 20.254244 -73.547241 20.251064 -73.553413 20.247646 -73.559479 20.244007 -73.565422 20.240145 -73.571236 20.236075 -73.576904 20.231804 -73.582413 20.227345 -73.587776 20.222702 -73.592964 20.217892 -73.597977 20.212921 -73.602814 20.207806 -73.607460 20.202553 -73.611916 20.197176 -73.616165 20.194832 -73.617889 20.192797 -73.623276 20.190107 -73.629639 20.187166 -73.635918 20.183989 -73.642090 20.180573 -73.648148 20.176930 -73.654083 20.173069 -73.659897 20.168999 -73.665558 20.164728 -73.671074 20.160267 -73.676430 20.155626 -73.681618 20.150816 -73.686630 20.145845 -73.691467 20.140730 -73.696106 20.135477 -73.700554 20.130098 -73.704811 20.127670 -73.706596 20.125673 -73.711876 20.122984 -73.718239 20.120045 -73.724510 20.116863 -73.730682 20.113449 -73.736740 20.109806 -73.742676 20.105946 -73.748482 20.101875 -73.754143 20.097605 -73.759659 20.093143 -73.765015 20.088503 -73.770195 20.083691 -73.775208 20.078724 -73.780037 20.073607 -73.784676 20.068352 -73.789124 20.062975 -73.793381 20.060469 -73.795227 20.058506 -73.800423 20.055817 -73.806778 20.052877 -73.813049 20.049698 -73.819214 20.046282 -73.825264 20.042641 -73.831200 20.038780 -73.837006 20.034708 -73.842667 20.030436 -73.848175 20.025978 -73.853523 20.021338 -73.858711 20.016523 -73.863724 20.011557 -73.868553 20.006439 -73.873192 20.001184 -73.877632 19.995808 -73.881882 19.990318 -73.885925 19.984728 -73.889763 19.979048 -73.893394 19.973293 -73.896805 19.967476 -73.900002 19.961605 -73.902985 19.955698 -73.905754 19.949764 -73.908302 19.943815 -73.910637 19.937866 -73.912758 19.931929 -73.914665 19.926012 -73.916359 19.920130 -73.917854 19.914295 -73.919144 19.913013 -73.919388 19.911722 -73.922363 19.908987 -73.928093 19.906046 -73.933731 19.902912 -73.939255 19.899588 -73.944664 19.896084 -73.949951 19.892408 -73.955101 19.888571 -73.960106 19.884579 -73.964973 19.880442 -73.969688 19.876167 -73.974243 19.871769 -73.978630 19.867252 -73.982857 19.862635 -73.986900 19.857918 -73.990776 19.853115 -73.994476 19.848240 -73.997994 19.843298 -74.001328 19.838303 -74.004478 19.833265 -74.007446 19.828197 -74.010231 19.823105 -74.012833 19.818003 -74.015251 19.812899 -74.017487 19.807804 -74.019539 19.802730 -74.021416 19.797684 -74.023125 19.792675 -74.024658 19.787718 -74.026024 19.782818 -74.027237 19.777985 -74.028290 19.773226 -74.029190 19.768551 -74.029945 19.766056 -74.030281 19.763969 -74.035255 19.761560 -74.040497 19.758984 -74.045654 19.756247 -74.050720 19.753359 -74.055664 19.750326 -74.060501 19.747148 -74.065216 19.743845 -74.069817 19.740416 -74.074280 19.736870 -74.078613 19.733217 -74.082817 19.729465 -74.086868 19.725626 -74.090782 19.721701 -74.094551 19.717703 -74.098175 19.713638 -74.101646 19.709520 -74.104965 19.705353 -74.108131 19.701149 -74.111145 19.696913 -74.114014 19.692656 -74.116722 19.688389 -74.119285 19.684115 -74.121696 19.679844 -74.123962 19.675587 -74.126091 19.671348 -74.128067 19.667143 -74.129906 19.662970 -74.131615 19.658838 -74.133186 19.654758 -74.134636 19.650738 -74.135956 19.646782 -74.137169 19.642891 -74.138267 19.639080 -74.139259 19.635353 -74.140144 19.631710 -74.140945 19.628162 -74.141655 19.624712 -74.142281 19.621361 -74.142838 19.619579 -74.143105 19.618322 -74.146477 19.616354 -74.151306 19.614250 -74.156059 19.612019 -74.160721 19.609661 -74.165298 19.607189 -74.169777 19.604603 -74.174156 19.601912 -74.178429 19.599123 -74.182602 19.596241 -74.186668 19.593273 -74.190620 19.590225 -74.194458 19.587107 -74.198181 19.583921 -74.201790 19.580679 -74.205277 19.577383 -74.208649 19.574043 -74.211891 19.570663 -74.215019 19.567253 -74.218025 19.563820 -74.220917 19.560366 -74.223686 19.556902 -74.226334 19.553434 -74.228874 19.549967 -74.231293 19.546507 -74.233612 19.543062 -74.235809 19.539637 -74.237907 19.536234 -74.239899 19.532868 -74.241791 19.529533 -74.243591 19.526241 -74.245300 19.522997 -74.246918 19.519800 -74.248451 19.516659 -74.249908 19.513578 -74.251289 19.510559 -74.252602 19.507610 -74.253845 19.504724 -74.255043 19.501915 -74.256180 19.499180 -74.257271 19.496519 -74.258324 19.493940 -74.259331 19.491440 -74.260315 19.489021 -74.261276 19.486687 -74.262215 19.484432 -74.263153 19.482746 -74.263870 19.481054 -74.267990 19.479057 -74.272514 19.476957 -74.276962 19.474762 -74.281319 19.472475 -74.285599 19.470102 -74.289772 19.467647 -74.293869 19.465120 -74.297859 19.462522 -74.301765 19.459862 -74.305565 19.457140 -74.309265 19.454369 -74.312881 19.451548 -74.316383 19.448687 -74.319794 19.445791 -74.323105 19.442864 -74.326317 19.439913 -74.329430 19.436939 -74.332443 19.433952 -74.335365 19.430958 -74.338188 19.427959 -74.340927 19.424959 -74.343567 19.421966 -74.346123 19.418983 -74.348595 19.416014 -74.350983 19.413065 -74.353287 19.410135 -74.355515 19.407234 -74.357674 19.404362 -74.359764 19.401526 -74.361786 19.398724 -74.363747 19.395964 -74.365646 19.393244 -74.367493 19.390570 -74.369286 19.387941 -74.371040 19.385361 -74.372749 19.382832 -74.374420 19.380356 -74.376060 19.377930 -74.377678 19.375561 -74.379265 19.373243 -74.380836 19.370985 -74.382393 19.368778 -74.383942 19.366627 -74.385483 19.364529 -74.387032 19.362484 -74.388573 19.360493 -74.390129 19.358553 -74.391693 19.356661 -74.393280 19.354816 -74.394882 19.353020 -74.396507 19.351267 -74.398171 19.349554 -74.399856 19.347881 -74.401581 19.346212 -74.403305 19.344517 -74.404999 19.342791 -74.406662 19.341038 -74.408295 19.339258 -74.409889 19.337454 -74.411461 19.335621 -74.412994 19.333765 -74.414490 19.331886 -74.415955 19.329981 -74.417381 19.328052 -74.418778 19.326101 -74.420135 19.324129 -74.421455 19.322134 -74.422745 19.321991 -74.422836 19.321108 -74.424393 19.319002 -74.427956 19.316856 -74.431458 19.314672 -74.434883 19.312456 -74.438240 19.310209 -74.441544 19.307940 -74.444771 19.305643 -74.447937 19.303329 -74.451035 19.300999 -74.454071 19.298653 -74.457046 19.296299 -74.459953 19.293936 -74.462814 19.291569 -74.465614 19.289198 -74.468361 19.286829 -74.471046 19.284460 -74.473694 19.282097 -74.476288 19.279739 -74.478836 19.277390 -74.481331 19.275049 -74.483803 19.272720 -74.486221 19.270405 -74.488609 19.268103 -74.490967 19.265812 -74.493294 19.263540 -74.495590 19.261284 -74.497856 19.259041 -74.500107 19.256819 -74.502335 19.254608 -74.504547 19.252417 -74.506744 19.250242 -74.508926 19.248083 -74.511101 19.245939 -74.513268 19.243811 -74.515434 19.241695 -74.517586 19.239592 -74.519752 19.237501 -74.521912 19.235420 -74.524078 19.233349 -74.526253 19.231260 -74.528404 19.229139 -74.530518 19.226980 -74.532600 19.224792 -74.534637 19.222567 -74.536629 19.220310 -74.538582 19.218021 -74.540504 19.215698 -74.542374 19.213350 -74.544197 19.210968 -74.545990 19.208557 -74.547729 19.206120 -74.549423 19.203651 -74.551079 19.201157 -74.552681 19.198637 -74.554237 19.196091 -74.555748 19.193522 -74.557220 19.190927 -74.558639 19.188311 -74.560005 19.185673 -74.561333 19.183010 -74.562599 19.180933 -74.563545 19.179478 -74.566460 19.177683 -74.569939 19.175846 -74.573380 19.173979 -74.576782 19.172077 -74.580139 19.170139 -74.583458 19.168175 -74.586746 19.166178 -74.589996 19.164156 -74.593208 19.162102 -74.596374 19.160025 -74.599518 19.157921 -74.602615 19.155792 -74.605682 19.153639 -74.608726 19.151462 -74.611725 19.149263 -74.614693 19.147041 -74.617630 19.144798 -74.620544 19.142534 -74.623413 19.140249 -74.626266 19.137943 -74.629082 19.135616 -74.631882 19.133270 -74.634651 19.130901 -74.637390 19.128513 -74.640099 19.126106 -74.642792 19.123676 -74.645454 19.121223 -74.648102 19.118753 -74.650726 19.116249 -74.653305 19.113705 -74.655846 19.111113 -74.658333 19.108486 -74.660774 19.105816 -74.663170 19.103107 -74.665520 19.100359 -74.667816 19.097574 -74.670052 19.094751 -74.672249 19.091894 -74.674385 19.089001 -74.676476 19.086075 -74.678505 19.083115 -74.680481 19.080120 -74.682411 19.077095 -74.684280 19.076588 -74.684578 19.075907 -74.686714 19.074440 -74.691063 19.072903 -74.695381 19.071293 -74.699669 19.069614 -74.703934 19.067864 -74.708160 19.066042 -74.712349 19.064152 -74.716515 19.062193 -74.720634 19.060165 -74.724731 19.058071 -74.728775 19.055906 -74.732796 19.053680 -74.736763 19.051386 -74.740692 19.049026 -74.744575 19.046604 -74.748421 19.044117 -74.752220 19.041569 -74.755966 19.038956 -74.759682 19.036283 -74.763336 19.033552 -74.766937 19.030758 -74.770493 19.027908 -74.773994 19.025000 -74.777443 19.022032 -74.780838 19.019012 -74.784187 19.015934 -74.787468 19.012804 -74.790695 19.009621 -74.793861 19.006382 -74.796982 19.003098 -74.800026 18.999760 -74.803017 18.996372 -74.805946 18.992937 -74.808807 18.989456 -74.811607 18.985928 -74.814346 18.982355 -74.817017 18.978739 -74.819626 18.975081 -74.822166 18.971378 -74.824638 18.967634 -74.827034 18.963854 -74.829376 18.960037 -74.831642 18.956179 -74.833832 18.952288 -74.835960 18.948360 -74.838005 18.944401 -74.839981 18.940409 -74.841889 18.936384 -74.843727 18.932331 -74.845482 18.928249 -74.847160 18.924141 -74.848770 18.920004 -74.850304 18.915844 -74.851753 18.911659 -74.853134 18.907454 -74.854439 18.903227 -74.855660 18.902752 -74.855789 18.900585 -74.858856 18.897913 -74.862511 18.895180 -74.866112 18.892389 -74.869667 18.889538 -74.873161 18.886629 -74.876610 18.883663 -74.880005 18.880640 -74.883339 18.877563 -74.886627 18.874433 -74.889847 18.871248 -74.893021 18.868013 -74.896126 18.864727 -74.899170 18.861389 -74.902161 18.858000 -74.905083 18.854567 -74.907951 18.851086 -74.910751 18.847557 -74.913483 18.843983 -74.916153 18.840366 -74.918762 18.836708 -74.921295 18.833008 -74.923767 18.829264 -74.926163 18.825483 -74.928497 18.821663 -74.930763 18.817808 -74.932953 18.813917 -74.935074 18.809990 -74.937119 18.806030 -74.939102 18.802036 -74.941002 18.798012 -74.942833 18.793959 -74.944595 18.789877 -74.946274 18.785768 -74.947876 18.781632 -74.949409 18.777471 -74.950859 18.773287 -74.952240 18.769081 -74.953537 18.764854 -74.954765 18.760607 -74.955910 18.756344 -74.956986 18.752060 -74.957970 18.747761 -74.958878 18.743450 -74.959717 18.739122 -74.960465 18.734785 -74.961143 18.730436 -74.961739 18.726078 -74.962250 18.721714 -74.962685 18.717342 -74.963035 18.712965 -74.963310 18.708584 -74.963509 18.704201 -74.963623 18.699816 -74.963654 18.695431 -74.963608 18.691046 -74.963478 18.686667 -74.963272 18.682291 -74.962982 18.677919 -74.962616 18.673555 -74.962166 18.669199 -74.961639 18.664850 -74.961029 18.660515 -74.960350 18.656191 -74.959579 18.651880 -74.958740 18.647587 -74.957809 18.643305 -74.956810 18.639044 -74.955734 18.634798 -74.954575 18.630575 -74.953339 18.626375 -74.952026 18.622192 -74.950638 18.618036 -74.949165 18.613905 -74.947624 18.609798 -74.946014 18.605722 -74.944321 18.601671 -74.942551 18.597654 -74.940712 18.593666 -74.938797 18.589710 -74.936813 18.585789 -74.934753 18.581902 -74.932632 18.578051 -74.930435 18.574236 -74.928162 18.570461 -74.925819 18.566725 -74.923408 18.563028 -74.920937 18.559376 -74.918396 18.555767 -74.915787 18.552197 -74.913109 18.548676 -74.910370 18.545200 -74.907570 18.541771 -74.904701 18.538391 -74.901779 18.535061 -74.898789 18.531780 -74.895737 18.528549 -74.892631 18.525372 -74.889458 18.522247 -74.886238 18.519176 -74.882958 18.516161 -74.879616 18.513203 -74.876221 18.510300 -74.872780 18.507454 -74.869286 18.504667 -74.865730 18.501942 -74.862129 18.499275 -74.858482 18.496670 -74.854782 18.494127 -74.851036 18.491646 -74.847252 18.489227 -74.843414 18.486878 -74.839539 18.484587 -74.835617 18.482365 -74.831657 18.480207 -74.827652 18.478119 -74.823616 18.476095 -74.819542 18.474142 -74.815422 18.472256 -74.811272 18.470440 -74.807091 18.468693 -74.802872 18.467018 -74.798630 18.465412 -74.794357 18.463881 -74.790047 18.462418 -74.785713 18.461027 -74.781357 18.459711 -74.776970 18.458467 -74.772568 18.457296 -74.768143 18.456201 -74.763687 18.455177 -74.759224 18.454231 -74.754730 18.453360 -74.750229 18.452560 -74.745712 18.451836 -74.741180 18.451191 -74.736633 18.450619 -74.732086 18.450123 -74.727516 18.449703 -74.722938 18.449360 -74.718361 18.449093 -74.713776 18.448900 -74.709183 18.448786 -74.704590 18.448750 -74.699997 18.448786 -74.695396 18.448900 -74.690811 18.449093 -74.686218 18.449360 -74.681633 18.449703 -74.677055 18.450123 -74.672478 18.450619 -74.667915 18.451191 -74.663361 18.451836 -74.658813 18.452560 -74.654282 18.453358 -74.649757 18.454229 -74.645256 18.455177 -74.640770 18.456201 -74.636307 18.457296 -74.631851 18.458467 -74.627426 18.459711 -74.623016 18.461027 -74.618637 18.462418 -74.614281 18.463881 -74.609947 18.465412 -74.605637 18.467018 -74.601364 18.468693 -74.597122 18.470440 -74.592895 18.472258 -74.588722 18.474142 -74.584572 18.476095 -74.580452 18.478119 -74.576378 18.480207 -74.572342 18.482365 -74.568336 18.484589 -74.564377 18.486878 -74.560455 18.489227 -74.556580 18.491646 -74.552742 18.494127 -74.548950 18.496670 -74.545212 18.499275 -74.541511 18.501942 -74.537865 18.504669 -74.534264 18.507454 -74.530708 18.510300 -74.527214 18.513203 -74.523773 18.516161 -74.520378 18.519176 -74.517037 18.522247 -74.513756 18.525372 -74.510536 18.528549 -74.507362 18.531778 -74.504257 18.535061 -74.501205 18.538391 -74.498215 18.541771 -74.495285 18.545200 -74.492416 18.548676 -74.489616 18.552198 -74.486877 18.555767 -74.484199 18.559376 -74.481598 18.563030 -74.479050 18.566727 -74.476578 18.570461 -74.474167 18.574236 -74.471832 18.578051 -74.469559 18.581902 -74.467361 18.585791 -74.465233 18.589710 -74.463181 18.593666 -74.461189 18.597654 -74.459282 18.601671 -74.457443 18.605722 -74.455673 18.609798 -74.453979 18.613905 -74.452370 18.618034 -74.450821 18.622192 -74.449356 18.626373 -74.447968 18.630575 -74.446655 18.634800 -74.445419 18.635412 -74.445251 18.637651 -74.442078 18.640318 -74.438423 18.643045 -74.434814 18.645830 -74.431259 18.648676 -74.427765 18.651579 -74.424316 18.654537 -74.420921 18.657553 -74.417580 18.660624 -74.414299 18.663746 -74.411064 18.666925 -74.407898 18.670155 -74.404785 18.673437 -74.401733 18.676765 -74.398743 18.680147 -74.395805 18.683577 -74.392944 18.687052 -74.390137 18.690573 -74.387390 18.694141 -74.384720 18.697752 -74.382103 18.701405 -74.379562 18.705099 -74.377083 18.708836 -74.374672 18.712612 -74.372337 18.716425 -74.370064 18.720276 -74.367867 18.724163 -74.365730 18.728085 -74.363670 18.732040 -74.361687 18.736027 -74.359772 18.740046 -74.357933 18.744097 -74.356163 18.748175 -74.354469 18.752279 -74.352852 18.756411 -74.351311 18.760569 -74.349846 18.764746 -74.348450 18.768949 -74.347145 18.773172 -74.345909 18.775368 -74.345306 18.776751 -74.343079 18.779228 -74.339287 18.781792 -74.335564 18.784445 -74.331902 18.787180 -74.328308 18.790001 -74.324783 18.792902 -74.321335 18.795885 -74.317963 18.798942 -74.314667 18.802069 -74.311432 18.805246 -74.308258 18.808475 -74.305145 18.811756 -74.302094 18.815086 -74.299095 18.818468 -74.296158 18.821896 -74.293289 18.825371 -74.290489 18.828894 -74.287743 18.832460 -74.285065 18.836073 -74.282448 18.839724 -74.279900 18.843420 -74.277420 18.847157 -74.275009 18.850929 -74.272667 18.854744 -74.270393 18.858595 -74.268188 18.862480 -74.266060 18.866404 -74.264000 18.870357 -74.262009 18.874346 -74.260094 18.878365 -74.258255 18.882416 -74.256485 18.886490 -74.254791 18.890598 -74.253174 18.893167 -74.252212 18.893782 -74.250710 18.895750 -74.246269 18.897846 -74.241898 18.900065 -74.237587 18.902409 -74.233345 18.904875 -74.229179 18.907459 -74.225090 18.910160 -74.221085 18.912979 -74.217163 18.915911 -74.213341 18.918951 -74.209602 18.922098 -74.205971 18.925352 -74.202438 18.928684 -74.198990 18.932074 -74.195602 18.935516 -74.192276 18.939016 -74.189018 18.942570 -74.185822 18.946175 -74.182686 18.949833 -74.179626 18.953539 -74.176628 18.957296 -74.173698 18.961100 -74.170837 18.964951 -74.168045 18.968847 -74.165329 18.972790 -74.162681 18.976774 -74.160103 18.980801 -74.157600 18.984867 -74.155182 18.988974 -74.152824 18.993120 -74.150551 18.997303 -74.148346 19.001524 -74.146225 19.005775 -74.144180 19.010063 -74.142212 19.014379 -74.140327 19.018730 -74.138512 19.021681 -74.137352 19.023569 -74.132782 19.025711 -74.128067 19.028009 -74.123436 19.030464 -74.118881 19.033068 -74.114433 19.035822 -74.110077 19.038721 -74.105835 19.041763 -74.101707 19.044943 -74.097687 19.048258 -74.093796 19.051704 -74.090035 19.055244 -74.086365 19.058847 -74.082756 19.062504 -74.079231 19.066223 -74.075760 19.069998 -74.072357 19.073828 -74.069031 19.077713 -74.065765 19.081652 -74.062584 19.085644 -74.059471 19.089684 -74.056419 19.093775 -74.053459 19.097916 -74.050568 19.102102 -74.047752 19.106337 -74.045014 19.110613 -74.042351 19.114935 -74.039772 19.119299 -74.037270 19.123703 -74.034851 19.128147 -74.032509 19.132629 -74.030251 19.137148 -74.028076 19.141703 -74.025978 19.146290 -74.023972 19.150911 -74.022049 19.155565 -74.020210 19.160244 -74.018463 19.164955 -74.016785 19.169693 -74.015205 19.171450 -74.014656 19.171507 -74.014549 19.174171 -74.010117 19.176998 -74.005814 19.179985 -74.001633 19.183128 -73.997574 19.186420 -73.993660 19.189859 -73.989883 19.193397 -73.986206 19.197001 -73.982605 19.200657 -73.979072 19.204376 -73.975593 19.208151 -73.972191 19.211981 -73.968857 19.215864 -73.965599 19.219805 -73.962410 19.223795 -73.959290 19.227839 -73.956245 19.231928 -73.953278 19.236069 -73.950386 19.240255 -73.947571 19.244490 -73.944824 19.248766 -73.942169 19.253088 -73.939575 19.257452 -73.937080 19.261856 -73.934654 19.266298 -73.932312 19.270781 -73.930046 19.275299 -73.927872 19.279854 -73.925781 19.284441 -73.923767 19.288841 -73.921928 19.290062 -73.918571 19.292170 -73.913444 19.294485 -73.908424 19.297003 -73.903519 19.299717 -73.898750 19.302626 -73.894119 19.305725 -73.889626 19.309004 -73.885284 19.312464 -73.881111 19.316097 -73.877106 19.319843 -73.873207 19.323656 -73.869392 19.327530 -73.865639 19.331467 -73.861961 19.335463 -73.858353 19.339518 -73.854820 19.343630 -73.851364 19.347799 -73.847984 19.352026 -73.844681 19.356306 -73.841453 19.360638 -73.838310 19.365021 -73.835243 19.369454 -73.832253 19.373936 -73.829353 19.378464 -73.826530 19.383039 -73.823792 19.387661 -73.821136 19.392322 -73.818565 19.397026 -73.816086 19.401772 -73.813690 19.406557 -73.811378 19.411379 -73.809158 19.416058 -73.807106 19.417599 -73.802971 19.419903 -73.797577 19.422439 -73.792313 19.425205 -73.787186 19.428196 -73.782234 19.431404 -73.777428 19.434824 -73.772812 19.438450 -73.768372 19.442276 -73.764130 19.446232 -73.760017 19.450254 -73.755981 19.454344 -73.752022 19.458498 -73.748131 19.462717 -73.744324 19.466995 -73.740593 19.471338 -73.736938 19.475739 -73.733368 19.480198 -73.729874 19.484715 -73.726471 19.489286 -73.723144 19.493914 -73.719902 19.498594 -73.716751 19.503323 -73.713684 19.508102 -73.710701 19.512932 -73.707809 19.517809 -73.705002 19.522730 -73.702293 19.527695 -73.699669 19.532705 -73.697136 19.536196 -73.695450 19.537546 -73.691490 19.539837 -73.685707 19.542395 -73.680077 19.545212 -73.674614 19.548281 -73.669319 19.551600 -73.664215 19.555159 -73.659309 19.558952 -73.654617 19.562971 -73.650131 19.567135 -73.645805 19.571369 -73.641548 19.575674 -73.637375 19.580048 -73.633286 19.584484 -73.629265 19.588989 -73.625343 19.593559 -73.621491 19.598192 -73.617729 19.600750 -73.615723 19.600950 -73.614883 19.602695 -73.608833 19.604717 -73.602905 19.607008 -73.597122 19.609564 -73.591492 19.612379 -73.586021 19.615452 -73.580727 19.618771 -73.575615 19.622330 -73.570717 19.626122 -73.566017 19.630142 -73.561524 19.634304 -73.557198 19.638538 -73.552948 19.642841 -73.548767 19.647217 -73.544678 19.651655 -73.540657 19.656158 -73.536728 19.660729 -73.532875 19.665361 -73.529114 19.667862 -73.527153 19.668078 -73.526245 19.669823 -73.520187 19.671843 -73.514259 19.674135 -73.508469 19.676691 -73.502838 19.679506 -73.497360 19.682579 -73.492073 19.685896 -73.486961 19.689457 -73.482048 19.693249 -73.477348 19.697268 -73.472862 19.701431 -73.468536 19.705666 -73.464279 19.709969 -73.460098 19.714342 -73.456001 19.718782 -73.451981 19.723284 -73.448051 19.727856 -73.444199 19.732487 -73.440437 19.734915 -73.438530 19.735155 -73.437523 19.736902 -73.431465 19.738922 -73.425537 19.741213 -73.419746 19.743771 -73.414108 19.746586 -73.408630 19.749657 -73.403343 19.752975 -73.398232 19.756536 -73.393311 19.760328 -73.388611 19.764345 -73.384125 19.768509 -73.379791 19.772745 -73.375534 19.777046 -73.371353 19.781420 -73.367256 19.785860 -73.363243 19.790363 -73.359299 19.794933 -73.355446 19.799566 -73.351685 19.801933 -73.349823 19.802195 -73.348724 19.803940 -73.342667 19.805960 -73.336731 19.808252 -73.330940 19.810808 -73.325294 19.813623 -73.319824 19.816694 -73.314529 19.820013 -73.309410 19.823574 -73.304497 19.827366 -73.299797 19.831385 -73.295303 19.835546 -73.290970 19.839783 -73.286705 19.844086 -73.282524 19.848459 -73.278427 19.852896 -73.274406 19.857403 -73.270462 19.861971 -73.266609 19.866602 -73.262840 19.868904 -73.261040 19.869186 -73.259849 19.870932 -73.253784 19.872952 -73.247849 19.875242 -73.242058 19.877798 -73.236420 19.880615 -73.230942 19.883686 -73.225632 19.887005 -73.220520 19.890562 -73.215607 19.894358 -73.210899 19.898375 -73.206406 19.902538 -73.202064 19.906775 -73.197807 19.911076 -73.193626 19.915449 -73.189522 19.919886 -73.185501 19.924393 -73.181557 19.928963 -73.177704 19.933594 -73.173935 19.935825 -73.172180 19.936129 -73.170898 19.937878 -73.164833 19.939896 -73.158897 19.942186 -73.153099 19.944744 -73.147453 19.947559 -73.141975 19.950630 -73.136665 19.953949 -73.131554 19.957508 -73.126633 19.961300 -73.121925 19.965317 -73.117432 19.969482 -73.113090 19.973717 -73.108826 19.978020 -73.104645 19.982393 -73.100540 19.986832 -73.096512 19.991335 -73.092575 19.995905 -73.088722 20.000536 -73.084946 20.002714 -73.083237 20.003035 -73.081879 20.004780 -73.075806 20.006800 -73.069870 20.009092 -73.064064 20.011648 -73.058418 20.014463 -73.052940 20.017534 -73.047630 20.020853 -73.042511 20.024412 -73.037590 20.028204 -73.032875 20.032225 -73.028381 20.036386 -73.024048 20.040623 -73.019775 20.044924 -73.015587 20.049297 -73.011482 20.053736 -73.007462 20.058241 -73.003517 20.062809 -72.999657 20.067440 -72.995888 20.069540 -72.994232 20.069887 -72.992775 20.071634 -72.986702 20.073652 -72.980766 20.075945 -72.974960 20.078501 -72.969307 20.081316 -72.963821 20.084387 -72.958519 20.087706 -72.953392 20.091265 -72.948471 20.095056 -72.943756 20.099075 -72.939262 20.103239 -72.934921 20.107473 -72.930649 20.111776 -72.926460 20.116148 -72.922348 20.120588 -72.918327 20.125091 -72.914383 20.129660 -72.910523 20.132496 -72.908211 20.133797 -72.902718 20.135542 -72.896652 20.137562 -72.890701 20.139853 -72.884895 20.142408 -72.879242 20.145226 -72.873756 20.148294 -72.868446 20.151615 -72.863327 20.155172 -72.858398 20.158964 -72.853683 20.162983 -72.849182 20.167147 -72.844841 20.171381 -72.840576 20.175684 -72.836380 20.180058 -72.832268 20.184494 -72.828247 20.188999 -72.824295 20.193567 -72.820427 20.198200 -72.816650 20.202894 -72.812965 20.207647 -72.809357 20.210508 -72.807266 20.211437 -72.803345 20.213182 -72.797272 20.215204 -72.791321 20.217495 -72.785515 20.220049 -72.779861 20.222864 -72.774368 20.225937 -72.769051 20.229254 -72.763931 20.232813 -72.759003 20.236607 -72.754280 20.240623 -72.749786 20.244789 -72.745438 20.249022 -72.741165 20.253325 -72.736969 20.257698 -72.732864 20.262135 -72.728828 20.266640 -72.724884 20.271210 -72.721016 20.275841 -72.717239 20.280535 -72.713547 20.285286 -72.709938 20.290098 -72.706421 20.294966 -72.702995 20.299892 -72.699654 20.304871 -72.696403 20.309597 -72.693443 20.310520 -72.691399 20.313196 -72.686180 20.316112 -72.681129 20.319265 -72.676262 20.322645 -72.671570 20.326250 -72.667091 20.330067 -72.662819 20.334023 -72.658676 20.338045 -72.654617 20.342132 -72.650642 20.346289 -72.646728 20.350504 -72.642899 20.354784 -72.639145 20.359123 -72.635475 20.363523 -72.631882 20.367983 -72.628372 20.372500 -72.624947 20.377070 -72.621597 20.378347 -72.620697 20.378471 -72.620041 20.379864 -72.614151 20.381521 -72.608376 20.383442 -72.602715 20.385616 -72.597191 20.388044 -72.591812 20.390722 -72.586594 20.393637 -72.581535 20.396791 -72.576660 20.400173 -72.571976 20.403774 -72.567497 20.407593 -72.563210 20.411547 -72.559082 20.415571 -72.555015 20.419659 -72.551033 20.423813 -72.547119 20.428030 -72.543289 20.432308 -72.539536 20.436649 -72.535858 20.441050 -72.532265 20.445509 -72.528755 20.450026 -72.525322 20.454594 -72.521980 20.459221 -72.518715 20.463900 -72.515541 20.468630 -72.512451 20.473408 -72.509453 20.476374 -72.507667 20.478399 -72.503181 20.480934 -72.498230 20.483698 -72.493439 20.486687 -72.488823 20.489887 -72.484375 20.493301 -72.480133 20.496920 -72.476074 20.500666 -72.472153 20.504477 -72.468307 20.508350 -72.464523 20.512285 -72.460823 20.516279 -72.457184 20.520334 -72.453629 20.524447 -72.450142 20.528616 -72.446739 20.532843 -72.443413 20.537121 -72.440163 20.541450 -72.436989 20.545832 -72.433899 20.546060 -72.433746 20.546734 -72.430160 20.548056 -72.424583 20.549627 -72.419098 20.551445 -72.413734 20.553507 -72.408493 20.555809 -72.403397 20.558344 -72.398438 20.561108 -72.393654 20.564094 -72.389030 20.567297 -72.384582 20.570711 -72.380325 20.574327 -72.376274 20.578074 -72.372353 20.581886 -72.368500 20.585758 -72.364723 20.589695 -72.361015 20.593689 -72.357376 20.597744 -72.353813 20.601854 -72.350326 20.606026 -72.346924 20.610248 -72.343597 20.614527 -72.340340 20.618856 -72.337166 20.623240 -72.334076 20.627674 -72.331070 20.632154 -72.328140 20.636681 -72.325287 20.641256 -72.322533 20.643040 -72.321503 20.643871 -72.319389 20.646046 -72.314568 20.648439 -72.309891 20.651051 -72.305359 20.653870 -72.300995 20.656897 -72.296791 20.660120 -72.292770 20.663536 -72.288940 20.667074 -72.285233 20.670675 -72.281593 20.674332 -72.278023 20.678051 -72.274521 20.681826 -72.271088 20.685654 -72.267715 20.689535 -72.264427 20.693474 -72.261208 20.697464 -72.258057 20.701506 -72.254990 20.705595 -72.251991 20.709732 -72.249062 20.713593 -72.246445 20.713757 -72.245277 20.714768 -72.239906 20.716013 -72.234627 20.717497 -72.229439 20.719215 -72.224365 20.721163 -72.219414 20.723337 -72.214592 20.725731 -72.209915 20.728342 -72.205383 20.731163 -72.201012 20.734188 -72.196816 20.737412 -72.192787 20.740829 -72.188950 20.744368 -72.185242 20.747969 -72.181603 20.751625 -72.178032 20.755342 -72.174530 20.759115 -72.171089 20.762945 -72.167725 20.766831 -72.164429 20.770765 -72.161209 20.774755 -72.158058 20.778795 -72.154983 20.782886 -72.151978 20.787025 -72.149063 20.790810 -72.146492 20.790991 -72.145195 20.792002 -72.139832 20.793249 -72.134544 20.794735 -72.129356 20.796452 -72.124283 20.798399 -72.119331 20.800573 -72.114502 20.802967 -72.109825 20.805576 -72.105286 20.808399 -72.100922 20.811424 -72.096710 20.814648 -72.092689 20.818066 -72.088852 20.821604 -72.085144 20.825205 -72.081497 20.828859 -72.077919 20.832577 -72.074417 20.836351 -72.070976 20.840179 -72.067604 20.844065 -72.064316 20.848000 -72.061089 20.851992 -72.057938 20.856031 -72.054863 20.860121 -72.051865 20.864262 -72.048943 20.868446 -72.046089 20.872679 -72.043320 20.876955 -72.040627 20.881277 -72.038017 20.885639 -72.035492 20.886633 -72.034943 20.886746 -72.034607 20.888580 -72.029938 20.890625 -72.025398 20.892879 -72.020981 20.895334 -72.016716 20.897991 -72.012596 20.900841 -72.008644 20.903873 -72.004852 20.907089 -72.001236 20.910419 -71.997742 20.913809 -71.994316 20.917250 -71.990944 20.920750 -71.987640 20.924299 -71.984405 20.927904 -71.981232 20.931560 -71.978134 20.935266 -71.975090 20.939022 -71.972130 20.942825 -71.969231 20.946674 -71.966408 20.950571 -71.963654 20.954510 -71.960976 20.958071 -71.958641 20.958723 -71.954025 20.959673 -71.948967 20.960846 -71.943985 20.962246 -71.939102 20.963860 -71.934326 20.965694 -71.929649 20.967739 -71.925110 20.969994 -71.920692 20.972450 -71.916420 20.975107 -71.912300 20.977953 -71.908340 20.980989 -71.904549 20.984203 -71.900932 20.987534 -71.897438 20.990921 -71.894005 20.994366 -71.890640 20.997864 -71.887329 21.001415 -71.884094 21.005018 -71.880928 21.008675 -71.877815 21.012379 -71.874779 21.016136 -71.871811 21.019938 -71.868912 21.023788 -71.866089 21.027683 -71.863327 21.031624 -71.860649 21.035608 -71.858040 21.039633 -71.855499 21.043699 -71.853043 21.047808 -71.850662 21.051948 -71.848351 21.052889 -71.847847 21.054039 -71.844452 21.055758 -71.840073 21.057676 -71.835808 21.059788 -71.831673 21.062092 -71.827660 21.064583 -71.823799 21.067253 -71.820084 21.070097 -71.816528 21.073111 -71.813133 21.076235 -71.809853 21.079413 -71.806641 21.082640 -71.803475 21.085918 -71.800377 21.089249 -71.797340 21.092627 -71.794365 21.096056 -71.791451 21.099529 -71.788597 21.103050 -71.785820 21.106617 -71.783104 21.110224 -71.780449 21.113876 -71.777862 21.117573 -71.775352 21.121306 -71.772903 21.125080 -71.770531 21.125236 -71.770439 21.125538 -71.767281 21.126215 -71.762459 21.127106 -71.757706 21.128206 -71.753036 21.129519 -71.748451 21.131035 -71.743965 21.132751 -71.739586 21.134672 -71.735321 21.136784 -71.731178 21.139088 -71.727173 21.141577 -71.723305 21.144247 -71.719589 21.147093 -71.716026 21.150108 -71.712639 21.153231 -71.709358 21.156406 -71.706131 21.159634 -71.702972 21.162914 -71.699867 21.166245 -71.696831 21.169622 -71.693855 21.173050 -71.690933 21.176525 -71.688088 21.180046 -71.685303 21.183611 -71.682579 21.187220 -71.679932 21.190872 -71.677345 21.194565 -71.674827 21.197098 -71.673164 21.197252 -71.670128 21.197718 -71.665253 21.198395 -71.660431 21.199287 -71.655678 21.200388 -71.651009 21.201698 -71.646416 21.203215 -71.641930 21.204931 -71.637543 21.206852 -71.633278 21.208963 -71.629135 21.211268 -71.625122 21.213756 -71.621254 21.216427 -71.617539 21.219273 -71.613975 21.222288 -71.610581 21.225410 -71.607300 21.228586 -71.604080 21.231813 -71.600914 21.235094 -71.597817 21.238422 -71.594765 21.241802 -71.591789 21.245228 -71.588875 21.248703 -71.586021 21.252226 -71.583237 21.255789 -71.580521 21.259399 -71.577866 21.263052 -71.575272 21.266745 -71.572754 21.270481 -71.570305 21.274254 -71.567925 21.278067 -71.565613 21.281916 -71.563385 21.285799 -71.561218 21.289721 -71.559120 21.293675 -71.557098 21.297661 -71.555153 21.301678 -71.553284 21.305725 -71.551483 21.309801 -71.549767 21.313906 -71.548119 21.318035 -71.546555 21.322189 -71.545059 21.326368 -71.543640 21.330570 -71.542313 21.334793 -71.541046 21.339035 -71.539871 21.343296 -71.538773 21.347576 -71.537750 21.351868 -71.536812 21.356178 -71.535950 21.360500 -71.535164 21.364836 -71.534470 21.369179 -71.533852 21.373533 -71.533318 21.377895 -71.532860 21.382265 -71.532486 21.386643 -71.532189 21.391020 -71.531975 21.395401 -71.531845 21.399786 -71.531799 21.404171 -71.531830 21.408552 -71.531944 21.412932 -71.532143 21.417307 -71.532417 21.421678 -71.532776 21.426043 -71.533218 21.430399 -71.533737 21.434746 -71.534348 21.439083 -71.535026 21.443407 -71.535797 21.447720 -71.536644 21.452017 -71.537567 21.456299 -71.538567 21.460562 -71.539658 21.464807 -71.540825 21.469032 -71.542069 21.473238 -71.543388 21.477423 -71.544792 21.481581 -71.546265 21.485716 -71.547821 21.489824 -71.549454 21.493906 -71.551170 21.497959 -71.552956 21.501980 -71.554817 21.505972 -71.556747 21.509932 -71.558762 21.513859 -71.560844 21.517750 -71.562996 21.521604 -71.565231 21.525423 -71.567528 21.529203 -71.569908 21.532946 -71.572342 21.536646 -71.574860 21.540304 -71.577438 21.543919 -71.580086 21.547493 -71.582802 21.551020 -71.585579 21.554501 -71.588425 21.557936 -71.591347 21.561321 -71.594315 21.564659 -71.597359 21.567945 -71.600456 21.571180 -71.603622 21.574366 -71.606842 21.577496 -71.610123 21.580517 -71.613518 21.583368 -71.617081 21.586046 -71.620804 21.588545 -71.624680 21.590859 -71.628693 21.592979 -71.632835 21.594904 -71.637116 21.596632 -71.641502 21.598154 -71.646004 21.599474 -71.650604 21.600584 -71.655281 21.601482 -71.660049 21.602169 -71.664879 21.602642 -71.669769 21.602902 -71.674706 + + + + + + + + + + + 25.570417 -69.434677 25.570192 -69.441559 25.569683 -69.448456 25.568886 -69.455376 25.567810 -69.462288 25.566454 -69.469177 25.564823 -69.476044 25.562920 -69.482864 25.560751 -69.489632 25.558321 -69.496338 25.555634 -69.502952 25.552698 -69.509476 25.549521 -69.515900 25.546110 -69.522202 25.542471 -69.528374 25.538612 -69.534416 25.534544 -69.540314 25.530277 -69.546043 25.525820 -69.551621 25.521185 -69.557015 25.516376 -69.562225 25.511410 -69.567253 25.506298 -69.572083 25.501049 -69.576714 25.495676 -69.581131 25.490187 -69.585342 25.484602 -69.589333 25.478926 -69.593109 25.473175 -69.596664 25.467361 -69.599998 25.461496 -69.603104 25.455591 -69.605980 25.449663 -69.608635 25.443718 -69.611061 25.437773 -69.613274 25.431839 -69.615257 25.425928 -69.617027 25.420050 -69.618576 25.414219 -69.619911 25.408445 -69.621056 25.402742 -69.621986 25.397119 -69.622719 25.391583 -69.623276 25.388868 -69.623459 25.384409 -69.625450 25.378462 -69.627884 25.372517 -69.630081 25.366583 -69.632072 25.360672 -69.633835 25.354793 -69.635391 25.348965 -69.636726 25.343189 -69.637863 25.337486 -69.638802 25.331862 -69.639534 25.326328 -69.640083 25.321251 -69.640427 25.317467 -69.642120 25.311522 -69.644547 25.305576 -69.646751 25.299643 -69.648735 25.293730 -69.650497 25.287855 -69.652046 25.282023 -69.653389 25.276251 -69.654518 25.270546 -69.655457 25.264921 -69.656197 25.259388 -69.656738 25.254278 -69.657089 25.250519 -69.658768 25.244575 -69.661194 25.238630 -69.663391 25.232695 -69.665382 25.226784 -69.667145 25.220907 -69.668693 25.215076 -69.670036 25.209303 -69.671158 25.203598 -69.672096 25.197975 -69.672836 25.192440 -69.673378 25.187290 -69.673729 25.183571 -69.675392 25.177626 -69.677818 25.171680 -69.680016 25.165749 -69.681999 25.159836 -69.683762 25.153957 -69.685310 25.148128 -69.686653 25.142353 -69.687782 25.136650 -69.688713 25.131025 -69.689453 25.125492 -69.690002 25.120348 -69.690346 25.116621 -69.692009 25.110676 -69.694435 25.104729 -69.696640 25.098797 -69.698616 25.092884 -69.700378 25.087006 -69.701927 25.081175 -69.703262 25.075403 -69.704399 25.069698 -69.705322 25.064073 -69.706062 25.058542 -69.706619 25.053349 -69.706970 25.049671 -69.708610 25.043726 -69.711029 25.037781 -69.713226 25.031845 -69.715210 25.025934 -69.716972 25.020449 -69.718407 25.015844 -69.723053 25.010733 -69.727867 25.005482 -69.732475 25.000107 -69.736877 24.994619 -69.741066 24.989035 -69.745048 24.983357 -69.748802 24.977606 -69.752342 24.971792 -69.755661 24.965925 -69.758759 24.960022 -69.761627 24.954092 -69.764267 24.948147 -69.766685 24.942202 -69.768883 24.936268 -69.770859 24.930355 -69.772621 24.924477 -69.774170 24.918648 -69.775505 24.917700 -69.775688 24.915501 -69.777908 24.910387 -69.782707 24.905136 -69.787323 24.899761 -69.791718 24.894274 -69.795906 24.888689 -69.799881 24.883013 -69.803642 24.877260 -69.807175 24.871447 -69.810486 24.865580 -69.813576 24.859676 -69.816444 24.853746 -69.819092 24.847801 -69.821503 24.841856 -69.823700 24.835920 -69.825676 24.830009 -69.827438 24.824131 -69.828979 24.818300 -69.830307 24.817270 -69.830513 24.815134 -69.832657 24.810020 -69.837471 24.804770 -69.842064 24.799396 -69.846466 24.793907 -69.850647 24.788322 -69.854622 24.782646 -69.858376 24.776894 -69.861908 24.771080 -69.865219 24.765215 -69.868309 24.759310 -69.871170 24.753380 -69.873810 24.747433 -69.876221 24.741489 -69.878426 24.735554 -69.880394 24.729641 -69.882149 24.723763 -69.883697 24.717932 -69.885025 24.716831 -69.885239 24.714748 -69.887337 24.709635 -69.892136 24.704386 -69.896736 24.699011 -69.901123 24.693523 -69.905311 24.687937 -69.909279 24.682260 -69.913033 24.676508 -69.916565 24.670694 -69.919869 24.664827 -69.922958 24.658922 -69.925819 24.652994 -69.928452 24.647049 -69.930862 24.641102 -69.933060 24.635168 -69.935028 24.629255 -69.936783 24.623379 -69.938332 24.617548 -69.939659 24.616360 -69.939888 24.614336 -69.941925 24.609222 -69.946716 24.603972 -69.951317 24.598596 -69.955696 24.593111 -69.959877 24.587524 -69.963844 24.581848 -69.967590 24.576096 -69.971123 24.570282 -69.974426 24.564415 -69.977509 24.558510 -69.980370 24.552580 -69.983009 24.546637 -69.985420 24.540690 -69.987602 24.534754 -69.989578 24.528841 -69.991333 24.522966 -69.992867 24.517134 -69.994202 24.515883 -69.994446 24.513908 -69.996429 24.508797 -70.001213 24.503546 -70.005806 24.498171 -70.010201 24.492685 -70.014374 24.487099 -70.018333 24.481421 -70.022072 24.475670 -70.025597 24.469854 -70.028908 24.463989 -70.031982 24.458082 -70.034844 24.452152 -70.037476 24.446209 -70.039879 24.440262 -70.042076 24.434328 -70.044044 24.428413 -70.045799 24.422537 -70.047333 24.416706 -70.048668 24.415359 -70.048927 24.413460 -70.050835 24.408346 -70.055618 24.403095 -70.060211 24.397720 -70.064591 24.392233 -70.068764 24.386646 -70.072723 24.380970 -70.076462 24.375219 -70.079987 24.369404 -70.083290 24.363537 -70.086365 24.357632 -70.089218 24.351700 -70.091850 24.345755 -70.094254 24.339811 -70.096443 24.333876 -70.098419 24.327963 -70.100166 24.322085 -70.101700 24.316254 -70.103035 24.314840 -70.103310 24.312988 -70.105164 24.307875 -70.109955 24.302624 -70.114533 24.297251 -70.118912 24.291763 -70.123077 24.286175 -70.127037 24.280500 -70.130776 24.274746 -70.134293 24.268932 -70.137596 24.263065 -70.140671 24.257160 -70.143524 24.251230 -70.146149 24.245285 -70.148560 24.239340 -70.150742 24.233404 -70.152710 24.227491 -70.154457 24.221613 -70.155991 24.215782 -70.157318 24.214302 -70.157608 24.212496 -70.159416 24.207382 -70.164200 24.202131 -70.168770 24.196756 -70.173149 24.191269 -70.177315 24.185682 -70.181274 24.180006 -70.185013 24.174253 -70.188530 24.168440 -70.191818 24.162573 -70.194893 24.156668 -70.197739 24.150736 -70.200371 24.144793 -70.202774 24.138845 -70.204956 24.132912 -70.206917 24.126997 -70.208671 24.121119 -70.210205 24.115288 -70.211533 24.113716 -70.211838 24.111984 -70.213570 24.106871 -70.218346 24.101620 -70.222923 24.096247 -70.227295 24.090759 -70.231460 24.085171 -70.235413 24.079494 -70.239136 24.073742 -70.242653 24.067928 -70.245949 24.062061 -70.249023 24.056154 -70.251862 24.050226 -70.254494 24.044279 -70.256889 24.038334 -70.259079 24.032398 -70.261032 24.026485 -70.262787 24.020607 -70.264320 24.014774 -70.265648 24.013136 -70.265968 24.011454 -70.267647 24.006340 -70.272423 24.001087 -70.277000 23.995712 -70.281364 23.990225 -70.285523 23.984640 -70.289467 23.978962 -70.293198 23.973209 -70.296707 23.967394 -70.300003 23.961529 -70.303070 23.955624 -70.305916 23.949694 -70.308540 23.943747 -70.310936 23.937800 -70.313118 23.931864 -70.315086 23.925953 -70.316826 23.920074 -70.318359 23.914242 -70.319687 23.908468 -70.320808 23.902763 -70.321732 23.897139 -70.322456 23.891602 -70.323006 23.886168 -70.323372 23.880844 -70.323563 23.875639 -70.323586 23.870562 -70.323463 23.865623 -70.323189 23.860828 -70.322777 23.856188 -70.322243 23.851706 -70.321587 23.847389 -70.320824 23.843245 -70.319962 23.839275 -70.319016 23.835493 -70.317993 23.831894 -70.316917 23.828484 -70.315781 23.825268 -70.314606 23.822246 -70.313408 23.819420 -70.312195 23.816795 -70.310974 23.814367 -70.309761 23.812138 -70.308571 23.810104 -70.307411 23.808270 -70.306290 23.806627 -70.305237 23.805178 -70.304245 23.803917 -70.303329 23.802841 -70.302506 23.801947 -70.301781 23.801228 -70.301163 23.800680 -70.300674 23.800297 -70.300301 23.800072 -70.300079 23.799999 -70.300003 23.799925 -70.300079 23.799702 -70.300301 23.799318 -70.300674 23.798769 -70.301163 23.798050 -70.301781 23.797157 -70.302506 23.796080 -70.303329 23.794821 -70.304245 23.793371 -70.305237 23.791729 -70.306290 23.789894 -70.307404 23.787861 -70.308571 23.785631 -70.309753 23.783203 -70.310974 23.780577 -70.312187 23.777752 -70.313400 23.774729 -70.314598 23.771513 -70.315773 23.768103 -70.316910 23.764504 -70.317986 23.760717 -70.319000 23.756752 -70.319946 23.752606 -70.320808 23.748289 -70.321564 23.743807 -70.322220 23.739164 -70.322754 23.734369 -70.323166 23.729431 -70.323433 23.724354 -70.323563 23.719150 -70.323532 23.713825 -70.323334 23.708393 -70.322975 23.702856 -70.322426 23.697231 -70.321693 23.691526 -70.320770 23.685753 -70.319649 23.679920 -70.318329 23.674044 -70.316788 23.668131 -70.315048 23.662195 -70.313088 23.656248 -70.310913 23.650305 -70.308517 23.644371 -70.305901 23.638466 -70.303063 23.632599 -70.300003 23.626783 -70.296722 23.621031 -70.293221 23.615355 -70.289497 23.609766 -70.285561 23.604277 -70.281418 23.598902 -70.277069 23.593649 -70.272514 23.588533 -70.267754 23.583565 -70.262810 23.578753 -70.257675 23.574112 -70.252365 23.569647 -70.246887 23.565376 -70.241242 23.561302 -70.235443 23.557440 -70.229500 23.553793 -70.223427 23.550373 -70.217224 23.547186 -70.210907 23.544243 -70.204491 23.541546 -70.197983 23.539106 -70.191399 23.536928 -70.184738 23.535013 -70.178032 23.533371 -70.171272 23.532003 -70.164490 23.530914 -70.157692 23.530104 -70.150894 23.529579 -70.144104 23.529337 -70.137344 23.529383 -70.130608 23.529715 -70.123932 23.530333 -70.117325 23.531235 -70.110786 23.532417 -70.104347 23.533882 -70.098007 23.535627 -70.091782 23.537647 -70.085701 23.539934 -70.079750 23.542488 -70.073967 23.545301 -70.068344 23.548370 -70.062904 23.551685 -70.057663 23.555243 -70.052612 23.559032 -70.047783 23.563045 -70.043182 23.567207 -70.038727 23.571438 -70.034355 23.575739 -70.030067 23.580109 -70.025848 23.584543 -70.021728 23.589045 -70.017685 23.593611 -70.013725 23.598238 -70.009857 23.602930 -70.006081 23.607679 -70.002380 23.612490 -69.998779 23.617355 -69.995270 23.622276 -69.991852 23.627253 -69.988525 23.632280 -69.985290 23.637358 -69.982163 23.642488 -69.979118 23.647663 -69.976173 23.652889 -69.973335 23.658157 -69.970589 23.663467 -69.967949 23.668819 -69.965408 23.674213 -69.962959 23.679645 -69.960625 23.685114 -69.958382 23.690617 -69.956253 23.696154 -69.954224 23.701723 -69.952301 23.703602 -69.951691 23.708218 -69.948105 23.713026 -69.944496 23.717890 -69.940979 23.722811 -69.937561 23.727787 -69.934235 23.732815 -69.931000 23.737896 -69.927857 23.743025 -69.924820 23.748201 -69.921875 23.753424 -69.919029 23.758694 -69.916283 23.764004 -69.913635 23.769356 -69.911095 23.774750 -69.908646 23.780180 -69.906311 23.785650 -69.904068 23.791151 -69.901939 23.796690 -69.899902 23.802257 -69.897987 23.804031 -69.897408 23.808733 -69.893746 23.813540 -69.890137 23.818405 -69.886620 23.823328 -69.883194 23.828302 -69.879860 23.833330 -69.876625 23.838409 -69.873482 23.843538 -69.870445 23.848713 -69.867493 23.853937 -69.864647 23.859205 -69.861900 23.864517 -69.859253 23.869869 -69.856705 23.875263 -69.854256 23.880693 -69.851913 23.886162 -69.849670 23.891664 -69.847542 23.897204 -69.845505 23.902769 -69.843582 23.904394 -69.843056 23.904478 -69.842987 23.909229 -69.839287 23.914036 -69.835678 23.918903 -69.832153 23.923822 -69.828735 23.928797 -69.825401 23.933825 -69.822159 23.938904 -69.819016 23.944035 -69.815964 23.949209 -69.813026 23.954433 -69.810165 23.959702 -69.807419 23.965013 -69.804772 23.970364 -69.802216 23.975758 -69.799774 23.981188 -69.797432 23.986658 -69.795189 23.992159 -69.793053 23.997698 -69.791016 24.003265 -69.789093 24.004765 -69.788605 24.004953 -69.788452 24.009703 -69.784752 24.014511 -69.781136 24.019377 -69.777618 24.024298 -69.774185 24.029274 -69.770844 24.034298 -69.767609 24.039379 -69.764458 24.044506 -69.761414 24.049683 -69.758461 24.054907 -69.755608 24.060175 -69.752853 24.065485 -69.750206 24.070839 -69.747650 24.076231 -69.745209 24.081663 -69.742859 24.087130 -69.740616 24.092632 -69.738472 24.098171 -69.736435 24.103737 -69.734512 24.105146 -69.734055 24.105408 -69.733841 24.110157 -69.730141 24.114965 -69.726517 24.119831 -69.722992 24.124752 -69.719559 24.129726 -69.716225 24.134756 -69.712982 24.139833 -69.709831 24.144960 -69.706780 24.150139 -69.703827 24.155359 -69.700974 24.160627 -69.698212 24.165939 -69.695564 24.171291 -69.693008 24.176683 -69.690559 24.182114 -69.688210 24.187586 -69.685959 24.193087 -69.683823 24.198622 -69.681786 24.204191 -69.679855 24.205463 -69.679443 24.205837 -69.679138 24.210587 -69.675423 24.215395 -69.671799 24.220261 -69.668281 24.225180 -69.664841 24.230158 -69.661499 24.235184 -69.658249 24.240263 -69.655106 24.245390 -69.652046 24.250566 -69.649094 24.255791 -69.646240 24.261057 -69.643478 24.266369 -69.640823 24.271721 -69.638268 24.277113 -69.635811 24.282543 -69.633461 24.288014 -69.631218 24.293516 -69.629074 24.299051 -69.627037 24.304621 -69.625107 24.305779 -69.624733 24.306255 -69.624344 24.311003 -69.620628 24.315811 -69.617012 24.320677 -69.613480 24.325598 -69.610039 24.330572 -69.606697 24.335600 -69.603447 24.340679 -69.600288 24.345806 -69.597237 24.350983 -69.594276 24.356205 -69.591415 24.361473 -69.588661 24.366785 -69.585999 24.372135 -69.583443 24.377527 -69.580986 24.382959 -69.578636 24.388428 -69.576385 24.393931 -69.574242 24.399467 -69.572205 24.405037 -69.570274 24.406046 -69.569946 24.406643 -69.569458 24.411394 -69.565743 24.416201 -69.562119 24.421064 -69.558586 24.425985 -69.555145 24.430962 -69.551796 24.435988 -69.548546 24.441067 -69.545387 24.446196 -69.542336 24.451372 -69.539375 24.456595 -69.536507 24.461861 -69.533752 24.467173 -69.531090 24.472523 -69.528534 24.477917 -69.526070 24.483347 -69.523720 24.488815 -69.521462 24.494318 -69.519318 24.499855 -69.517273 24.505421 -69.515343 24.506342 -69.515045 24.507013 -69.514496 24.511763 -69.510780 24.516569 -69.507149 24.521435 -69.503616 24.526356 -69.500168 24.531332 -69.496819 24.536356 -69.493569 24.541437 -69.490410 24.546564 -69.487343 24.551741 -69.484383 24.556961 -69.481522 24.562229 -69.478752 24.567539 -69.476089 24.572893 -69.473526 24.578283 -69.471069 24.583715 -69.468712 24.589184 -69.466461 24.594686 -69.464317 24.600222 -69.462273 24.605791 -69.460335 24.606569 -69.460083 24.607363 -69.459435 24.612112 -69.455719 24.616919 -69.452080 24.621784 -69.448547 24.626705 -69.445091 24.631679 -69.441742 24.636705 -69.438492 24.641787 -69.435326 24.646914 -69.432259 24.652088 -69.429298 24.657310 -69.426437 24.662579 -69.423668 24.667889 -69.420998 24.673241 -69.418434 24.678633 -69.415977 24.684063 -69.413612 24.689531 -69.411362 24.695034 -69.409210 24.696854 -69.408539 24.698254 -69.407356 24.702946 -69.403549 24.707693 -69.399818 24.712500 -69.396187 24.717365 -69.392639 24.722286 -69.389198 24.727261 -69.385834 24.732286 -69.382576 24.737366 -69.379417 24.742493 -69.376350 24.747669 -69.373383 24.752891 -69.370514 24.758158 -69.367744 24.763470 -69.365082 24.768818 -69.362511 24.774214 -69.360054 24.779642 -69.357689 24.785112 -69.355438 24.790611 -69.353287 24.796150 -69.351234 24.801716 -69.349297 24.807314 -69.347465 24.812943 -69.345734 24.818592 -69.344116 24.824272 -69.342606 24.829971 -69.341202 24.835693 -69.339912 24.841434 -69.338730 24.847193 -69.337654 24.852970 -69.336685 24.858763 -69.335838 24.859652 -69.335724 24.863100 -69.334450 24.868668 -69.332504 24.874266 -69.330673 24.879890 -69.328949 24.885544 -69.327331 24.891222 -69.325813 24.896921 -69.324409 24.902645 -69.323120 24.908384 -69.321930 24.914145 -69.320862 24.919922 -69.319900 24.925711 -69.319046 24.926533 -69.318939 24.930054 -69.317635 24.935621 -69.315697 24.941215 -69.313858 24.946844 -69.312134 24.952494 -69.310516 24.958174 -69.308998 24.963873 -69.307594 24.969593 -69.306297 24.975336 -69.305115 24.981096 -69.304039 24.986872 -69.303078 24.992661 -69.302223 24.993481 -69.302116 24.997002 -69.300812 25.002569 -69.298874 25.008165 -69.297035 25.013792 -69.295311 25.019443 -69.293686 25.025122 -69.292175 25.030821 -69.290764 25.036543 -69.289467 25.042286 -69.288284 25.048044 -69.287209 25.053820 -69.286247 25.059608 -69.285393 25.060396 -69.285294 25.063950 -69.283974 25.069515 -69.282028 25.075115 -69.280197 25.080740 -69.278458 25.086391 -69.276840 25.092070 -69.275322 25.097769 -69.273918 25.103491 -69.272629 25.109234 -69.271439 25.114992 -69.270363 25.120768 -69.269394 25.126558 -69.268539 25.127300 -69.268448 25.130892 -69.267113 25.136459 -69.265167 25.142055 -69.263329 25.147682 -69.261597 25.153334 -69.259972 25.159008 -69.258461 25.164711 -69.257050 25.170433 -69.255753 25.176172 -69.254570 25.181933 -69.253494 25.187708 -69.252525 25.190891 -69.252052 25.196148 -69.250099 25.201713 -69.248154 25.207312 -69.246315 25.212938 -69.244583 25.218588 -69.242966 25.224266 -69.241448 25.229965 -69.240036 25.235687 -69.238739 25.241428 -69.237549 25.247189 -69.236473 25.252962 -69.235512 25.258755 -69.234650 25.264555 -69.233902 25.270371 -69.233276 25.276192 -69.232750 25.282023 -69.232338 25.287859 -69.232048 25.293697 -69.231857 25.299540 -69.231789 25.305382 -69.231819 25.311220 -69.231972 25.317059 -69.232239 25.322893 -69.232613 25.328714 -69.233101 25.334532 -69.233696 25.340340 -69.234405 25.346134 -69.235230 25.351914 -69.236160 25.357677 -69.237205 25.363426 -69.238357 25.369154 -69.239624 25.374859 -69.241005 25.380545 -69.242485 25.386204 -69.244072 25.391836 -69.245781 25.397442 -69.247589 25.403019 -69.249504 25.408566 -69.251533 25.414076 -69.253662 25.419554 -69.255905 25.424994 -69.258240 25.430397 -69.260696 25.435759 -69.263245 25.441082 -69.265900 25.446361 -69.268654 25.451595 -69.271507 25.456785 -69.274460 25.461925 -69.277519 25.467016 -69.280678 25.472057 -69.283928 25.477045 -69.287277 25.481979 -69.290726 25.486858 -69.294266 25.491680 -69.297897 25.496443 -69.301628 25.501146 -69.305443 25.505789 -69.309349 25.510368 -69.313347 25.514885 -69.317429 25.519335 -69.321594 25.523716 -69.325851 25.528032 -69.330200 25.532278 -69.334618 25.536453 -69.339127 25.540484 -69.343781 25.544287 -69.348679 25.547859 -69.353790 25.551191 -69.359100 25.554277 -69.364624 25.557108 -69.370316 25.559675 -69.376190 25.561981 -69.382225 25.564016 -69.388405 25.565777 -69.394714 25.567259 -69.401154 25.568460 -69.407700 25.569378 -69.414337 25.570011 -69.421051 25.570358 -69.427841 + + + + + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/wms_meris.xml owslib-0.18.0/tests/resources/owc_atom_examples/wms_meris.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/wms_meris.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/wms_meris.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,154 @@ + + + + Satellite Image and Countries borders Over France and England + https://github.com/Terradue/trax/tree/master/owc/bin/../examples/meris_borders.atom/ + Two WMS layers giving from different servers + 2012-09-12T12:46:22 + + Pedro Gonçalves + + Terradue srl. + + OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) + + + 300 + 500 + 0.28 + + + Terradue Srl. + Copyright (c) 2012. Some rights reserved. This feed is + licensed under a Creative Commons Attribution 3.0 License. + + + + 355000 4539000 + 475000 4619000 + + + + + + + + http://geoserver.sourceforge.net/html/index.php/ + MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif + + GeoServer Administrator + info@genesi-dec.eu + + ESA + 2012-09-12T12:46:16Z + Fee:NONE / Contraints:NONE + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + <br/> + <img border='1' align='right' height='100'src='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&BBOX=-2,45,8,55&WIDTH=100&HEIGHT=100&LAYERS=385d7d71-650a-414b-b8c7-739e2c0b5e76:MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif&STYLES=raster&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'/> + + <br/> + This resource is available from a OGC WMS 1.1.1 Service + <ul> + <li> + <a href='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&BBOX=-2,45,8,55&WIDTH=500&HEIGHT=500&LAYERS=385d7d71-650a-414b-b8c7-739e2c0b5e76:MER_RR__2PRLRA20120406_102429_000026213113_00238_52838_0211.N1.tif&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'> + GetMap </a> request in image/png + <a href='http://ows.genesi-dec.eu/geoserver/385d7d71-650a-414b-b8c7-739e2c0b5e76/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities'> + </li> + <li> + GetCapabilities </a> request. + </li> + </ul> + Generated from session 385d7d71-650a-414b-b8c7-739e2c0b5e76 on Mon Sep 10 17:49:17 UTC 2012 + <p style='font-size:small'>OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) by Terradue Srl.</p> + + + + + + + + http://nsidc.org/ + countries + + NSIDC User Services + nsidc@nsidc.org + + Socioeconomic Data and Applications Center + National Snow and Ice Data Center + 2012-09-12T12:46:17Z + Fee:none / Contraints:none + + + + + 45 -2 45 8 55 8 55 -2 45 -2 + + + + + + + + + + + <br/> + <img border='1' align='right' height='100'src='http://nsidc.org/cgi-bin/atlas_north?VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&BBOX=-2,45,8,55&WIDTH=100&HEIGHT=100&LAYERS=country_borders&STYLES=&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'/> + + <b><a href='http://sedac.ciesin.columbia.edu'>Socioeconomic Data and Applications Center</a></b> + + <img src='http://sedac.ciesin.columbia.edu/images/logo.jpg' hspace='20' align='left' width='53' height='60'> + + <br/> + This resource is available from a OGC WMS 1.1.1 Service + <ul> + <li> + <a href='http://nsidc.org/cgi-bin/atlas_north?VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&BBOX=-2,45,8,55&WIDTH=500&HEIGHT=500&LAYERS=country_borders&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml'> + GetMap </a> request in image/png + <a href='http://nsidc.org/cgi-bin/atlas_north?VERSION=1.1.1&REQUEST=GetCapabilities'> + </li> + <li> + GetCapabilities </a> request. + </li> + <li> + DataURL is available <a href='http://sedac.ciesin.columbia.edu/gpw/global.jsp?file=gpwv3&data=c_ntlbnd&type=shp&year=2000'> + shapefile + </a> + </li> + </ul> + Center for International Earth Science Information Network (CIESIN), Columbia University; and Centro Internacional de Agricultura Tropical (CIAT). 2005. Gridded Population of the World Version 3 (GPWv3): National Boundaries. Palisades, NY, USA: Socioeconomic Data and Applications Center (SEDAC), Columbia University. Available at http://sedac.ciesin.columbia.edu/gpw. 19 January 2007. Background: National boundaries derived from the Gridded Population of the World (GPW) country-level land area grids at 2.5 arc-minute resolution. Permanent ice and all but large lakes have been merged with neighbouring polygons to make a layer more appropriate for cartographic visualization of the data. Does not include Antarctica. + <p style='font-size:small'>OGC Context CITE Testing XSLT (Extensible Stylesheet Language Transformations) by Terradue Srl.</p> + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/wms_scale.xml owslib-0.18.0/tests/resources/owc_atom_examples/wms_scale.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/wms_scale.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/wms_scale.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,79 @@ + + + + http://www.opengis.net/owc/1.0/examples/WMS_scale + Ortofotoimatge de Barcelona 1:5 000 [ICC] + + Finestra l'ortofotoimatge de Catalunya 1:5 000 [ICC] + + + Joan Maso + + 2012-11-04T17:26:23Z + + + 600 + 400 + + + + + 414475 4567125 + 451575 4588025 + + + MiraMon + + http://shagrat.icc.es/lizardtech/iserv/ows/orto5m + Ortofotoimatge de Barcelona 1:5 000 [ICC] + + ICC + icc@icc.cat + + 2011-11-01T00:00:00Z + CREAF + + + 414475 4567125 + 451575 4588025 + + + Ortofotoimatge de Barcelona 1:5 000 de l'Institut Cartogràfic de Catalunya (la més actual disponible) + + + + + 2500 + 25000 + + + http://shagrat.icc.es/lizardtech/iserv/ows/orto5m + Ortofotoimatge de Barcelona 1:25 000 [ICC] + + ICC + icc@icc.cat + + 2011-11-01T00:00:00Z + CREAF + + + 414475 4567125 + 451575 4588025 + + + Ortofotoimatge de Barcelona 1:25 000 de l'Institut Cartogràfic de Catalunya (la més actual disponible) + + + + + 25000 + 250000 + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/wmstestdata.xml owslib-0.18.0/tests/resources/owc_atom_examples/wmstestdata.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/wmstestdata.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/wmstestdata.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,54 @@ + + + + http://www.opengis.net/owc/1.0/examples/geotiff + Shapefiles from WMS 1.3 CITE tests + + Raj Singh + + 2013-12-10T17:26:23Z + + + -0.00421353 -0.00379659 + 0.00628647 0.00350506 + + + + http://www.rajsingh.org/wmstestdata/shapefile/Buildings + Buildings + 2013-12-10T17:26:23Z + OGC + Buildings from http://www.rajsingh.org/wmstestdata/shapefile/ + + + + + + http://www.rajsingh.org/wmstestdata/shapefile/Lakes + Lakes + 2013-12-10T17:26:23Z + OGC + Lakes from http://www.rajsingh.org/wmstestdata/shapefile/ + + + + + + http://www.rajsingh.org/wmstestdata/shapefile/Forests + Forests + 2013-12-10T17:26:23Z + OGC + Forests from http://www.rajsingh.org/wmstestdata/shapefile/ + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/wmts.xml owslib-0.18.0/tests/resources/owc_atom_examples/wmts.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/wmts.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/wmts.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,31 @@ + + + + http://www.opengis.net/owc/1.0/examples/wmts + WMTS Example + + WMTS Example + + + Joan Masó + + 2012-11-04T17:26:23Z + + http://www.opengis.net/spec/owc-atom/1.0/req/wmts/1 + WMTS Example + 2011-11-01T00:00:00Z + CREAF + WMTS example + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_atom_examples/wps_52north.xml owslib-0.18.0/tests/resources/owc_atom_examples/wps_52north.xml --- owslib-0.16.0/tests/resources/owc_atom_examples/wps_52north.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_atom_examples/wps_52north.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,66 @@ + + + + http://www.opengis.net/owc/1.0/examples/wps_52north + WPS 52North example + + WPS 52North example + + + Joan Masó + + 2012-11-04T17:26:23Z + + + 600 + 400 + + + http://geoprocessing.demo.52north.org:8080/wps/WebProcessingService + WPS 52 north + 2013-05-19T00:00:00Z + CREAF + + WPS 52North + + + + + + + org.n52.wps.server.algorithm.SimpleBufferAlgorithm + + + data + + + + width + + 0.05 + + + + + + + result + result + result + + + + + + + + + + diff -Nru owslib-0.16.0/tests/resources/owc_geojson_examples/from-meta-resource.json owslib-0.18.0/tests/resources/owc_geojson_examples/from-meta-resource.json --- owslib-0.16.0/tests/resources/owc_geojson_examples/from-meta-resource.json 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_geojson_examples/from-meta-resource.json 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,62 @@ +{ + "type": "Feature", + "id": "http://portal.smart-project.info/context/resource/abdb00fb-cd9b-4052-93c4-15bafd01b52a_copy_bf7bc0f3-3c6b-4350-9c19-7d7f534302d2", + "properties": { + "title": "test1", + "abstract": "abstra", + "updated": "2017-10-22T12:00:00Z", + "authors": [ + { + "name": "Alex", + "email": "alex@gmail.com", + "uri": "http://www.gns.de" + } + ], + "publisher": "publisher", + "rights": "Check with source agency", + "links": { + "alternates": [], + "previews": [], + "data": [], + "via": [ + { + "href": "http://portal.smart-project.info/context/resource/abdb00fb-cd9b-4052-93c4-15bafd01b52a_copy_bf7bc0f3-3c6b-4350-9c19-7d7f534302d2", + "type": "application/json", + "rel": "via" + }, + { + "href": "https://portal.smart-project.info/pycsw/csw?request=GetRecordById&service=CSW&version=2.0.2&elementSetName=full&outputSchema=http://www.isotc211.org/2005/gmd&id=abdb00fb-cd9b-4052-93c4-15bafd01b52a", + "type": "application/xml", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?request=GetRecordById&service=CSW&version=2.0.2&elementSetName=full&outputSchema=http://www.isotc211.org/2005/gmd&id=abdb00fb-cd9b-4052-93c4-15bafd01b52a" + } + ], + "contents": [], + "styles": [] + } + ], + "categories": [ + { + "term": "hydr" + } + ], + "minscaledenominator": 1000000 + } +} diff -Nru owslib-0.16.0/tests/resources/owc_geojson_examples/ingest1.owc.geojson owslib-0.18.0/tests/resources/owc_geojson_examples/ingest1.owc.geojson --- owslib-0.16.0/tests/resources/owc_geojson_examples/ingest1.owc.geojson 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_geojson_examples/ingest1.owc.geojson 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,137 @@ +{ + "type": "FeatureCollection", + "id": "https://portal.smart-project.info/cswi-api/v1/query?query=xyz&uuid=970c4033-2191-4d1a-a6d5-78f279f3258e&contentType=OwcContext", + "bbox": [0, -47.93848, -1, 0], + "properties": { + "links": { + "profiles": [{ + "href": "http://www.opengis.net/spec/owc-geojson/1.0/req/core", + "rel": "profile" + }], + "via": [] + }, + "lang": "en", + "title": "Search result CSW ingester", + "subtitle": "Subtitle", + "updated": "2017-06-30T10:29:42.678+03:00", + "authors": [], + "categories": [] + }, + "features": [{ + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/5addcae9-bbbb-3333-85e2-8b1a01d43c64", + "properties": { + "title": "Geothermal and GroundWater database (GGW)", + "abstract": "The GGW database is operated and maintained by the Institute of Geological and Nuclear Sciences Limited (GNS Science). It contains geochemical (chemistry and sampling), hydrological, geological and/or geophysical information for Sites (Features) in New Zealand. Included in the database are the datasets for the National Groundwater Monitoring Programme (NGMP) and Wairaikei Analytical, Recording, Thermo Dynamic System (WARTS) projects maintained and operated by GNS Science. The database design was adapted for New Zealand from Australian Standards.", + "updated": "2015-03-25T00:00:00+02:00", + "authors": [{ + "email": "records@gns.cri.nz", + "uuid": "3fce54f3-2a18-47cf-bd32-3acdc7e1d4b5" + }], + "rights": ", ", + "links": { + "alternates": [{ + "href": "http://ggw.gns.cri.nz/ggwdata/", + "type": "text/html", + "title": "Geothermal and GroundWater database (GGW)", + "rel": "alternate", + "uuid": "fc4bb73c-cda8-43d6-b08f-a3a13eb4e3de" + }], + "previews": [], + "data": [], + "via": [] + }, + "offerings": [{ + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [{ + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "http://data.gns.cri.nz/metadata/srv/eng/csw?request=GetCapabilities&service=CSW", + "uuid": "0dc9c661-0aed-41c0-a56f-ff4aff1dbc17" + }, { + "code": "GetRecordById", + "method": "GET", + "type": "application/xml", + "href": "http://data.gns.cri.nz/metadata/srv/eng/csw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=5addcae9-8a4f-49be-85e2-8b1a01d43c64", + "uuid": "93d93ca4-35e2-4ab8-88e9-3e37c43d2dc8" + }], + "contents": [], + "styles": [], + "uuid": "808fa8e6-cba2-4c5d-9e59-3681f058000a" + }], + "categories": [], + "folder": "7.9232802" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [166, -47.8333], + [166, -34], + [179, -34], + [179, -47.8333], + [166, -47.8333] + ] + ] + } + }, { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/262b309d-b270-4321-abdc-ed8fa6db47f1", + "properties": { + "title": "Algorithm for the interpretation of groundwater field experiments", + "abstract": "Field experiments on the depth distributions of a solute in sandy soil under general conditions are discussed. Special consideration is given to the effects of multiple pulses and the proximity of the solute to the phreatic zone. The depth distribution of a tracer is analysed utilizing a general mathematical model proposed in a previous paper by the author, and applied to two illustrative examples.", + "updated": "2014-11-04T00:00:00+02:00", + "authors": [{ + "name": "Grassia, A., Grassia, A.", + "email": "admin@hydrologynz.org.nz", + "uuid": "2d71d956-5f9e-473f-9af1-be12150436c0" + }], + "rights": ", ", + "links": { + "alternates": [{ + "href": "http://www.hydrologynz.co.nz/journal.php?article_id=237", + "type": "text/html", + "rel": "alternate", + "uuid": "cf02e473-efba-490b-98f2-bc8308252c22" + }], + "previews": [], + "data": [], + "via": [] + }, + "offerings": [{ + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [{ + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?request=GetCapabilities&service=CSW", + "uuid": "6774d97b-666f-4019-88b3-8df415a52dfb" + }, { + "code": "GetRecordById", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=262b309d-b270-4028-abdd-ed8fa6db47f1", + "uuid": "f48a290a-5bb0-4789-86e9-cfbcb3d24f29" + }], + "contents": [], + "styles": [], + "uuid": "4e0fea7e-c86b-4089-a1f9-3442972f20d4" + }], + "categories": [], + "folder": "7.435972" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [165.3906, -47.93848], + [165.3906, -34.02613], + [178.73954, -34.02613], + [178.73954, -47.93848], + [165.3906, -47.93848] + ] + ] + } + }] +} diff -Nru owslib-0.16.0/tests/resources/owc_geojson_examples/newzealand-overview.json owslib-0.18.0/tests/resources/owc_geojson_examples/newzealand-overview.json --- owslib-0.16.0/tests/resources/owc_geojson_examples/newzealand-overview.json 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_geojson_examples/newzealand-overview.json 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,1624 @@ +{ + "type": "FeatureCollection", + "id": "https://portal.smart-project.info/context/document/dc6e1bfc-722d-422b-ab50-9687e31588ea", + "bbox": [ + 164, + -48, + 180, + -33 + ], + "properties": { + "links": { + "profiles": [ + { + "href": "http://www.opengis.net/spec/owc-geojson/1.0/req/core", + "rel": "profile" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/document/dc6e1bfc-722d-422b-ab50-9687e31588ea", + "rel": "via" + } + ] + }, + "lang": "en", + "title": "New Zealand", + "subtitle": "Overview Other Databases", + "updated": "2018-02-16T04:14:56.884Z", + "generator": { + "title": "Groundwater Hub" + }, + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "categories": [ + { + "scheme": "view-groups", + "term": "nz", + "label": "New Zealand" + } + ] + }, + "features": [ + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/793d8d66-0704-476a-9714-a523776440bc", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:matata_model", + "abstract": "Matata geological model", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:matata_model", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Matata geological model:horowhenua_ws:matata_model" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/793d8d66-0704-476a-9714-a523776440bc", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:matata_model&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_overview", + "label": "Overview" + } + ], + "active": false, + "folder": "nz_overview" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/6a0b6f74-a21a-48e7-81d0-59ed86d1b9d9", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:tauranga_model", + "abstract": "Tauranga geological model", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:tauranga_model", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Tauranga geological model:horowhenua_ws:tauranga_model" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/6a0b6f74-a21a-48e7-81d0-59ed86d1b9d9", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:tauranga_model&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_overview", + "label": "Overview" + } + ], + "active": false, + "folder": "nz_overview" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/34c035f8-a37f-48d9-a195-77abf89c603a", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:rotorua_model", + "abstract": "Rotorua geological model", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:rotorua_model", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Rotorua geological model:horowhenua_ws:rotorua_model" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/34c035f8-a37f-48d9-a195-77abf89c603a", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:rotorua_model&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_overview", + "label": "Overview" + } + ], + "active": false, + "folder": "nz_overview" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/ab039916-6c52-457b-b347-a39b16881d84", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:rangitaiki_model", + "abstract": "Rangitaiki geological model", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:rangitaiki_model", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Rangitaiki geological model:horowhenua_ws:rangitaiki_model" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/ab039916-6c52-457b-b347-a39b16881d84", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:rangitaiki_model&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_overview", + "label": "Overview" + } + ], + "active": false, + "folder": "nz_overview" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/efb30f12-a5fa-4690-93f6-226db68f83fe", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:study_area", + "abstract": "Horowhenua Area", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:study_area", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Horowhenua Area:horowhenua_ws:study_area" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/efb30f12-a5fa-4690-93f6-226db68f83fe", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:study_area&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_overview", + "label": "Overview" + } + ], + "active": false, + "folder": "nz_overview" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/f33ece17-699c-47ce-a32d-2096d8bdc66b", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:ngmp-locations", + "abstract": "NGMP Sites", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:ngmp-locations", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "NGMP Sites:horowhenua_ws:ngmp-locations" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/f33ece17-699c-47ce-a32d-2096d8bdc66b", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:ngmp-locations&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_overview", + "label": "Overview" + } + ], + "active": true, + "folder": "nz_overview" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/8e34aba8-9baf-4ec4-a9c0-e3a23373df4c", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "layer-50765", + "abstract": "Linz NZ Terrain Relief (Topo50)", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://data.linz.govt.nz/services;key=a8fb9bcd52684b7abe14dd4664ce9df9/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=layer-50765", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://data.linz.govt.nz/services;key=a8fb9bcd52684b7abe14dd4664ce9df9/wms", + "type": "application/xml", + "title": "Linz NZ Terrain Relief (Topo50):layer-50765" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/8e34aba8-9baf-4ec4-a9c0-e3a23373df4c", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://data.linz.govt.nz/services;key=a8fb9bcd52684b7abe14dd4664ce9df9/wms?VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://data.linz.govt.nz/services;key=a8fb9bcd52684b7abe14dd4664ce9df9/wms?VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=layer-50765&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_other", + "label": "Other Databases" + } + ], + "active": false, + "folder": "nz_other" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/a85efb1b-cabb-4110-b297-553dcb3fbaa9", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "layer-50767", + "abstract": "Linz NZ Mainland Topo50", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://data.linz.govt.nz/services;key=a8fb9bcd52684b7abe14dd4664ce9df9/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=layer-50767", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://data.linz.govt.nz/services;key=a8fb9bcd52684b7abe14dd4664ce9df9/wms", + "type": "application/xml", + "title": "Linz NZ Mainland Topo50:layer-50767" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/a85efb1b-cabb-4110-b297-553dcb3fbaa9", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://data.linz.govt.nz/services;key=a8fb9bcd52684b7abe14dd4664ce9df9/wms?VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://data.linz.govt.nz/services;key=a8fb9bcd52684b7abe14dd4664ce9df9/wms?VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=layer-50767&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_other", + "label": "Other Databases" + } + ], + "active": false, + "folder": "nz_other" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/15841571-e317-4a1e-9f41-1f55b2f71e16", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "gns:NZL_GNS_1M_Lithostratigraphy", + "abstract": "NZ GNS QMAP", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://maps.gns.cri.nz/geology/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=gns:NZL_GNS_1M_Lithostratigraphy", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://maps.gns.cri.nz/geology/wms", + "type": "application/xml", + "title": "NZ GNS QMAP:gns:NZL_GNS_1M_Lithostratigraphy" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/15841571-e317-4a1e-9f41-1f55b2f71e16", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://maps.gns.cri.nz/geology/wms?VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://maps.gns.cri.nz/geology/wms?VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=gns:NZL_GNS_1M_Lithostratigraphy&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_other", + "label": "Other Databases" + } + ], + "active": false, + "folder": "nz_other" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/f70fa53b-f5dd-4d65-aff7-4ceb48541153", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:nz-dtm-100x100", + "abstract": "NZ DTM 100x100", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:nz-dtm-100x100", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "NZ DTM 100x100:horowhenua_ws:nz-dtm-100x100" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/f70fa53b-f5dd-4d65-aff7-4ceb48541153", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:nz-dtm-100x100&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_other", + "label": "Other Databases" + } + ], + "active": false, + "folder": "nz_other" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/a002ec99-aa49-42c6-b189-3000b332a0d5", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:nz_aquifers", + "abstract": "NZ Aquifers (White 2001)", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:nz_aquifers", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "NZ Aquifers (White 2001):horowhenua_ws:nz_aquifers" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/a002ec99-aa49-42c6-b189-3000b332a0d5", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:nz_aquifers&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_other", + "label": "Other Databases" + } + ], + "active": false, + "folder": "nz_other" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/c0567f4a-62cf-4c38-a440-e79fae300623", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:nz_regions", + "abstract": "New Zealand regions", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:nz_regions", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "New Zealand regions:horowhenua_ws:nz_regions" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/c0567f4a-62cf-4c38-a440-e79fae300623", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:nz_regions&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_other", + "label": "Other Databases" + } + ], + "active": true, + "folder": "nz_other" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/b4b5b871-1b88-487f-b7fc-281a6832c204", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:DTS_Cable_Position", + "abstract": "DTS Cable Position(Ngongotaha Valley)", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:DTS_Cable_Position", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "DTS Cable Position(Ngongotaha Valley):horowhenua_ws:DTS_Cable_Position" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/b4b5b871-1b88-487f-b7fc-281a6832c204", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:DTS_Cable_Position&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "nz_other", + "label": "Other Databases" + } + ], + "active": false, + "folder": "nz_other" + } + } + ] +} \ No newline at end of file diff -Nru owslib-0.16.0/tests/resources/owc_geojson_examples/owc1.geojson owslib-0.18.0/tests/resources/owc_geojson_examples/owc1.geojson --- owslib-0.16.0/tests/resources/owc_geojson_examples/owc1.geojson 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_geojson_examples/owc1.geojson 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,94 @@ +{ + "type": "FeatureCollection", + "id": "http://www.opengis.net/owc/1.0/examples/wps_52north/", + "properties": { + "lang": "en", + "title": "WPS 52North example", + "subtitle": "WPS 52North example", + "updated": "2012-11-04T17:26:23Z", + "publisher": "OGC and 52North", + "authors": [ + { + "name": "Joan Masó" + } + ], + "date": "2012-11-04T17:26:23Z", + "links": { + "profiles": [ + { + "rel": "profile", + "href": "http://www.opengis.net/spec/owc-geojson/1.0/req/core", + "title": "This file is compliant with version 1.0 of OGC Context" + } + ] + } + }, + "features": [ + { + "type": "Feature", + "id": "http://geoprocessing.demo.52north.org:8080/wps/WebProcessingService/process1/", + "geometry": null, + "properties": { + "title": "WPS 52 north", + "updated": "2013-05-19T00:00:00Z", + "abstract": "abstract about data", + "authors": [], + "categories": [], + "date": "2013-11-02T15:24:24.446+12:00", + "links": { + "alternates" : [], + "previews" : [], + "data" : [{ + "href" : "http://www.acme.com/products/algal20090123090856.hdf", + "type" : "application/x-hdf5", + "length" : 453123432, + "title" : "HDF file for the entry 2009-01-23 09:08:56" + }], + "via" : [{ + "rel": "via", + "type": "application/xml", + "href": "http://www.opengis.uab.cat/wms/satcat/metadades/EPSG_23031/Cat_20110301.htm", + "title": "HMTL metadata in Catalan (nothing to do with this WPS. Sorry!)" + }] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wps", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "http://geoprocessing.demo.52north.org:8080/wps/WebProcessingService?SERVICE=WPS&VERSION=1.0.0&REQUEST=GetCapabilities" + }, + { + "code": "DescribeProcess", + "method": "GET", + "type": "application/xml", + "href": "http://geoprocessing.demo.52north.org:8080/wps/WebProcessingService?REQUEST=DescribeProcess&SERVICE=WPS&identifier=org.n52.wps.server.algorithm.SimpleBufferAlgorithm" + }, + { + "code": "Execute", + "method": "POST", + "type": "text/xml", + "href": "http://geoprocessing.demo.52north.org:8080/wps/WebProcessingService?", + "request": { + "type": "text/xml", + "content": "org.n52.wps.server.algorithm.SimpleBufferAlgorithmdatawidth0.05resultresultresult" + } + } + ], + "contents": [ + { + "type": "application/gml+xml", + "title": "ID_ROADS1:M30", + "content": "\n \n 300 200350 222\n \n 4.1M30\n", + "uuid": "b9ea2498-fb32-40ef-91ef-0ba00060fe64" + } + ] + } + ] + } + } + ] +} diff -Nru owslib-0.16.0/tests/resources/owc_geojson_examples/owc2.geojson owslib-0.18.0/tests/resources/owc_geojson_examples/owc2.geojson --- owslib-0.16.0/tests/resources/owc_geojson_examples/owc2.geojson 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_geojson_examples/owc2.geojson 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,166 @@ +{ + "type": "FeatureCollection", + "id": "http://ows-9.compusult.net/wes/serviceManagerCSW/csw/0006276a-4f6e-47c1-94bb-f604245fac57/", + "bbox": [-180.0, -90.0, 180.0, 90.0], + "properties": { + "lang": "en", + "title": "Compusult CSW", + "subtitle": "An ATOM record version of Compusult's CSW using OWS-Context", + "generator": { + "title": "Web Enterprise Suite" + }, + "updated": "2013-01-02T15:24:24.446-03:30", + "authors": [], + "categories": [], + "links": { + "profiles": [ + { + "rel": "profile", + "href": "http://www.opengis.net/spec/owc-geojson/1.0/req/core", + "title": "This file is compliant with version 1.0 of OGC Context" + } + ] + } + }, + "features": [ + { + "type": "Feature", + "id": "http://ows-9.compusult.net/wes/serviceManagerCSW/csw/http://ows-9.compusult.net/wes/serviceManagerCSW/csw/9496276a-4f6e-47c1-94bb-f604245fac57/", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -180, + -90 + ], + [ + -180, + 90 + ], + [ + 180, + 90 + ], + [ + 180, + -90 + ], + [ + -180, + -90 + ] + ] + ] + }, + "properties": { + "title": "gml:AbstractFeature", + "updated": "2013-01-02T15:24:24.446-03:30", + "rights": "Copyright (c) 2012. Some rights reserved. This feed licensed under a Creative Commons Attribution 3.0 License.", + "authors": [ + { + "name": "interactive-instruments" + } + ], + "categories": [{ + "scheme" : "http://www.earthobservations.org/category", + "term" : "GEOSSDataCore", + "label" : "GEOSS Data Collection of Open Resources for Everyone" + }], + "links": { + "alternates" : [{ + "href" : "http://www.acme.com/products/algal20090123090856.html", + "type" : "text/html", + "title" : "Information for the entry 2009-01-23 09:08:56" + }], + "previews" : [], + "data" : [], + "via" : [{ + "href" : "http://www.acme.com/products/algal20090123090856.xml", + "type" : "application/xml", + "length" : 435, + "lang" : "es", + "title" : "XML metadata file for the entry 2009-01-23 09:08:56" + }] + }, + "active": false, + "minscaledenominator": 100.0, + "maxscaledenominator": 1000000.0, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "http://ows-9.compusult.net/wes/serviceManagerCSW/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecords", + "method": "POST", + "type": "application/xml", + "href": "http://ows-9.compusult.net/wes/serviceManagerCSW/csw", + "request": { + "type": "application/xml", + "content": "fullcsw:Record/@id9496276a-4f6e-47c1-94bb-f604245fac57" + }, + "result": {} + } + ], + "contents": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wfs", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "http://services.interactive-instruments.de/xsprojects/ows8-tds/cgi-bin/ltds/wfs?request=GetCapabilities&service=WFS" + }, + { + "code": "GetFeature", + "method": "GET", + "type": "text/xml; subtype=gml/3.1.1", + "href": "http://services.interactive-instruments.de/xsprojects/ows8-tds/cgi-bin/ltds/wfs?request=GetFeature&service=WFS&typename=gml:AbstractFeature&outputFormat=text/xml; subtype=gml/3.1.1&version=1.1.0" + }, + { + "code": "GetFeature", + "method": "GET", + "type": "text/xml; subtype=gml/3.2.1", + "href": "http://services.interactive-instruments.de/xsprojects/ows8-tds/cgi-bin/ltds/wfs?request=GetFeature&service=WFS&typename=gml:AbstractFeature&outputFormat=text/xml; subtype=gml/3.2.1&version=1.1.0" + }, + { + "code": "GetFeature", + "method": "GET", + "type": "application/vnd.google-earth.kml+xml", + "href": "http://services.interactive-instruments.de/xsprojects/ows8-tds/cgi-bin/ltds/wfs?&request=GetFeature&service=WFS&typename=gml:AbstractFeature&outputFormat=application/vnd.google-earth.kml+xml&version=1.1.0" + } + ], + "contents": [ + { + "type": "application/gml+xml", + "href": "http://data.roads.wherever.com/wfs?service=WFS&request=GetFeature&typename=my_srf:RoadCollection", + "title": "ID_ROADS1:M30" + } + ], + "styles" : [{ + "name": "Simple Line", + "title": "SLD Cook Book: Simple Line", + "abstract": "SLD Cook Book: Simple Line extracted from http://docs.geoserver.org/latest/en/user/_downloads/line_simpleline.sld", + "default": true, + "legendURL": "http://docs.geoserver.org/latest/en/user/_images/line_simpleline1.png", + "content": { + "type": "application/vnd.ogc.sld+xml", + "content" : "\nSimple Line\nSLD Cook Book: Simple Line\n\n#000000\n3\n", + "uuid": "012c7aeb-a822-49d7-8a66-e77fa7137240" + }, + "uuid": "b9ea2498-fb32-40ef-91ef-0ba00060fe64" + }] + } + ] + } + } + ] +} diff -Nru owslib-0.16.0/tests/resources/owc_geojson_examples/owc3.geojson owslib-0.18.0/tests/resources/owc_geojson_examples/owc3.geojson --- owslib-0.16.0/tests/resources/owc_geojson_examples/owc3.geojson 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_geojson_examples/owc3.geojson 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,176 @@ +{ + "type": "FeatureCollection", + "id": "http://portal.smart-project.info/context/smart-sac/", + "bbox": [164, -50, 180, -31], + "properties": { + "lang": "en", + "title": "SMART Case Studies", + "subtitle": "SMART Case Studies Informative Layers, Sel. Geophysics, GW-SW Interaction, FODTS, Novel Tracers, DataVis and SOS", + "updated": "2012-02-21T11:58:23Z", + "date": "2011-11-04T00:01:23Z/2017-12-05T17:28:56Z", + "rights": "Copyright (c) 2012. Some rights reserved. This feed licensed under a Creative Commons Attribution 3.0 License.", + "authors": [ + { + "name": "Alex Kmoch", + "email": "a.kmoch@gns.cri.nz", + "uri": "https://www.gns.cri.nz" + } + ], + "display": { + "pixelWidth": 800, + "pixelHeight": 600 + }, + "categories": [ + { + "scheme": "http://gw-hub.info/vocab/view-groups", + "term": "sac_add", + "label": "Informative Layers" + }, + { + "scheme": "http://gw-hub.info/vocab/view-groups", + "term": "sac_geophys", + "label": "Sel. Geophysics" + }, + { + "scheme": "http://gw-hub.info/vocab/view-groups", + "term": "sac_dts", + "label": "GW-SW Interaction, FODTS" + }, + { + "scheme": "http://gw-hub.info/vocab/view-groups", + "term": "sac_tracers", + "label": "Novel Tracers" + }, + { + "scheme": "http://gw-hub.info/vocab/view-groups", + "term": "sac_datavis", + "label": "DataVis and SOS" + } + ], + "links": { + "profiles": [ + { + "href": "http://www.opengis.net/spec/owc-geojson/1.0/req/core" + } + ], + "via" : [{ + "rel": "via", + "type": "application/json", + "href": "http://portal.smart-project.info/context/smart-sac.owc.json", + "title": "SMARt Project Case Studies", + "lang" : "en" + }] + } + }, + "features": [ + { + "type": "Feature", + "id": "http://portal.smart-project.info/context/smart-sac_add-nz-dtm-100x100/", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -50 + ], + [ + 164, + -31 + ], + [ + 180, + -31 + ], + [ + 180, + -50 + ], + [ + 164, + -50 + ] + ] + ] + }, + "properties": { + "title": "NZ DTM 100x100", + "abstract": "New Zealand Digital Terrain Model 100m by 100m resolution", + "updated": "2016-02-21T11:58:23Z", + "date": "2011-11-04T00:01:23Z/2017-12-05T17:28:56Z", + "publisher": "GNS Science and Salzburg Uni ZGIS Dept", + "categories": [ + { + "scheme": "view-groups", + "term": "sac_add", + "label": "Informative Layers" + } + ], + "links": { + "alternates" : [], + "previews" : [{ + "rel": "icon", + "type": "image/png", + "href": "http://portal.smart-project.info/fs/images/nz_m.png", + "title": "NZ Flag", + "length": 46200 + }], + "data" : [], + "via" : [] + }, + "active": true, + "folder": "/view-groups/sac_add", + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "http://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "http://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-50,180,-31&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:nz-dtm-100x100&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [{ + "name": "Simple Line", + "title": "SLD Cook Book: Simple Line", + "abstract": "SLD Cook Book: Simple Line extracted from http://docs.geoserver.org/latest/en/user/_downloads/line_simpleline.sld", + "default": true, + "legendURL": "http://docs.geoserver.org/latest/en/user/_images/line_simpleline1.png" + }], + "uuid": "012c7aeb-a822-49d7-8a66-e77fa7137240" + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "http://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "http://portal.smart-project.info/pycsw/csw", + "request": { + "type": "application/xml", + "content": "urn:uuid:1f542dbe-a35d-46d7-9dff-64004226d21c-nz_aquifersfull" + } + } + ], + "contents": [] + } + ] + } + } + ] +} diff -Nru owslib-0.16.0/tests/resources/owc_geojson_examples/sac-casestudies.json owslib-0.18.0/tests/resources/owc_geojson_examples/sac-casestudies.json --- owslib-0.16.0/tests/resources/owc_geojson_examples/sac-casestudies.json 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/owc_geojson_examples/sac-casestudies.json 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,1866 @@ +{ + "type": "FeatureCollection", + "id": "https://portal.smart-project.info/context/document/02ea67bc-16bb-413c-83e2-62baccf172bc", + "bbox": [ + 164, + -48, + 180, + -33 + ], + "properties": { + "links": { + "profiles": [ + { + "href": "http://www.opengis.net/spec/owc-geojson/1.0/req/core", + "rel": "profile" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/document/02ea67bc-16bb-413c-83e2-62baccf172bc", + "rel": "via" + } + ] + }, + "lang": "en", + "title": "SMART Case Studies", + "subtitle": "Informative Layers Sel. Geophysics GW-SW Interaction, FODTS Novel Tracers DataVis and SOS", + "updated": "2018-02-16T04:14:56.884Z", + "generator": { + "title": "Groundwater Hub" + }, + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "categories": [ + { + "scheme": "view-groups", + "term": "sac", + "label": "SMART Case Studies" + } + ] + }, + "features": [ + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/fe2f9546-09cf-43f3-bdf5-4f68acbfae70", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:ngmp-locations", + "abstract": "NGMP Sites", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:ngmp-locations", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "NGMP Sites:horowhenua_ws:ngmp-locations" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/fe2f9546-09cf-43f3-bdf5-4f68acbfae70", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:ngmp-locations&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_add", + "label": "Informative Layers" + } + ], + "active": false, + "folder": "sac_add" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/1ac11759-7e0e-4645-8c89-63a19ef96d46", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:nz_aquifers", + "abstract": "NZ Aquifers (White 2001)", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:nz_aquifers", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "NZ Aquifers (White 2001):horowhenua_ws:nz_aquifers" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/1ac11759-7e0e-4645-8c89-63a19ef96d46", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:nz_aquifers&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_add", + "label": "Informative Layers" + } + ], + "active": false, + "folder": "sac_add" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/fbee2f6b-5657-4407-bfba-09a2a698101e", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:nz_regions", + "abstract": "New Zealand regions", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:nz_regions", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "New Zealand regions:horowhenua_ws:nz_regions" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/fbee2f6b-5657-4407-bfba-09a2a698101e", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:nz_regions&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_add", + "label": "Informative Layers" + } + ], + "active": false, + "folder": "sac_add" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/9a358b9d-505e-4c16-beb7-0d34318a7dcc", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:nz-dtm-100x100", + "abstract": "NZ DTM 100x100", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:nz-dtm-100x100", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "NZ DTM 100x100:horowhenua_ws:nz-dtm-100x100" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/9a358b9d-505e-4c16-beb7-0d34318a7dcc", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:nz-dtm-100x100&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_add", + "label": "Informative Layers" + } + ], + "active": false, + "folder": "sac_add" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/1680380e-45e9-47f1-9926-4133c6e0e0c5", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:ewt_nzprj_new", + "abstract": "Equilibrium Water Table (NZ)", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:ewt_nzprj_new", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Equilibrium Water Table (NZ):horowhenua_ws:ewt_nzprj_new" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/1680380e-45e9-47f1-9926-4133c6e0e0c5", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:ewt_nzprj_new&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_geophys", + "label": "Sel. Geophysics" + } + ], + "active": false, + "folder": "sac_geophys" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/fb6bc91e-37f5-4407-ab2f-c8bee0c143d6", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "PET", + "abstract": "Monthly Potential Evapotranspiration (NZ)", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://wci.earth2observe.eu/thredds/wms/deltares/aet-pet/MOD16_PET_corr_monthly_2000_2013.nc?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=PET", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://wci.earth2observe.eu/thredds/wms/deltares/aet-pet/MOD16_PET_corr_monthly_2000_2013.nc", + "type": "application/xml", + "title": "Monthly Potential Evapotranspiration (NZ):PET" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/fb6bc91e-37f5-4407-ab2f-c8bee0c143d6", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://wci.earth2observe.eu/thredds/wms/deltares/aet-pet/MOD16_PET_corr_monthly_2000_2013.nc?VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://wci.earth2observe.eu/thredds/wms/deltares/aet-pet/MOD16_PET_corr_monthly_2000_2013.nc?VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=PET&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_geophys", + "label": "Sel. Geophysics" + } + ], + "active": false, + "folder": "sac_geophys" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/d1519cce-bd68-4db6-be90-420f7932e4fe", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "Uncertainty", + "abstract": "PET Uncertainty (NZ)", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://wci.earth2observe.eu/thredds/wms/deltares/aet-pet/MOD16_PET_corr_monthly_2000_2013.nc?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=Uncertainty", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://wci.earth2observe.eu/thredds/wms/deltares/aet-pet/MOD16_PET_corr_monthly_2000_2013.nc", + "type": "application/xml", + "title": "PET Uncertainty (NZ):Uncertainty" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/d1519cce-bd68-4db6-be90-420f7932e4fe", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://wci.earth2observe.eu/thredds/wms/deltares/aet-pet/MOD16_PET_corr_monthly_2000_2013.nc?VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://wci.earth2observe.eu/thredds/wms/deltares/aet-pet/MOD16_PET_corr_monthly_2000_2013.nc?VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=Uncertainty&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_geophys", + "label": "Sel. Geophysics" + } + ], + "active": false, + "folder": "sac_geophys" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/f59d010e-0b46-4088-9e21-83f8e09a3554", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:HawkesBay_geophys", + "abstract": "Hawkes Bay", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:HawkesBay_geophys", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Hawkes Bay:horowhenua_ws:HawkesBay_geophys" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/f59d010e-0b46-4088-9e21-83f8e09a3554", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:HawkesBay_geophys&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_geophys", + "label": "Sel. Geophysics" + } + ], + "active": true, + "folder": "sac_geophys" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/fcc815d3-2b4c-4032-b6a7-55c564901fcd", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:canterbury_region", + "abstract": "Canterbury", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:canterbury_region", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Canterbury:horowhenua_ws:canterbury_region" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/fcc815d3-2b4c-4032-b6a7-55c564901fcd", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:canterbury_region&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_geophys", + "label": "Sel. Geophysics" + } + ], + "active": true, + "folder": "sac_geophys" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/2fceee06-dd79-465a-a62e-9f94e408d6c2", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:Horizons_Tararua", + "abstract": "Horizons Tararua", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:Horizons_Tararua", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Horizons Tararua:horowhenua_ws:Horizons_Tararua" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/2fceee06-dd79-465a-a62e-9f94e408d6c2", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:Horizons_Tararua&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_geophys", + "label": "Sel. Geophysics" + } + ], + "active": true, + "folder": "sac_geophys" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/3dca326b-de8f-44a8-b2af-c56b4aa9ce7d", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:OtagoEM", + "abstract": "Otago EM", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:OtagoEM", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Otago EM:horowhenua_ws:OtagoEM" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/3dca326b-de8f-44a8-b2af-c56b4aa9ce7d", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:OtagoEM&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_geophys", + "label": "Sel. Geophysics" + } + ], + "active": true, + "folder": "sac_geophys" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/32fcfca7-9f55-45b0-8e6b-17aadad94076", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:waipa_catchment", + "abstract": "Waipa Catchment", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:waipa_catchment", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Waipa Catchment:horowhenua_ws:waipa_catchment" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/32fcfca7-9f55-45b0-8e6b-17aadad94076", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:waipa_catchment&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_geophys", + "label": "Sel. Geophysics" + } + ], + "active": true, + "folder": "sac_geophys" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/eccc4cb0-f3e7-4d5b-a2d5-66b31d6178b1", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:FODTS-Testsites", + "abstract": "FODTS Testsites", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:FODTS-Testsites", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "FODTS Testsites:horowhenua_ws:FODTS-Testsites" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/eccc4cb0-f3e7-4d5b-a2d5-66b31d6178b1", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:FODTS-Testsites&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_dts", + "label": "GW-SW Interaction, FODTS" + } + ], + "active": true, + "folder": "sac_dts" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/133bb9bc-f735-4be4-93e8-b616b3e3bc8c", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:hutt_halon_sites", + "abstract": "Halon-1301 Sampling Sites", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:hutt_halon_sites", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Halon-1301 Sampling Sites:horowhenua_ws:hutt_halon_sites" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/133bb9bc-f735-4be4-93e8-b616b3e3bc8c", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:hutt_halon_sites&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_tracers", + "label": "Novel Tracers" + } + ], + "active": true, + "folder": "sac_tracers" + } + }, + { + "type": "Feature", + "id": "https://portal.smart-project.info/context/resource/73535274-2929-4a40-8a56-43bf456efc46", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 164, + -48 + ], + [ + 180, + -48 + ], + [ + 180, + -33 + ], + [ + 164, + -33 + ], + [ + 164, + -48 + ] + ] + ] + }, + "properties": { + "title": "horowhenua_ws:study_area", + "abstract": "Horowhenua Area (3D)", + "updated": "2018-02-16T04:14:56.884Z", + "authors": [ + { + "name": "Alex Kmoch", + "email": "allixender@gmail.com", + "uri": "https://portal.smart-project.info" + } + ], + "publisher": "GNS Science", + "rights": "CC BY SA 4.0 NZ", + "links": { + "alternates": [], + "previews": [ + { + "href": "https://portal.smart-project.info/fs/images/nz_m.png", + "type": "image/png", + "rel": "icon" + }, + { + "href": "https://portal.smart-project.info/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=horowhenua_ws:study_area", + "type": "image/png", + "rel": "icon" + } + ], + "data": [ + { + "href": "https://portal.smart-project.info/geoserver/wms", + "type": "application/xml", + "title": "Horowhenua Area (3D):horowhenua_ws:study_area" + } + ], + "via": [ + { + "href": "https://portal.smart-project.info/context/resource/73535274-2929-4a40-8a56-43bf456efc46", + "rel": "via" + } + ] + }, + "offerings": [ + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/wms", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities" + }, + { + "code": "GetMap", + "method": "GET", + "type": "image/png", + "href": "https://portal.smart-project.info/geoserver/wms?SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&SRS=EPSG:4326&BBOX=164,-48,180,-33&WIDTH=800&HEIGHT=600&LAYERS=horowhenua_ws:study_area&FORMAT=image/png&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_xml" + } + ], + "contents": [], + "styles": [] + }, + { + "code": "http://www.opengis.net/spec/owc-geojson/1.0/req/csw", + "operations": [ + { + "code": "GetCapabilities", + "method": "GET", + "type": "application/xml", + "href": "https://portal.smart-project.info/pycsw/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities" + }, + { + "code": "GetRecordById", + "method": "POST", + "type": "application/xml", + "href": "https://portal.smart-project.info/journalcsw/journalcsw?request=GetRecordById&version=2.0.2&service=CSW&elementSetName=full&outputSchema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd&Id=" + } + ], + "contents": [] + } + ], + "categories": [ + { + "scheme": "view-groups", + "term": "sac_datavis", + "label": "DataVis and SOS" + } + ], + "active": true, + "folder": "sac_datavis" + } + } + ] +} \ No newline at end of file diff -Nru owslib-0.16.0/tests/resources/wfs_dov_getcapabilities_100_nometadata.xml owslib-0.18.0/tests/resources/wfs_dov_getcapabilities_100_nometadata.xml --- owslib-0.16.0/tests/resources/wfs_dov_getcapabilities_100_nometadata.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wfs_dov_getcapabilities_100_nometadata.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,550 @@ + + + + WFS + Download Service van Databank Ondergrond Vlaanderen + Download Service van Databank Ondergrond Vlaanderen + + + + https://www.dov.vlaanderen.be:443/geoserver/gw_meetnetten/meetnetten/wfs + + No fees + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gw_meetnetten:meetnetten + Grondwatermeetnetten + In de Databank Ondergrond Vlaanderen zijn verschillende + grondwatermeetnetten opgenomen. Deze meetnetten staan in + functie van uitgebreide monitoringprogramma's met de bedoeling + een goed beeld te krijgen van de beschikbare + grondwaterkwantiteit en grondwaterkwaliteit van de + watervoerende lagen in Vlaanderen. + + DOV_PATHNAME@001#DOV:150#Grondwateronderzoek:010#, + DOV_EXPERTISE@C#D#E#F, grondwater, meetnet(werk), Geologie, + Toegevoegd GDI-Vl, Herbruikbaar, Vlaamse Open data, Kosteloos, + Lijst M&R INSPIRE, Metadata INSPIRE-conform, Metadata + GDI-Vl-conform + + EPSG:31370 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + abs + abs_2 + abs_3 + abs_4 + acos + AddCoverages + + Affine + + Aggregate + + area + area2 + AreaGrid + + asin + asMultiGeometry + + atan + atan2 + BandMerge + + BandSelect + + BarnesSurface + + between + + boundary + + boundaryDimension + + Bounds + buffer + + BufferFeatureCollection + + bufferWithSegments + + Categorize + + ceil + centroid + + classify + + Clip + CollectGeometries + + Collection_Average + + Collection_Bounds + + Collection_Count + + Collection_Max + + Collection_Median + + Collection_Min + + Collection_Nearest + + Collection_Sum + + Collection_Unique + + Concatenate + + contains + + Contour + + convert + + convexHull + + ConvolveCoverage + + cos + Count + CoverageClassStats + + CropCoverage + + crosses + + dateFormat + + dateParse + + densify + + difference + + dimension + + disjoint + + disjoint3D + + distance + + distance3D + + double2bool + + endAngle + + endPoint + + env + envelope + + EqualInterval + + equalsExact + + equalsExactTolerance + + equalTo + + exp + exteriorRing + + Feature + + FeatureClassStats + + floor + FormatDateTimezone + + geometry + + geometryType + + geomFromWKT + + geomLength + + GeorectifyCoverage + + GetFullCoverage + + getGeometryN + + getID + getX + getY + getz + greaterEqualThan + + greaterThan + + Grid + Heatmap + + id + IEEEremainder + + if_then_else + + Import + in + in10 + in2 + in3 + in4 + in5 + in6 + in7 + in8 + in9 + + InclusionFeatureCollection + + int2bbool + + int2ddouble + + interiorPoint + + interiorRingN + + Interpolate + + intersection + + + IntersectionFeatureCollection + + intersects + + intersects3D + + isClosed + + isCoverage + + isEmpty + + isInstanceOf + + isLike + isNull + isometric + + isRing + isSimple + + isValid + + isWithinDistance + + isWithinDistance3D + + Jenks + length + lessEqualThan + + lessThan + + list + log + LRSGeocode + + LRSMeasure + + LRSSegment + + max + max_2 + max_3 + max_4 + min + min_2 + min_3 + min_4 + mincircle + + minimumdiameter + + minrectangle + + modulo + MultiplyCoverages + + Nearest + + NormalizeCoverage + + not + notEqualTo + + numberFormat + + numberFormat2 + + numGeometries + + numInteriorRing + + numPoints + + octagonalenvelope + + offset + overlaps + + PagedUnique + + parameter + + parseBoolean + + parseDouble + + parseInt + + parseLong + + pi + PointBuffers + + pointN + PointStacker + + PolygonExtraction + + polygonize + + pow + property + + PropertyExists + + Quantile + + Query + random + RangeLookup + + RasterAsPointCollection + + RasterZonalStatistics + + RasterZonalStatistics2 + + Recode + RectangularClip + + relate + relatePattern + + reproject + + ReprojectGeometry + + rescaleToPixels + + rint + round + round_2 + + roundDouble + + ScaleCoverage + + setCRS + simplify + + sin + Snap + splitPolygon + + sqrt + StandardDeviation + + startAngle + + startPoint + + StoreCoverage + + strCapitalize + + strConcat + + strEndsWith + + strEqualsIgnoreCase + + strIndexOf + + stringTemplate + + strLastIndexOf + + strLength + + strMatches + + strPosition + + strReplace + + strStartsWith + + strSubstring + + strSubstringStart + + strToLowerCase + + strToUpperCase + + strTrim + + strTrim2 + + strURLEncode + + StyleCoverage + + symDifference + + tan + toDegrees + + toDirectPosition + + ToEnvelope + + toLineString + + toPoint + + toRadians + + touches + + toWKT + toXlinkHref + + Transform + + union + UnionFeatureCollection + + Unique + UniqueInterval + + VectorToRaster + + VectorZonalStatistics + + vertices + + Vocab + within + + + + + + \ No newline at end of file diff -Nru owslib-0.16.0/tests/resources/wfs_dov_getcapabilities_110_nometadata.xml owslib-0.18.0/tests/resources/wfs_dov_getcapabilities_110_nometadata.xml --- owslib-0.16.0/tests/resources/wfs_dov_getcapabilities_110_nometadata.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wfs_dov_getcapabilities_110_nometadata.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,594 @@ + + + + Download Service van Databank Ondergrond Vlaanderen + + Download Service van Databank Ondergrond Vlaanderen + + WFS + 1.1.0 + No fees + + + + Vlaamse Overheid - DOV + + ir Marleen Van Damme + DOV-coördinator + + + + + + + + Zwijnaarde + Oost-Vlaanderen + + 9052 + Belgium + + marleen.vandamme@lne.vlaanderen.be + + + + + + + + + + + + + + + 1.0.0 + 1.1.0 + + + text/xml + + + + + + + + + + + text/xml; subtype=gml/3.1.1 + + + + + + + + + + + results + hits + + + text/xml; subtype=gml/3.1.1 + GML2 + KML + SHAPE-ZIP + application/gml+xml; version=3.2 + application/json + application/vnd.google-earth.kml xml + application/vnd.google-earth.kml+xml + csv + gml3 + gml32 + json + text/xml; subtype=gml/2.1.2 + text/xml; subtype=gml/3.2 + + + 2 + + + + + + + + + + + + + + Query + + + gw_meetnetten:meetnetten + Grondwatermeetnetten + In de Databank Ondergrond Vlaanderen zijn verschillende + grondwatermeetnetten opgenomen. Deze meetnetten staan in + functie van uitgebreide monitoringprogramma's met de bedoeling + een goed beeld te krijgen van de beschikbare + grondwaterkwantiteit en grondwaterkwaliteit van de + watervoerende lagen in Vlaanderen. + + + + DOV_PATHNAME@001#DOV:150#Grondwateronderzoek:010# + + DOV_EXPERTISE@C#D#E#F + grondwater + meetnet(werk) + Geologie + Toegevoegd GDI-Vl + Herbruikbaar + Vlaamse Open data + Kosteloos + Lijst M&R INSPIRE + Metadata INSPIRE-conform + Metadata GDI-Vl-conform + + urn:x-ogc:def:crs:EPSG:31370 + + 2.5325270625180294 50.683712231532894 + + 5.925330775009873 51.49487740995666 + + + + + + + + gml:Envelope + gml:Point + gml:LineString + gml:Polygon + + + + + + + + + + + + + + + + + + + LessThan + GreaterThan + LessThanEqualTo + + GreaterThanEqualTo + + EqualTo + NotEqualTo + Like + Between + NullCheck + + + + + + abs + abs_2 + abs_3 + abs_4 + acos + AddCoverages + + Affine + Aggregate + + area + area2 + AreaGrid + asin + asMultiGeometry + + atan + atan2 + BandMerge + + BandSelect + + BarnesSurface + + between + boundary + boundaryDimension + + Bounds + buffer + BufferFeatureCollection + + bufferWithSegments + + Categorize + + ceil + centroid + classify + Clip + CollectGeometries + + Collection_Average + + Collection_Bounds + + Collection_Count + + Collection_Max + + Collection_Median + + Collection_Min + + Collection_Nearest + + Collection_Sum + + Collection_Unique + + Concatenate + + contains + Contour + convert + convexHull + + ConvolveCoverage + + cos + Count + CoverageClassStats + + CropCoverage + + crosses + dateFormat + + dateParse + + densify + difference + + dimension + + disjoint + disjoint3D + + distance + distance3D + + double2bool + + endAngle + endPoint + env + envelope + EqualInterval + + equalsExact + + equalsExactTolerance + + equalTo + exp + exteriorRing + + Feature + FeatureClassStats + + floor + FormatDateTimezone + + geometry + geometryType + + geomFromWKT + + geomLength + + GeorectifyCoverage + + GetFullCoverage + + getGeometryN + + getID + getX + getY + getz + greaterEqualThan + + greaterThan + + Grid + Heatmap + id + IEEEremainder + + if_then_else + + Import + in + in10 + in2 + in3 + in4 + in5 + in6 + in7 + in8 + in9 + + InclusionFeatureCollection + + int2bbool + + int2ddouble + + interiorPoint + + interiorRingN + + Interpolate + + intersection + + + IntersectionFeatureCollection + + intersects + + intersects3D + + isClosed + isCoverage + + isEmpty + isInstanceOf + + isLike + isNull + isometric + + isRing + isSimple + isValid + isWithinDistance + + isWithinDistance3D + + Jenks + length + lessEqualThan + + lessThan + list + log + LRSGeocode + + LRSMeasure + + LRSSegment + + max + max_2 + max_3 + max_4 + min + min_2 + min_3 + min_4 + mincircle + + minimumdiameter + + minrectangle + + modulo + MultiplyCoverages + + Nearest + NormalizeCoverage + + not + notEqualTo + + numberFormat + + numberFormat2 + + numGeometries + + numInteriorRing + + numPoints + + octagonalenvelope + + offset + overlaps + PagedUnique + + parameter + + parseBoolean + + parseDouble + + parseInt + parseLong + + pi + PointBuffers + + pointN + PointStacker + + PolygonExtraction + + polygonize + + pow + property + PropertyExists + + Quantile + Query + random + RangeLookup + + RasterAsPointCollection + + RasterZonalStatistics + + RasterZonalStatistics2 + + Recode + RectangularClip + + relate + relatePattern + + reproject + + ReprojectGeometry + + rescaleToPixels + + rint + round + round_2 + roundDouble + + ScaleCoverage + + setCRS + simplify + sin + Snap + splitPolygon + + sqrt + StandardDeviation + + startAngle + + startPoint + + StoreCoverage + + strCapitalize + + strConcat + + strEndsWith + + strEqualsIgnoreCase + + strIndexOf + + stringTemplate + + strLastIndexOf + + strLength + + strMatches + + strPosition + + strReplace + + strStartsWith + + strSubstring + + strSubstringStart + + strToLowerCase + + strToUpperCase + + strTrim + strTrim2 + strURLEncode + + StyleCoverage + + symDifference + + tan + toDegrees + + toDirectPosition + + ToEnvelope + + toLineString + + toPoint + toRadians + + touches + toWKT + toXlinkHref + + Transform + + union + UnionFeatureCollection + + Unique + UniqueInterval + + VectorToRaster + + VectorZonalStatistics + + vertices + Vocab + within + + + + + + + + + + \ No newline at end of file diff -Nru owslib-0.16.0/tests/resources/wfs_dov_getcapabilities_110.xml owslib-0.18.0/tests/resources/wfs_dov_getcapabilities_110.xml --- owslib-0.16.0/tests/resources/wfs_dov_getcapabilities_110.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wfs_dov_getcapabilities_110.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,600 @@ + + + + Download Service van Databank Ondergrond Vlaanderen + + Download Service van Databank Ondergrond Vlaanderen + + WFS + 1.1.0 + No fees + + + + Vlaamse Overheid - DOV + + ir Marleen Van Damme + DOV-coördinator + + + + + + + + Zwijnaarde + Oost-Vlaanderen + + 9052 + Belgium + + marleen.vandamme@lne.vlaanderen.be + + + + + + + + + + + + + + + 1.0.0 + 1.1.0 + + + text/xml + + + + + + + + + + + text/xml; subtype=gml/3.1.1 + + + + + + + + + + + results + hits + + + text/xml; subtype=gml/3.1.1 + GML2 + KML + SHAPE-ZIP + application/gml+xml; version=3.2 + application/json + application/vnd.google-earth.kml xml + application/vnd.google-earth.kml+xml + csv + gml3 + gml32 + json + text/xml; subtype=gml/2.1.2 + text/xml; subtype=gml/3.2 + + + 2 + + + + + + + + + + + + + + Query + + + gw_meetnetten:meetnetten + Grondwatermeetnetten + In de Databank Ondergrond Vlaanderen zijn verschillende + grondwatermeetnetten opgenomen. Deze meetnetten staan in + functie van uitgebreide monitoringprogramma's met de bedoeling + een goed beeld te krijgen van de beschikbare + grondwaterkwantiteit en grondwaterkwaliteit van de + watervoerende lagen in Vlaanderen. + + + + DOV_PATHNAME@001#DOV:150#Grondwateronderzoek:010# + + DOV_EXPERTISE@C#D#E#F + grondwater + meetnet(werk) + Geologie + Toegevoegd GDI-Vl + Herbruikbaar + Vlaamse Open data + Kosteloos + Lijst M&R INSPIRE + Metadata INSPIRE-conform + Metadata GDI-Vl-conform + + urn:x-ogc:def:crs:EPSG:31370 + + 2.5325270625180294 50.683712231532894 + + 5.925330775009873 51.49487740995666 + + + + https://www.dov.vlaanderen.be/geonetwork/srv/nl/csw?Service=CSW&Request=GetRecordById&Version=2.0.2&outputSchema=http://www.isotc211.org/2005/gmd&elementSetName=full&id=6c39d716-aecc-4fbc-bac8-4f05a49a78d5 + + + https://www.dov.vlaanderen.be/geonetwork/apps/tabsearch/index.html?hl=dut&uuid=6c39d716-aecc-4fbc-bac8-4f05a49a78d5 + + + + + + + gml:Envelope + gml:Point + gml:LineString + gml:Polygon + + + + + + + + + + + + + + + + + + + LessThan + GreaterThan + LessThanEqualTo + + GreaterThanEqualTo + + EqualTo + NotEqualTo + Like + Between + NullCheck + + + + + + abs + abs_2 + abs_3 + abs_4 + acos + AddCoverages + + Affine + Aggregate + + area + area2 + AreaGrid + asin + asMultiGeometry + + atan + atan2 + BandMerge + + BandSelect + + BarnesSurface + + between + boundary + boundaryDimension + + Bounds + buffer + BufferFeatureCollection + + bufferWithSegments + + Categorize + + ceil + centroid + classify + Clip + CollectGeometries + + Collection_Average + + Collection_Bounds + + Collection_Count + + Collection_Max + + Collection_Median + + Collection_Min + + Collection_Nearest + + Collection_Sum + + Collection_Unique + + Concatenate + + contains + Contour + convert + convexHull + + ConvolveCoverage + + cos + Count + CoverageClassStats + + CropCoverage + + crosses + dateFormat + + dateParse + + densify + difference + + dimension + + disjoint + disjoint3D + + distance + distance3D + + double2bool + + endAngle + endPoint + env + envelope + EqualInterval + + equalsExact + + equalsExactTolerance + + equalTo + exp + exteriorRing + + Feature + FeatureClassStats + + floor + FormatDateTimezone + + geometry + geometryType + + geomFromWKT + + geomLength + + GeorectifyCoverage + + GetFullCoverage + + getGeometryN + + getID + getX + getY + getz + greaterEqualThan + + greaterThan + + Grid + Heatmap + id + IEEEremainder + + if_then_else + + Import + in + in10 + in2 + in3 + in4 + in5 + in6 + in7 + in8 + in9 + + InclusionFeatureCollection + + int2bbool + + int2ddouble + + interiorPoint + + interiorRingN + + Interpolate + + intersection + + + IntersectionFeatureCollection + + intersects + + intersects3D + + isClosed + isCoverage + + isEmpty + isInstanceOf + + isLike + isNull + isometric + + isRing + isSimple + isValid + isWithinDistance + + isWithinDistance3D + + Jenks + length + lessEqualThan + + lessThan + list + log + LRSGeocode + + LRSMeasure + + LRSSegment + + max + max_2 + max_3 + max_4 + min + min_2 + min_3 + min_4 + mincircle + + minimumdiameter + + minrectangle + + modulo + MultiplyCoverages + + Nearest + NormalizeCoverage + + not + notEqualTo + + numberFormat + + numberFormat2 + + numGeometries + + numInteriorRing + + numPoints + + octagonalenvelope + + offset + overlaps + PagedUnique + + parameter + + parseBoolean + + parseDouble + + parseInt + parseLong + + pi + PointBuffers + + pointN + PointStacker + + PolygonExtraction + + polygonize + + pow + property + PropertyExists + + Quantile + Query + random + RangeLookup + + RasterAsPointCollection + + RasterZonalStatistics + + RasterZonalStatistics2 + + Recode + RectangularClip + + relate + relatePattern + + reproject + + ReprojectGeometry + + rescaleToPixels + + rint + round + round_2 + roundDouble + + ScaleCoverage + + setCRS + simplify + sin + Snap + splitPolygon + + sqrt + StandardDeviation + + startAngle + + startPoint + + StoreCoverage + + strCapitalize + + strConcat + + strEndsWith + + strEqualsIgnoreCase + + strIndexOf + + stringTemplate + + strLastIndexOf + + strLength + + strMatches + + strPosition + + strReplace + + strStartsWith + + strSubstring + + strSubstringStart + + strToLowerCase + + strToUpperCase + + strTrim + strTrim2 + strURLEncode + + StyleCoverage + + symDifference + + tan + toDegrees + + toDirectPosition + + ToEnvelope + + toLineString + + toPoint + toRadians + + touches + toWKT + toXlinkHref + + Transform + + union + UnionFeatureCollection + + Unique + UniqueInterval + + VectorToRaster + + VectorZonalStatistics + + vertices + Vocab + within + + + + + + + + + + \ No newline at end of file diff -Nru owslib-0.16.0/tests/resources/wfs_dov_getcapabilities_200_nometadata.xml owslib-0.18.0/tests/resources/wfs_dov_getcapabilities_200_nometadata.xml --- owslib-0.16.0/tests/resources/wfs_dov_getcapabilities_200_nometadata.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wfs_dov_getcapabilities_200_nometadata.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,3368 @@ + + + + Download Service van Databank Ondergrond Vlaanderen + + Download Service van Databank Ondergrond Vlaanderen + + WFS + 2.0.0 + No fees + + + + Vlaamse Overheid - DOV + + ir Marleen Van Damme + DOV-coördinator + + + + + + + + Zwijnaarde + Oost-Vlaanderen + + 9052 + Belgium + + marleen.vandamme@lne.vlaanderen.be + + + + + + + + + + + + + + + + 1.0.0 + 1.1.0 + 2.0.0 + + + + + text/xml + + + + + + + + + + + + + text/xml; subtype=gml/3.2 + + + + + + + + + + + + + results + hits + + + + + text/xml; subtype=gml/3.2 + GML2 + KML + SHAPE-ZIP + application/gml+xml; version=3.2 + application/json + application/vnd.google-earth.kml xml + application/vnd.google-earth.kml+xml + csv + gml3 + gml32 + json + text/xml; subtype=gml/2.1.2 + text/xml; subtype=gml/3.1.1 + + + + + FALSE + + + + 10000 + + + + + + + + + + + + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TRUE + + + + TRUE + + + + TRUE + + + + TRUE + + + + TRUE + + + + TRUE + + + + FALSE + + + + FALSE + + + + TRUE + + + + TRUE + + + + TRUE + + + + TRUE + + + + FALSE + + + + TRUE + + + + FALSE + + + + wfs:Query + wfs:StoredQuery + + + + + + gw_meetnetten:meetnetten + Grondwatermeetnetten + In de Databank Ondergrond Vlaanderen zijn verschillende + grondwatermeetnetten opgenomen. Deze meetnetten staan in + functie van uitgebreide monitoringprogramma's met de bedoeling + een goed beeld te krijgen van de beschikbare + grondwaterkwantiteit en grondwaterkwaliteit van de + watervoerende lagen in Vlaanderen. + + + + DOV_PATHNAME@001#DOV:150#Grondwateronderzoek:010# + + DOV_EXPERTISE@C#D#E#F + grondwater + meetnet(werk) + Geologie + Toegevoegd GDI-Vl + Herbruikbaar + Vlaamse Open data + Kosteloos + Lijst M&R INSPIRE + Metadata INSPIRE-conform + Metadata GDI-Vl-conform + + urn:ogc:def:crs:EPSG::31370 + + 2.5325270625180294 50.683712231532894 + + 5.925330775009873 51.49487740995666 + + + + + + + + + TRUE + + + + TRUE + + + + TRUE + + + + TRUE + + + + FALSE + + + + TRUE + + + + FALSE + + + + TRUE + + + + TRUE + + + + FALSE + + + + ASC + DESC + + ASC + + + + FALSE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xs:int + + + xs:int + + + + + xs:long + + + xs:long + + + + + xs:float + + + xs:float + + + + + xs:double + + + xs:double + + + + + xs:double + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:double + + + xs:double + + + xs:double + + + xs:double + + + xs:double + + + xs:double + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + xs:string + + + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + + + xs:double + + + xs:double + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:double + + + xs:double + + + + + xs:double + + + xs:double + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:double + + + xs:double + + + xs:int + + + xs:int + + + xs:double + + + xs:double + + + xs:int + + + xs:double + + + xs:string + + + xs:int + + + xs:int + + + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:int + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:float + + + + + xs:string + + + xs:string + + + xs:double + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:float + + + xs:float + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + + + xs:string + + + xs:string + + + + + xs:float + + + xs:float + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:dateTime + + + xs:dateTime + + + + + xs:dateTime + + + xs:dateTime + + + + + xs:dateTime + + + xs:dateTime + + + + + xs:string + + + xs:dateTime + + + + + xs:float + + + xs:float + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:int + + + xs:string + + + xs:double + + + xs:boolean + + + xs:boolean + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + xs:int + + + + + xs:double + + + xs:double + + + + + xs:float + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + xs:string + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:dateTime + + + + + xs:dateTime + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:int + + + gml:AbstractGeometryType + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:double + + + + + xs:double + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:double + + + xs:int + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + xs:double + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:string + + + xs:double + + + + + xs:double + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + gml:AbstractGeometryType + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + xs:int + + + xs:boolean + + + xs:boolean + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:int + + + + + xs:string + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:double + + + xs:double + + + xs:double + + + xs:string + + + + + xs:string + + + xs:string + + + xs:int + + + xs:string + + + xs:int + + + xs:string + + + xs:int + + + xs:int + + + + + xs:string + + + xs:double + + + xs:float + + + xs:float + + + + + xs:string + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:int + + + + + xs:double + + + xs:int + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + xs:boolean + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + + + xs:boolean + + + gml:AbstractGeometryType + + + + + xs:boolean + + + xs:boolean + + + gml:AbstractGeometryType + + + + + xs:boolean + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:double + + + + + xs:boolean + + + gml:AbstractGeometryType + + + + + xs:boolean + + + gml:AbstractGeometryType + + + + + xs:boolean + + + gml:AbstractGeometryType + + + + + xs:boolean + + + xs:string + + + xs:string + + + xs:double + + + + + xs:double + + + xs:string + + + xs:string + + + xs:double + + + + + xs:string + + + xs:double + + + xs:int + + + + + xs:int + + + xs:string + + + + + xs:boolean + + + xs:float + + + xs:float + + + + + xs:boolean + + + xs:float + + + xs:float + + + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:double + + + xs:double + + + + + xs:double + + + xs:float + + + xs:float + + + + + xs:long + + + xs:float + + + xs:float + + + + + xs:float + + + xs:float + + + xs:float + + + + + xs:int + + + xs:float + + + xs:float + + + + + xs:double + + + xs:double + + + xs:double + + + + + xs:long + + + xs:float + + + xs:float + + + + + xs:float + + + xs:float + + + xs:float + + + + + xs:int + + + xs:float + + + xs:float + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:int + + + xs:int + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:float + + + + + xs:string + + + xs:string + + + xs:float + + + xs:string + + + xs:string + + + xs:string + + + + + xs:int + + + gml:AbstractGeometryType + + + + + xs:int + + + gml:AbstractGeometryType + + + + + xs:int + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:double + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + + + xs:double + + + xs:string + + + + + xs:int + + + xs:string + + + + + xs:long + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:int + + + + + xs:string + + + xs:string + + + xs:int + + + xs:boolean + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + + + xs:string + + + xs:string + + + xs:int + + + xs:boolean + + + xs:string + + + xs:float + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + xs:float + + + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + + + xs:string + + + xs:double + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + xs:int + + + xs:string + + + xs:string + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + xs:float + + + xs:string + + + xs:boolean + + + + + xs:string + + + xs:string + + + xs:int + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + gml:AbstractGeometryType + + + gml:AbstractGeometryType + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:double + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:float + + + xs:float + + + + + xs:long + + + xs:float + + + + + xs:double + + + xs:float + + + + + xs:string + + + xs:string + + + xs:double + + + xs:double + + + xs:double + + + xs:double + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:string + + + + + xs:string + + + xs:string + + + xs:double + + + + + xs:double + + + xs:float + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:string + + + xs:double + + + xs:int + + + + + xs:double + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:int + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:int + + + xs:string + + + xs:string + + + + + xs:int + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + + + xs:string + + + xs:string + + + xs:int + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:boolean + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + gml:AbstractGeometryType + + + + + xs:double + + + xs:float + + + + + xs:double + + + xs:float + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:double + + + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:boolean + + + gml:AbstractGeometryType + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:double + + + xs:int + + + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + gml:AbstractGeometryType + + + gml:AbstractGeometryType + + + + + + \ No newline at end of file diff -Nru owslib-0.16.0/tests/resources/wfs_dov_getcapabilities_200.xml owslib-0.18.0/tests/resources/wfs_dov_getcapabilities_200.xml --- owslib-0.16.0/tests/resources/wfs_dov_getcapabilities_200.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wfs_dov_getcapabilities_200.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,3372 @@ + + + + Download Service van Databank Ondergrond Vlaanderen + + Download Service van Databank Ondergrond Vlaanderen + + WFS + 2.0.0 + No fees + + + + Vlaamse Overheid - DOV + + ir Marleen Van Damme + DOV-coördinator + + + + + + + + Zwijnaarde + Oost-Vlaanderen + + 9052 + Belgium + + marleen.vandamme@lne.vlaanderen.be + + + + + + + + + + + + + + + + 1.0.0 + 1.1.0 + 2.0.0 + + + + + text/xml + + + + + + + + + + + + + text/xml; subtype=gml/3.2 + + + + + + + + + + + + + results + hits + + + + + text/xml; subtype=gml/3.2 + GML2 + KML + SHAPE-ZIP + application/gml+xml; version=3.2 + application/json + application/vnd.google-earth.kml xml + application/vnd.google-earth.kml+xml + csv + gml3 + gml32 + json + text/xml; subtype=gml/2.1.2 + text/xml; subtype=gml/3.1.1 + + + + + FALSE + + + + 10000 + + + + + + + + + + + + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TRUE + + + + TRUE + + + + TRUE + + + + TRUE + + + + TRUE + + + + TRUE + + + + FALSE + + + + FALSE + + + + TRUE + + + + TRUE + + + + TRUE + + + + TRUE + + + + FALSE + + + + TRUE + + + + FALSE + + + + wfs:Query + wfs:StoredQuery + + + + + + gw_meetnetten:meetnetten + Grondwatermeetnetten + In de Databank Ondergrond Vlaanderen zijn verschillende + grondwatermeetnetten opgenomen. Deze meetnetten staan in + functie van uitgebreide monitoringprogramma's met de bedoeling + een goed beeld te krijgen van de beschikbare + grondwaterkwantiteit en grondwaterkwaliteit van de + watervoerende lagen in Vlaanderen. + + + + DOV_PATHNAME@001#DOV:150#Grondwateronderzoek:010# + + DOV_EXPERTISE@C#D#E#F + grondwater + meetnet(werk) + Geologie + Toegevoegd GDI-Vl + Herbruikbaar + Vlaamse Open data + Kosteloos + Lijst M&R INSPIRE + Metadata INSPIRE-conform + Metadata GDI-Vl-conform + + urn:ogc:def:crs:EPSG::31370 + + 2.5325270625180294 50.683712231532894 + + 5.925330775009873 51.49487740995666 + + + + + + + + + + + TRUE + + + + TRUE + + + + TRUE + + + + TRUE + + + + FALSE + + + + TRUE + + + + FALSE + + + + TRUE + + + + TRUE + + + + FALSE + + + + ASC + DESC + + ASC + + + + FALSE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xs:int + + + xs:int + + + + + xs:long + + + xs:long + + + + + xs:float + + + xs:float + + + + + xs:double + + + xs:double + + + + + xs:double + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:double + + + xs:double + + + xs:double + + + xs:double + + + xs:double + + + xs:double + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + xs:string + + + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + + + xs:double + + + xs:double + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:double + + + xs:double + + + + + xs:double + + + xs:double + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:double + + + xs:double + + + xs:int + + + xs:int + + + xs:double + + + xs:double + + + xs:int + + + xs:double + + + xs:string + + + xs:int + + + xs:int + + + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:int + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:float + + + + + xs:string + + + xs:string + + + xs:double + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:float + + + xs:float + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + + + xs:string + + + xs:string + + + + + xs:float + + + xs:float + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:dateTime + + + xs:dateTime + + + + + xs:dateTime + + + xs:dateTime + + + + + xs:dateTime + + + xs:dateTime + + + + + xs:string + + + xs:dateTime + + + + + xs:float + + + xs:float + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:int + + + xs:string + + + xs:double + + + xs:boolean + + + xs:boolean + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + xs:int + + + + + xs:double + + + xs:double + + + + + xs:float + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + xs:string + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:dateTime + + + + + xs:dateTime + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:int + + + gml:AbstractGeometryType + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:double + + + + + xs:double + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:double + + + xs:int + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + xs:double + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:string + + + xs:double + + + + + xs:double + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + gml:AbstractGeometryType + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + xs:int + + + xs:boolean + + + xs:boolean + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:int + + + + + xs:string + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:double + + + gml:AbstractGeometryType + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:double + + + xs:double + + + xs:double + + + xs:string + + + + + xs:string + + + xs:string + + + xs:int + + + xs:string + + + xs:int + + + xs:string + + + xs:int + + + xs:int + + + + + xs:string + + + xs:double + + + xs:float + + + xs:float + + + + + xs:string + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:int + + + + + xs:double + + + xs:int + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + xs:boolean + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + + + xs:boolean + + + gml:AbstractGeometryType + + + + + xs:boolean + + + xs:boolean + + + gml:AbstractGeometryType + + + + + xs:boolean + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:double + + + + + xs:boolean + + + gml:AbstractGeometryType + + + + + xs:boolean + + + gml:AbstractGeometryType + + + + + xs:boolean + + + gml:AbstractGeometryType + + + + + xs:boolean + + + xs:string + + + xs:string + + + xs:double + + + + + xs:double + + + xs:string + + + xs:string + + + xs:double + + + + + xs:string + + + xs:double + + + xs:int + + + + + xs:int + + + xs:string + + + + + xs:boolean + + + xs:float + + + xs:float + + + + + xs:boolean + + + xs:float + + + xs:float + + + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:double + + + xs:double + + + + + xs:double + + + xs:float + + + xs:float + + + + + xs:long + + + xs:float + + + xs:float + + + + + xs:float + + + xs:float + + + xs:float + + + + + xs:int + + + xs:float + + + xs:float + + + + + xs:double + + + xs:double + + + xs:double + + + + + xs:long + + + xs:float + + + xs:float + + + + + xs:float + + + xs:float + + + xs:float + + + + + xs:int + + + xs:float + + + xs:float + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:int + + + xs:int + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:boolean + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:float + + + + + xs:string + + + xs:string + + + xs:float + + + xs:string + + + xs:string + + + xs:string + + + + + xs:int + + + gml:AbstractGeometryType + + + + + xs:int + + + gml:AbstractGeometryType + + + + + xs:int + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:double + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + + + xs:double + + + xs:string + + + + + xs:int + + + xs:string + + + + + xs:long + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:int + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:int + + + + + xs:string + + + xs:string + + + xs:int + + + xs:boolean + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + + + xs:string + + + xs:string + + + xs:int + + + xs:boolean + + + xs:string + + + xs:float + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + xs:float + + + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + + + xs:string + + + xs:double + + + xs:int + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:double + + + xs:string + + + xs:string + + + xs:int + + + xs:string + + + xs:string + + + xs:double + + + + + xs:string + + + xs:string + + + xs:string + + + xs:float + + + xs:string + + + xs:boolean + + + + + xs:string + + + xs:string + + + xs:int + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + gml:AbstractGeometryType + + + gml:AbstractGeometryType + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:double + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:float + + + xs:float + + + + + xs:long + + + xs:float + + + + + xs:double + + + xs:float + + + + + xs:string + + + xs:string + + + xs:double + + + xs:double + + + xs:double + + + xs:double + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + xs:string + + + + + xs:string + + + xs:string + + + xs:double + + + + + xs:double + + + xs:float + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:string + + + xs:double + + + xs:int + + + + + xs:double + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:int + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:int + + + xs:string + + + xs:string + + + + + xs:int + + + xs:string + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + xs:boolean + + + + + xs:boolean + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + + + xs:string + + + xs:string + + + xs:int + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:boolean + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + gml:AbstractGeometryType + + + + + xs:double + + + xs:float + + + + + xs:double + + + xs:float + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:double + + + + + xs:string + + + xs:string + + + + + xs:double + + + xs:float + + + + + xs:boolean + + + gml:AbstractGeometryType + + + gml:AbstractGeometryType + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:double + + + xs:int + + + + + xs:string + + + xs:string + + + xs:int + + + xs:int + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + xs:string + + + xs:string + + + xs:string + + + + + xs:string + + + gml:AbstractGeometryType + + + + + xs:string + + + xs:string + + + xs:string + + + + + xs:boolean + + + gml:AbstractGeometryType + + + gml:AbstractGeometryType + + + + + + \ No newline at end of file diff -Nru owslib-0.16.0/tests/resources/wms_dov_getcapabilities_111_nometadata.xml owslib-0.18.0/tests/resources/wms_dov_getcapabilities_111_nometadata.xml --- owslib-0.16.0/tests/resources/wms_dov_getcapabilities_111_nometadata.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wms_dov_getcapabilities_111_nometadata.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,216 @@ + + + + + OGC:WMS + DOV View Service + Interne View Service van Databank Ondergrond Vlaanderen. + + WMS + INSPIRE + View Service + Dov + OneGeology + MD_LANG@DUT + MD_DATE@2012-11-13 + tertiair + boring + sondering + + + + + ir Marleen Van Damme + Vlaamse Overheid - DOV + + DOV-coördinator + + +
Technologiepark 905
+ Zwijnaarde + Oost-Vlaanderen + 9052 + Belgium +
+ + + marleen.vandamme@lne.vlaanderen.be +
+ No fees + none +
+ + + + application/vnd.ogc.wms_xml + + + + + + + + + + + + + image/png + application/atom xml + application/atom+xml + application/json;type=utfgrid + application/openlayers + application/pdf + application/rss xml + application/rss+xml + application/vnd.google-earth.kml + application/vnd.google-earth.kml xml + application/vnd.google-earth.kml+xml + application/vnd.google-earth.kml+xml;mode=networklink + application/vnd.google-earth.kmz + application/vnd.google-earth.kmz xml + application/vnd.google-earth.kmz+xml + application/vnd.google-earth.kmz;mode=networklink + atom + image/geotiff + image/geotiff8 + image/gif + image/gif;subtype=animated + image/jpeg + image/png8 + image/png; mode=8bit + image/svg + image/svg xml + image/svg+xml + image/tiff + image/tiff8 + image/vnd.jpeg-png + kml + kmz + openlayers + rss + text/html; subtype=openlayers + utfgrid + + + + + + + + + + text/plain + application/vnd.ogc.gml + text/xml + application/vnd.ogc.gml/3.1.1 + text/xml; subtype=gml/3.1.1 + text/html + application/json + + + + + + + + + + + + + application/vnd.ogc.wms_xml + + + + + + + + + + image/png + image/jpeg + image/gif + + + + + + + + + + application/vnd.ogc.sld+xml + + + + + + + + + + + application/vnd.ogc.se_xml + application/vnd.ogc.se_inimage + application/vnd.ogc.se_blank + application/json + + + + DOV View Service + Interne View Service van Databank Ondergrond Vlaanderen. + + EPSG:25831 + EPSG:3043 + EPSG:31370 + EPSG:32631 + EPSG:3812 + EPSG:3857 + EPSG:4258 + EPSG:4326 + EPSG:900913 + + + meetnetten + Grondwatermeetnetten + In de Databank Ondergrond Vlaanderen zijn verschillende grondwatermeetnetten opgenomen. Deze meetnetten staan in functie van uitgebreide monitoringprogramma's met de bedoeling een goed beeld te krijgen van de beschikbare grondwaterkwantiteit en grondwaterkwaliteit van de watervoerende lagen in Vlaanderen. + + DOV_PATHNAME@001#DOV:150#Grondwateronderzoek:010# + DOV_EXPERTISE@C#D#E#F + grondwater + meetnet(werk) + Geologie + Toegevoegd GDI-Vl + Herbruikbaar + Vlaamse Open data + Kosteloos + Lijst M&R INSPIRE + Metadata INSPIRE-conform + Metadata GDI-Vl-conform + + EPSG:31370 + + + + + + + + +
diff -Nru owslib-0.16.0/tests/resources/wms_dov_getcapabilities_130_nometadata.xml owslib-0.18.0/tests/resources/wms_dov_getcapabilities_130_nometadata.xml --- owslib-0.16.0/tests/resources/wms_dov_getcapabilities_130_nometadata.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wms_dov_getcapabilities_130_nometadata.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,188 @@ + + + WMS + DOV View Service + Interne View Service van Databank Ondergrond Vlaanderen. + + WMS + INSPIRE + View Service + Dov + OneGeology + MD_LANG@DUT + MD_DATE@2012-11-13 + tertiair + boring + sondering + + + + + ir Marleen Van Damme + Vlaamse Overheid - DOV + + DOV-coördinator + + +
Technologiepark 905
+ Zwijnaarde + Oost-Vlaanderen + 9052 + Belgium +
+ + + marleen.vandamme@lne.vlaanderen.be +
+ No fees + none +
+ + + + text/xml + + + + + + + + + + + + + image/png + application/atom+xml + application/json;type=utfgrid + application/pdf + application/rss+xml + application/vnd.google-earth.kml+xml + application/vnd.google-earth.kml+xml;mode=networklink + application/vnd.google-earth.kmz + image/geotiff + image/geotiff8 + image/gif + image/jpeg + image/png; mode=8bit + image/svg+xml + image/tiff + image/tiff8 + image/vnd.jpeg-png + text/html; subtype=openlayers + + + + + + + + + + text/plain + application/vnd.ogc.gml + text/xml + application/vnd.ogc.gml/3.1.1 + text/xml; subtype=gml/3.1.1 + text/html + application/json + + + + + + + + + + + XML + INIMAGE + BLANK + JSON + + + + https://www.dov.vlaanderen.be/geonetwork/srv/nl/csw?request=GetRecordById&ID=eab36660-76ec-11e0-994d-0002a5d5c51b + application/vnd.ogc.csw.GetRecordByIdResponse_xml + + + + dut + + + + dut + + + + DOV View Service + Interne View Service van Databank Ondergrond Vlaanderen. + + EPSG:25831 + EPSG:3043 + EPSG:31370 + EPSG:32631 + EPSG:3812 + EPSG:3857 + EPSG:4258 + EPSG:4326 + EPSG:900913 + CRS:84 + + 2.4985990253931107 + 5.959258812134792 + 49.35896492737394 + 52.81962471411561 + + + + meetnetten + Grondwatermeetnetten + In de Databank Ondergrond Vlaanderen zijn verschillende grondwatermeetnetten opgenomen. Deze meetnetten staan in functie van uitgebreide monitoringprogramma's met de bedoeling een goed beeld te krijgen van de beschikbare grondwaterkwantiteit en grondwaterkwaliteit van de watervoerende lagen in Vlaanderen. + + DOV_PATHNAME@001#DOV:150#Grondwateronderzoek:010# + DOV_EXPERTISE@C#D#E#F + grondwater + meetnet(werk) + Geologie + Toegevoegd GDI-Vl + Herbruikbaar + Vlaamse Open data + Kosteloos + Lijst M&R INSPIRE + Metadata INSPIRE-conform + Metadata GDI-Vl-conform + + EPSG:31370 + CRS:84 + + 2.4985990253931107 + 5.959258812134792 + 49.35896492737394 + 52.81962471411561 + + + + + + 50001.0 + + + +
diff -Nru owslib-0.16.0/tests/resources/wms_dov_getcapabilities_130.xml owslib-0.18.0/tests/resources/wms_dov_getcapabilities_130.xml --- owslib-0.16.0/tests/resources/wms_dov_getcapabilities_130.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wms_dov_getcapabilities_130.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,196 @@ + + + WMS + DOV View Service + Interne View Service van Databank Ondergrond Vlaanderen. + + WMS + INSPIRE + View Service + Dov + OneGeology + MD_LANG@DUT + MD_DATE@2012-11-13 + tertiair + boring + sondering + + + + + ir Marleen Van Damme + Vlaamse Overheid - DOV + + DOV-coördinator + + +
Technologiepark 905
+ Zwijnaarde + Oost-Vlaanderen + 9052 + Belgium +
+ + + marleen.vandamme@lne.vlaanderen.be +
+ No fees + none +
+ + + + text/xml + + + + + + + + + + + + + image/png + application/atom+xml + application/json;type=utfgrid + application/pdf + application/rss+xml + application/vnd.google-earth.kml+xml + application/vnd.google-earth.kml+xml;mode=networklink + application/vnd.google-earth.kmz + image/geotiff + image/geotiff8 + image/gif + image/jpeg + image/png; mode=8bit + image/svg+xml + image/tiff + image/tiff8 + image/vnd.jpeg-png + text/html; subtype=openlayers + + + + + + + + + + text/plain + application/vnd.ogc.gml + text/xml + application/vnd.ogc.gml/3.1.1 + text/xml; subtype=gml/3.1.1 + text/html + application/json + + + + + + + + + + + XML + INIMAGE + BLANK + JSON + + + + https://www.dov.vlaanderen.be/geonetwork/srv/nl/csw?request=GetRecordById&ID=eab36660-76ec-11e0-994d-0002a5d5c51b + application/vnd.ogc.csw.GetRecordByIdResponse_xml + + + + dut + + + + dut + + + + DOV View Service + Interne View Service van Databank Ondergrond Vlaanderen. + + EPSG:25831 + EPSG:3043 + EPSG:31370 + EPSG:32631 + EPSG:3812 + EPSG:3857 + EPSG:4258 + EPSG:4326 + EPSG:900913 + CRS:84 + + 2.4985990253931107 + 5.959258812134792 + 49.35896492737394 + 52.81962471411561 + + + + meetnetten + Grondwatermeetnetten + In de Databank Ondergrond Vlaanderen zijn verschillende grondwatermeetnetten opgenomen. Deze meetnetten staan in functie van uitgebreide monitoringprogramma's met de bedoeling een goed beeld te krijgen van de beschikbare grondwaterkwantiteit en grondwaterkwaliteit van de watervoerende lagen in Vlaanderen. + + DOV_PATHNAME@001#DOV:150#Grondwateronderzoek:010# + DOV_EXPERTISE@C#D#E#F + grondwater + meetnet(werk) + Geologie + Toegevoegd GDI-Vl + Herbruikbaar + Vlaamse Open data + Kosteloos + Lijst M&R INSPIRE + Metadata INSPIRE-conform + Metadata GDI-Vl-conform + + EPSG:31370 + CRS:84 + + 2.4985990253931107 + 5.959258812134792 + 49.35896492737394 + 52.81962471411561 + + + + + text/xml + + + + text/html + + + + + 50001.0 + + + +
diff -Nru owslib-0.16.0/tests/resources/wps_EmuDescribeProcess_all.xml owslib-0.18.0/tests/resources/wps_EmuDescribeProcess_all.xml --- owslib-0.16.0/tests/resources/wps_EmuDescribeProcess_all.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wps_EmuDescribeProcess_all.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,928 @@ + + + + + ultimate_question + Answer to the ultimate question + This process gives the answer to the ultimate question of "What is the meaning of life?" + + + + + answer + Answer to Ultimate Question + + + string + + + + + + sleep + Sleep Process + Testing a long running process, in the sleep. This process will sleep for a given delay or 10 seconds if not a valid value. + + + + + delay + Delay between every update + + + float + + 2.0 + + + + + + sleep_output + Sleep Output + + + string + + + + + + nap + Afternoon Nap (supports sync calls only) + This process will have a short nap for a given delay or 1 second if not a valid value. This process only supports synchronous WPS requests... so, make sure the nap does not take to long. + + + + + delay + Delay between every update + + + float + + 1.0 + + + + + + output + Nap Output + + + string + + + + + + bbox + Bounding box in- and out + Give bounding box, return the same + + + + + bbox + Bounding Box + Bounding Box Input. + + + epsg:4326 + + + epsg:4326 + epsg:3035 + + + + + + + bbox + Bounding Box + Bounding Box Output. + + + epsg:4326 + + + epsg:4326 + + + + + + + hello + Say Hello + Just says a friendly Hello. Returns a literal string output with Hello plus the inputed name. + + + + + name + Your name + Please enter your name. + + string + + + + + + + output + Output response + A friendly Hello from us. + + string + + + + + + dummyprocess + Dummy Process + DummyProcess to check the WPS structure + + + input1 + Input1 number + + + integer + + 100 + + + + input2 + Input2 number + + + integer + + 200 + + + + + + output1 + Output1 add 1 result + + + string + + + + output2 + Output2 substract 1 result + + + string + + + + + + wordcounter + Word Counter + Counts words in a given text. + + + + text + Text document + URL pointing to a text document, for example "Alice in Wonderland": http://www.gutenberg.org/cache/epub/19033/pg19033.txt + + + + text/plain + + + + + text/plain + + + + + + + + output + Word counter result + + + + + application/json + + + + + application/json + + + + + + + + chomsky + Chomsky text generator + Generates a random chomsky text + + + times + Times + Generates a random chomsky text. + + integer + + 5 + + + + + + output + Chomsky text + + + + + text/plain + + + + + text/plain + + + + + + + + inout + In and Out + Testing all WPS input and output parameters. + + + + + string + String + Enter a simple string. + + string + + This is just a string + + + + int + Integer + Choose an integer number from allowed values. + + integer + + 1 + 2 + 3 + 5 + 7 + 11 + + 7 + + + + float + Float + Enter a float number. + + float + + 3.14 + + + + boolean + Boolean + Make your choice :) + + boolean + + True + + + + angle + Angle + Enter an angle [0, 360] :) + + angle + + 90.0 + + + + time + Time + Enter a time like 12:00:00 + + time + + 12:00:00 + + + + date + Date + Enter a date like 2012-05-01 + + date + + 2012-05-01 + + + + datetime + Datetime + Enter a datetime like 2016-09-02T12:00:00Z + + dateTime + + 2016-09-02 12:00:00+00:00 + + + + string_choice + String Choice + Choose one item form list. + + string + + rock + paper + scissor + + scissor + + + + string_multiple_choice + String Multiple Choice + Choose one or two items from list. + + string + + sitting duck + flying goose + happy pinguin + gentle albatros + + gentle albatros + + + + text + Text + Enter a URL pointing to a text document (optional) + + + + text/plain + + + + + text/plain + + + + + + dataset + Dataset + Enter a URL pointing to a NetCDF file (optional) + + + + application/x-netcdf + base64 + + + + + application/x-netcdf + base64 + + + + + + + + string + String + + + string + + + + int + Integer + + + integer + + + + float + Float + + + float + + + + boolean + Boolean + + + boolean + + + + angle + Angle + + + angle + + + + time + Time + + + time + + + + date + Date + + + date + + + + datetime + DateTime + + + dateTime + + + + string_choice + String Choice + + + string + + + + string_multiple_choice + String Multiple Choice + + + string + + + + text + Text + Copy of input text file. + + + + text/plain + + + + + text/plain + + + + + + dataset + Dataset + Copy of input netcdf file. + + + + application/x-netcdf + base64 + + + + + application/x-netcdf + base64 + + + text/plain + + + + + + + bbox + Bounding Box + + + + epsg:4326 + + + epsg:4326 + + + + + + + binaryoperatorfornumbers + Binary Operator for Numbers + Performs operation on two numbers and returns the answer. This example process is taken from Climate4Impact. + + + + + + inputa + Input 1 + Enter Input 1 + + float + + 2.0 + + + + inputb + Input 2 + Enter Input 2 + + float + + 3.0 + + + + operator + Operator + Choose a binary Operator + + string + + add + substract + divide + multiply + + add + + + + + + output + Binary operator result + + + float + + + + + + show_error + Show a WPS Error + This process will fail intentionally with a WPS error message. + + + + + message + Error Message + Enter an error message that will be returned. + + string + + This process failed intentionally :) + + + + + + multiple_outputs + Multiple Outputs + Produces multiple files and returns a document with references to these files. + + + + count + Number of output files + The number of generated output files. + + integer + + 1 + 2 + 5 + 10 + + 1 + + + + + + output + Output + Text document with dummy content. + + + + text/plain + + + + + text/plain + + + + + + reference + Output References + Document with references to produced output files. + + + + application/json + + + + + application/json + + + + + + + + esgf_demo + ESGF Demo + Shows how to use WPS metadata for processes using ESGF data. + + + + + dataset + Dataset + You may provide a URL or upload a NetCDF file. + + + + application/x-netcdf + + + + + application/x-netcdf + + + + + + dataset_opendap + Remote OpenDAP Data URL + Or provide a remote OpenDAP data URL, for example: http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2.dailyavgs/surface/mslp.2016.nc + + string + + + + + + + output + Output response + A summary report. + + string + + + + + + output_formats + Return different output formats. + Dummy process returning various output file formats. + + + netcdf + netCDF dummy output file. + A very small test netCDF file. + + + + application/x-netcdf + base64 + + + + + application/x-netcdf + base64 + + + + + + json + json dummy output file. + A very small test json file. + + + + application/json + + + + + application/json + + + + + + + + poly_centroid + Approximate centroid of a polygon. + Return the polygon's centroid coordinates. If the geometry contains multiple polygons, only the centroid of the first one will be computed. Do not use for serious computations, this is only a test process and uses a crude approximation. + + + polygon + Region definition + A polygon defining a region. + + + + application/gml+xml + + + + + application/gml+xml + + + + + + + + output + The centroid of the polygon geometry. + The coordinates of the polygon's approximate centroid. + + string + + + + + + ncmeta + Return NetCDF Metadata + Return metadata from a netCDF dataset, either on file or an OpenDAP service. + + + + dataset + NetCDF Dataset + http://test.opendap.org:80/opendap/netcdf/examples/sresa1b_ncar_ccsm3_0_run1_200001.nc.nc4 + + + + application/x-netcdf + base64 + + + + + application/x-netcdf + base64 + + + + + + dataset_opendap + OpenDAP Dataset + http://test.opendap.org:80/opendap/netcdf/examples/sresa1b_ncar_ccsm3_0_run1_200001.nc + + + + application/x-ogc-dods + + + + + application/x-ogc-dods + + + + + + + + output + Metadata + + + + + text/plain + + + + + text/plain + + + + + + + \ No newline at end of file diff -Nru owslib-0.16.0/tests/resources/wps_EmuExecuteRequest7.xml owslib-0.18.0/tests/resources/wps_EmuExecuteRequest7.xml --- owslib-0.16.0/tests/resources/wps_EmuExecuteRequest7.xml 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/resources/wps_EmuExecuteRequest7.xml 2019-06-25 00:00:28.000000000 +0000 @@ -1 +1 @@ -wordcounttext +wordcounttextoutput diff -Nru owslib-0.16.0/tests/resources/wps_EmuExecuteRequest8.xml owslib-0.18.0/tests/resources/wps_EmuExecuteRequest8.xml --- owslib-0.16.0/tests/resources/wps_EmuExecuteRequest8.xml 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/resources/wps_EmuExecuteRequest8.xml 2019-06-25 00:00:28.000000000 +0000 @@ -1 +1 @@ -wordcounttextAlice was beginning to get very tired ... +wordcounttextAlice was beginning to get very tired ...output diff -Nru owslib-0.16.0/tests/resources/wps_HummingbirdExecuteResponse1.xml owslib-0.18.0/tests/resources/wps_HummingbirdExecuteResponse1.xml --- owslib-0.16.0/tests/resources/wps_HummingbirdExecuteResponse1.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wps_HummingbirdExecuteResponse1.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,52 @@ + + + spotchecker + Spot Checker + Checks a single uploaded or remote dataset against a variety of compliance standards. The dataset is either in the NetCDF format or a remote OpenDAP resource. Available compliance standards are the Climate and Forecast conventions (CF) and project specific rules for CMIP6 and CORDEX. + + + PyWPS Process Spot Checker finished + + + + test + Select the test you want to run. + CF-1.6=Climate and Forecast Conventions (CF) + + CF-1.6 + + + + dataset + Upload your NetCDF file here + or enter a URL pointing to a NetCDF file. + + + + + + output + Test Report + Compliance checker test report. + + + ncdump + ncdump of metadata + ncdump of header of checked dataset. + + + + + output + Test Report + Compliance checker test report. + + + + ncdump + ncdump of metadata + ncdump of header of checked dataset. + + + + diff -Nru owslib-0.16.0/tests/resources/wps_inout_parsing.xml owslib-0.18.0/tests/resources/wps_inout_parsing.xml --- owslib-0.16.0/tests/resources/wps_inout_parsing.xml 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/resources/wps_inout_parsing.xml 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,67 @@ + + + input1 + Input 1 + + + + COMMA + TAB + SPACE + + COMMA + + + + input2 + Input 2 + + + + YS + MS + QS-DEC + AS-JUL + + YS + + + + input3 + Input 3 + + + + + + + input4 + Input 4 + + string + + + + + input5 + Input 5 + + string + + YS + MS + QS-DEC + AS-JUL + + YS + + + + input6 + Input 6 + + string + + + + diff -Nru owslib-0.16.0/tests/resources/wps_PMLExecuteRequest4.xml owslib-0.18.0/tests/resources/wps_PMLExecuteRequest4.xml --- owslib-0.16.0/tests/resources/wps_PMLExecuteRequest4.xml 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/resources/wps_PMLExecuteRequest4.xml 2019-06-25 00:00:28.000000000 +0000 @@ -1 +1 @@ -reprojectImageinputImagehttp://rsg.pml.ac.uk/wps/testdata/elev_srtm_30m.imgoutputSRSEPSG:4326outputImage \ No newline at end of file +reprojectImageinputImagehttp://rsg.pml.ac.uk/wps/testdata/elev_srtm_30m.imgoutputSRSEPSG:4326outputImage diff -Nru owslib-0.16.0/tests/resources/wps_USGSExecuteRequest2.xml owslib-0.18.0/tests/resources/wps_USGSExecuteRequest2.xml --- owslib-0.16.0/tests/resources/wps_USGSExecuteRequest2.xml 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/resources/wps_USGSExecuteRequest2.xml 2019-06-25 00:00:28.000000000 +0000 @@ -1 +1 @@ -gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithmFEATURE_ATTRIBUTE_NAMESTATEDATASET_URIdods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncmlDATASET_IDccsm3_a1b_tmaxDATASET_IDccsm3_a1b_prDATASET_IDccsm3_a1fi_tmaxTIME_START1960-01-01T00:00:00.000ZTIME_END1960-12-31T00:00:00.000ZREQUIRE_FULL_COVERAGEtrueDELIMITERCOMMASTATISTICSMEANSTATISTICSMINIMUMSTATISTICSMAXIMUMSTATISTICSWEIGHT_SUMSTATISTICSVARIANCESTATISTICSSTD_DEVSTATISTICSCOUNTGROUP_BYSTATISTICSUMMARIZE_TIMESTEPtrueSUMMARIZE_FEATURE_ATTRIBUTEtrueFEATURE_COLLECTIONthe_geomSTATEOUTPUT \ No newline at end of file +gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithmFEATURE_ATTRIBUTE_NAMESTATEDATASET_URIdods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncmlDATASET_IDccsm3_a1b_tmaxDATASET_IDccsm3_a1b_prDATASET_IDccsm3_a1fi_tmaxTIME_START1960-01-01T00:00:00.000ZTIME_END1960-12-31T00:00:00.000ZREQUIRE_FULL_COVERAGEtrueDELIMITERCOMMASTATISTICSMEANSTATISTICSMINIMUMSTATISTICSMAXIMUMSTATISTICSWEIGHT_SUMSTATISTICSVARIANCESTATISTICSSTD_DEVSTATISTICSCOUNTGROUP_BYSTATISTICSUMMARIZE_TIMESTEPtrueSUMMARIZE_FEATURE_ATTRIBUTEtrueFEATURE_COLLECTIONthe_geomSTATEOUTPUT diff -Nru owslib-0.16.0/tests/resources/wps_USGSExecuteRequest3.xml owslib-0.18.0/tests/resources/wps_USGSExecuteRequest3.xml --- owslib-0.16.0/tests/resources/wps_USGSExecuteRequest3.xml 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/resources/wps_USGSExecuteRequest3.xml 2019-06-25 00:00:28.000000000 +0000 @@ -1 +1 @@ -gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithmFEATURE_ATTRIBUTE_NAMEthe_geomDATASET_URIdods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncmlDATASET_IDccsm3_a1b_tmaxTIME_START1960-01-01T00:00:00.000ZTIME_END1960-12-31T00:00:00.000ZREQUIRE_FULL_COVERAGEtrueDELIMITERCOMMASTATISTICSMEANSTATISTICSMINIMUMSTATISTICSMAXIMUMSTATISTICSWEIGHT_SUMSTATISTICSVARIANCESTATISTICSSTD_DEVSTATISTICSCOUNTGROUP_BYSTATISTICSUMMARIZE_TIMESTEPfalseSUMMARIZE_FEATURE_ATTRIBUTEfalseFEATURE_COLLECTION-102.8184 39.5273 -102.8184 37.418 -101.2363 37.418 -101.2363 39.5273 -102.8184 39.52730OUTPUT +gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithmFEATURE_ATTRIBUTE_NAMEthe_geomDATASET_URIdods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncmlDATASET_IDccsm3_a1b_tmaxTIME_START1960-01-01T00:00:00.000ZTIME_END1960-12-31T00:00:00.000ZREQUIRE_FULL_COVERAGEtrueDELIMITERCOMMASTATISTICSMEANSTATISTICSMINIMUMSTATISTICSMAXIMUMSTATISTICSWEIGHT_SUMSTATISTICSVARIANCESTATISTICSSTD_DEVSTATISTICSCOUNTGROUP_BYSTATISTICSUMMARIZE_TIMESTEPfalseSUMMARIZE_FEATURE_ATTRIBUTEfalseFEATURE_COLLECTION-102.8184 39.5273 -102.8184 37.418 -101.2363 37.418 -101.2363 39.5273 -102.8184 39.52730OUTPUT diff -Nru owslib-0.16.0/tests/resources/wps_USGSExecuteRequest4.xml owslib-0.18.0/tests/resources/wps_USGSExecuteRequest4.xml --- owslib-0.16.0/tests/resources/wps_USGSExecuteRequest4.xml 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/resources/wps_USGSExecuteRequest4.xml 2019-06-25 00:00:28.000000000 +0000 @@ -1 +1 @@ -gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithmFEATURE_ATTRIBUTE_NAMESTATEDATASET_URIdods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncmlDATASET_IDccsm3_a1b_tmaxDATASET_IDccsm3_a1b_prDATASET_IDccsm3_a1fi_tmaxTIME_START1960-01-01T00:00:00.000ZTIME_END1960-12-31T00:00:00.000ZREQUIRE_FULL_COVERAGEtrueDELIMITERCOMMASTATISTICSMEANSTATISTICSMINIMUMSTATISTICSMAXIMUMSTATISTICSWEIGHT_SUMSTATISTICSVARIANCESTATISTICSSTD_DEVSTATISTICSCOUNTGROUP_BYSTATISTICSUMMARIZE_TIMESTEPtrueSUMMARIZE_FEATURE_ATTRIBUTEtrueFEATURE_COLLECTIONthe_geomSTATEOUTPUT \ No newline at end of file +gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithmFEATURE_ATTRIBUTE_NAMESTATEDATASET_URIdods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncmlDATASET_IDccsm3_a1b_tmaxDATASET_IDccsm3_a1b_prDATASET_IDccsm3_a1fi_tmaxTIME_START1960-01-01T00:00:00.000ZTIME_END1960-12-31T00:00:00.000ZREQUIRE_FULL_COVERAGEtrueDELIMITERCOMMASTATISTICSMEANSTATISTICSMINIMUMSTATISTICSMAXIMUMSTATISTICSWEIGHT_SUMSTATISTICSVARIANCESTATISTICSSTD_DEVSTATISTICSCOUNTGROUP_BYSTATISTICSUMMARIZE_TIMESTEPtrueSUMMARIZE_FEATURE_ATTRIBUTEtrueFEATURE_COLLECTIONthe_geomSTATEOUTPUT diff -Nru owslib-0.16.0/tests/test_csw_geoserver.py owslib-0.18.0/tests/test_csw_geoserver.py --- owslib-0.16.0/tests/test_csw_geoserver.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_csw_geoserver.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,18 @@ +from tests.utils import service_ok + +import pytest + +from owslib.csw import CatalogueServiceWeb + +SERVICE_URL = 'http://gis.armf.bg:8080/geoserver/csw' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason='service is unreachable') +def test_csw_geoserver(): + c = CatalogueServiceWeb(SERVICE_URL) + c.getrecords2(typenames='csw:Record') + assert c.results.get('returned') > 0 + assert c.results.get('nextrecord') > 0 + assert c.results.get('matches') > 0 diff -Nru owslib-0.16.0/tests/test_csw_ngdc.py owslib-0.18.0/tests/test_csw_ngdc.py --- owslib-0.16.0/tests/test_csw_ngdc.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_csw_ngdc.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,40 @@ +from tests.utils import service_ok + +from owslib import fes, csw +from owslib.dif import namespaces + +import pytest + +SERVICE_URL = 'http://www.ngdc.noaa.gov/geoportal/csw' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason="CSW service is unreachable") +def test_csw_ngdc(): + "rewritten doctest/cws_ngdc.txt" + c = csw.CatalogueServiceWeb(SERVICE_URL, timeout=120) + assert c.identification.title == 'ArcGIS Server Geoportal Extension 10 - OGC CSW 2.0.2 ISO AP' + assert c.identification.version == '2.0.2' + assert sorted(c.identification.keywords) == [ + 'Geophysical Metadata', 'NGDC', 'Ocean Metadata', 'Space Weather Metadata'] + assert c.provider.name == 'NOAA NGDC' + + # Get some records + + sos_urn = 'urn:x-esri:specification:ServiceType:sos:url' + aoos_uuid = '1706F520-2647-4A33-B7BF-592FAFDE4B45' + uuid_filter = fes.PropertyIsEqualTo(propertyname='sys.siteuuid', literal="{%s}" % aoos_uuid) + + c.getrecords2([uuid_filter], esn='full', maxrecords=999999) + assert len(c.records) > 40 + assert 'AOOS SOS' in c.records + + aoos_sos = c.records['AOOS SOS'] + assert aoos_sos.abstract == 'Alaska Ocean Observing System SOS' + assert sorted([x['url'] for x in aoos_sos.references if x['scheme'] == sos_urn]) == [ + 'http://sos.aoos.org/sos/sos/kvp?service=SOS&request=GetCapabilities&acceptVersions=1.0.0', + 'http://sos.aoos.org/sos/sos/kvp?service=SOS&request=GetCapabilities&acceptVersions=1.0.0', + 'http://sos.aoos.org/sos/sos/kvp?service=SOS&request=GetCapabilities&acceptVersions=1.0.0'] + assert c.getService_urls(sos_urn) == [ + 'http://sos.aoos.org/sos/sos/kvp?service=SOS&request=GetCapabilities&acceptVersions=1.0.0'] diff -Nru owslib-0.16.0/tests/test_csw_pycsw.py owslib-0.18.0/tests/test_csw_pycsw.py --- owslib-0.16.0/tests/test_csw_pycsw.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_csw_pycsw.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,22 @@ +from tests.utils import service_ok + +import pytest + +from owslib.csw import CatalogueServiceWeb as cs + +SERVICE_URL = 'http://demo.pycsw.org/cite/csw' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason='service is unreachable') +def test_csw_pycsw(): + c = cs(SERVICE_URL) + assert c.updateSequence is not None + assert c.version == '2.0.2' + assert c.identification.title == 'pycsw OGC CITE demo and Reference Implementation' + assert c.constraints['MaxRecordDefault'].values[0] == '10' + c.getrecords2() + assert c.results.get('returned') > 0 + assert c.results.get('nextrecord') > 0 + assert c.results.get('matches') > 0 diff -Nru owslib-0.16.0/tests/test_csw_pycsw_skip_caps.py owslib-0.18.0/tests/test_csw_pycsw_skip_caps.py --- owslib-0.16.0/tests/test_csw_pycsw_skip_caps.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_csw_pycsw_skip_caps.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,18 @@ +from tests.utils import service_ok + +import pytest + +from owslib.csw import CatalogueServiceWeb as cs + +SERVICE_URL = 'http://demo.pycsw.org/cite/csw' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason='service is unreachable') +def test_csw_pycsw_skip_caps(): + c = cs(SERVICE_URL, skip_caps=True) + c.getrecords2() + assert c.results.get('returned') > 0 + assert c.results.get('nextrecord') > 0 + assert c.results.get('matches') > 0 diff -Nru owslib-0.16.0/tests/test_iso_parsing.py owslib-0.18.0/tests/test_iso_parsing.py --- owslib-0.16.0/tests/test_iso_parsing.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_iso_parsing.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,554 @@ +# -*- coding: utf-8 -*- + +import io + +from owslib import util +from owslib.etree import etree +from owslib.iso import ( + MD_Metadata, +) +from owslib.namespaces import Namespaces + + +def get_md_resource(file_path): + """Read the file and parse into an XML tree. + + Parameters + ---------- + file_path : str + Path of the file to read. + + Returns + ------- + etree.ElementTree + XML tree of the resource on disk. + + """ + namespaces = Namespaces().get_namespaces(keys=('gmd', 'gmi')) + + with io.open(file_path, mode='r', encoding='utf-8') as f: + data = f.read().encode('utf-8') + data = etree.fromstring(data) + mdelem = data.find('.//' + util.nspath_eval( + 'gmd:MD_Metadata', namespaces)) or data.find( + './/' + util.nspath_eval('gmi:MI_Metadata', namespaces)) + + if mdelem is None and data.tag == '{http://www.isotc211.org/2005/gmd}MD_Metadata': + mdelem = data + + return mdelem + + +def assert_list(var, length): + """Assert a given variable is a list with given size. + + Parameters + ---------- + var : variable + Variable to test (i.e. should be a list). + length : int + The length/size of the list. + + """ + assert type(var) is list + assert len(var) == length + + +def test_md_parsing_dov(): + """Test the parsing of a metadatarecord from DOV + + GetRecordById response available in + tests/resources/csw_dov_getrecordbyid.xml + + """ + md_resource = get_md_resource('tests/resources/csw_dov_getrecordbyid.xml') + md = MD_Metadata(md_resource) + + assert type(md) is MD_Metadata + + assert md.identifier == '6c39d716-aecc-4fbc-bac8-4f05a49a78d5' + assert md.dataseturi is None + assert md.parentidentifier is None + + assert md.language is None + assert md.languagecode == 'dut' + + assert md.charset == 'utf8' + assert md.datestamp == '2018-02-21T16:14:24' + + assert md.hierarchy == 'dataset' + + assert_list(md.contact, 1) + + contact = md.contact[0] + assert contact.organization == 'Vlaamse overheid - Vlaamse ' \ + 'MilieuMaatschappij - Afdeling ' \ + 'Operationeel Waterbeheer' + assert contact.address == 'Koning Albert II-laan 20 bus 16' + assert contact.city == 'Brussel' + assert contact.postcode == '1000' + assert contact.country == u'België' + assert contact.email == 'info@vmm.be' + assert contact.onlineresource.url == 'https://www.vmm.be' + assert contact.role == 'pointOfContact' + + assert md.stdname == 'ISO 19115/2003/Cor.1:2006' + assert md.stdver == 'GDI-Vlaanderen Best Practices - versie 1.0' + + assert md.referencesystem.code == '31370' + assert md.referencesystem.codeSpace == 'EPSG' + + assert_list(md.identificationinfo, 1) + + iden = md.identificationinfo[0] + assert iden.title == 'Grondwatermeetnetten' + assert iden.alternatetitle == 'Grondwatermeetnetten beschikbaar op DOV' + + assert_list(iden.date, 2) + assert iden.date[0].date == '2002-05-22' + assert iden.date[0].type == 'creation' + assert iden.date[1].date == '2002-05-22' + assert iden.date[1].type == 'publication' + + assert_list(iden.uricode, 1) + assert iden.uricode[0] == 'A64F073B-9FBE-91DD-36FDE7462BBAFA61' + + assert_list(iden.uricodespace, 1) + assert iden.uricodespace[0] == 'DOV-be' + + assert_list(iden.uselimitation, 3) + assert "Zie 'Overige beperkingen'" in iden.uselimitation + assert "Bij het gebruik van de informatie die DOV aanbiedt, dient steeds " \ + "volgende standaardreferentie gebruikt te worden: Databank " \ + "Ondergrond Vlaanderen - (vermelding van de beheerder en de " \ + "specifieke geraadpleegde gegevens) - Geraadpleegd op dd/mm/jjjj, " \ + "op https://www.dov.vlaanderen.be" in iden.uselimitation + assert "Volgende aansprakelijkheidsbepalingen gelden: " \ + "https://www.dov.vlaanderen.be/page/disclaimer" in iden.uselimitation + + assert_list(iden.uselimitation_url, 0) + + assert_list(iden.accessconstraints, 1) + assert iden.accessconstraints[0] == 'otherRestrictions' + + assert_list(iden.classification, 0) + + assert_list(iden.otherconstraints, 1) + assert iden.otherconstraints[ + 0] == "Data beschikbaar voor hergebruik volgens de " \ + "Modellicentie Gratis Hergebruik. Toelichting " \ + "beschikbaar op " \ + "https://www.dov.vlaanderen.be/page/gebruiksvoorwaarden-dov-services" + + assert_list(iden.securityconstraints, 1) + assert iden.securityconstraints[0] == 'unclassified' + + assert_list(iden.useconstraints, 0) + + assert_list(iden.denominators, 1) + assert iden.denominators[0] == '10000' + + assert_list(iden.distance, 0) + assert_list(iden.uom, 0) + + assert_list(iden.resourcelanguage, 0) + assert_list(iden.resourcelanguagecode, 1) + assert iden.resourcelanguagecode[0] == 'dut' + + assert_list(iden.creator, 0) + assert_list(iden.publisher, 0) + assert_list(iden.contributor, 0) + + assert iden.edition is None + + assert iden.abstract.startswith("In de Databank Ondergrond Vlaanderen " + "zijn verschillende grondwatermeetnetten " + "opgenomen.") + + assert iden.purpose.startswith( + "Het doel van de meetnetten is inzicht krijgen in de kwaliteit en " + "kwantiteit van de watervoerende lagen in de ondergrond van " + "Vlaanderen. Algemeen kan gesteld worden dat de grondwatermeetnetten " + "een belangrijk beleidsinstrument vormen") + + assert iden.status == 'onGoing' + + assert_list(iden.contact, 2) + + assert iden.contact[0].organization == 'Vlaamse overheid - Vlaamse MilieuMaatschappij - Afdeling Operationeel Waterbeheer' + assert iden.contact[0].address == 'Koning Albert II-laan 20 bus 16' + assert iden.contact[0].city == 'Brussel' + assert iden.contact[0].postcode == '1000' + assert iden.contact[0].country == u'België' + assert iden.contact[0].email == 'info@vmm.be' + assert iden.contact[0].onlineresource.url == 'https://www.vmm.be' + assert iden.contact[0].role == 'pointOfContact' + + assert iden.contact[1].organization == 'Databank Ondergrond Vlaanderen (' \ + 'DOV)' + assert iden.contact[1].address == 'Technologiepark Gebouw 905' + assert iden.contact[1].city == 'Zwijnaarde' + assert iden.contact[1].postcode == '9052' + assert iden.contact[1].country == u'België' + assert iden.contact[1].email == 'dov@vlaanderen.be' + assert iden.contact[1].onlineresource.url == \ + 'https://www.dov.vlaanderen.be' + assert iden.contact[1].role == 'distributor' + + assert_list(iden.spatialrepresentationtype, 1) + assert iden.spatialrepresentationtype[0] == 'vector' + + assert_list(iden.keywords, 5) + + assert type(iden.keywords[0]) is dict + assert iden.keywords[0]['type'] == '' + assert iden.keywords[0]['thesaurus']['title'] == "GEMET - INSPIRE thema's, versie 1.0" + assert iden.keywords[0]['thesaurus']['date'] == '2008-06-01' + assert iden.keywords[0]['thesaurus']['datetype'] == 'publication' + assert_list(iden.keywords[0]['keywords'], 1) + assert iden.keywords[0]['keywords'] == ['Geologie'] + + assert type(iden.keywords[1]) is dict + assert iden.keywords[1]['type'] == '' + assert iden.keywords[1]['thesaurus'][ + 'title'] == "GEMET - Concepten, versie 2.4" + assert iden.keywords[1]['thesaurus']['date'] == '2010-01-13' + assert iden.keywords[1]['thesaurus']['datetype'] == 'publication' + assert_list(iden.keywords[1]['keywords'], 2) + assert iden.keywords[1]['keywords'] == ['grondwater', 'meetnet(werk)'] + + assert type(iden.keywords[2]) is dict + assert iden.keywords[2]['type'] == '' + assert iden.keywords[2]['thesaurus'][ + 'title'] == "Vlaamse regio's" + assert iden.keywords[2]['thesaurus']['date'] == '2013-09-25' + assert iden.keywords[2]['thesaurus']['datetype'] == 'publication' + assert_list(iden.keywords[2]['keywords'], 1) + assert iden.keywords[2]['keywords'] == ['Vlaams Gewest'] + + assert type(iden.keywords[3]) is dict + assert iden.keywords[3]['type'] is None + assert iden.keywords[3]['thesaurus'][ + 'title'] == "GDI-Vlaanderen Trefwoorden" + assert iden.keywords[3]['thesaurus']['date'] == '2014-02-26' + assert iden.keywords[3]['thesaurus']['datetype'] == 'publication' + assert_list(iden.keywords[3]['keywords'], 7) + assert iden.keywords[3]['keywords'] == [ + 'Toegevoegd GDI-Vl', 'Herbruikbaar', 'Vlaamse Open data', + 'Kosteloos', 'Lijst M&R INSPIRE', 'Metadata INSPIRE-conform', + 'Metadata GDI-Vl-conform'] + + assert type(iden.keywords[4]) is dict + assert iden.keywords[4]['type'] is None + assert iden.keywords[4]['thesaurus']['title'] == "DOV" + assert iden.keywords[4]['thesaurus']['date'] == '2010-12-01' + assert iden.keywords[4]['thesaurus']['datetype'] == 'publication' + assert_list(iden.keywords[4]['keywords'], 7) + assert iden.keywords[4]['keywords'] == [ + 'Ondergrond', 'DOV', 'Vlaanderen', 'monitoring', 'meetnetten', + 'Kaderrichtlijn Water', 'Decreet Integraal waterbeleid'] + + assert_list(iden.keywords2, 5) + assert iden.keywords2[0].type == '' + assert iden.keywords2[0].thesaurus[ + 'title'] == "GEMET - INSPIRE thema's, versie 1.0" + assert iden.keywords2[0].thesaurus['date'] == '2008-06-01' + assert iden.keywords2[0].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[0].keywords, 1) + assert iden.keywords2[0].keywords == ['Geologie'] + + assert iden.keywords2[1].type == '' + assert iden.keywords2[1].thesaurus[ + 'title'] == "GEMET - Concepten, versie 2.4" + assert iden.keywords2[1].thesaurus['date'] == '2010-01-13' + assert iden.keywords2[1].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[1].keywords, 2) + assert iden.keywords2[1].keywords == ['grondwater', 'meetnet(werk)'] + + assert iden.keywords2[2].type == '' + assert iden.keywords2[2].thesaurus[ + 'title'] == "Vlaamse regio's" + assert iden.keywords2[2].thesaurus['date'] == '2013-09-25' + assert iden.keywords2[2].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[2].keywords, 1) + assert iden.keywords2[2].keywords == ['Vlaams Gewest'] + + assert iden.keywords2[3].type is None + assert iden.keywords2[3].thesaurus[ + 'title'] == "GDI-Vlaanderen Trefwoorden" + assert iden.keywords2[3].thesaurus['date'] == '2014-02-26' + assert iden.keywords2[3].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[3].keywords, 7) + assert iden.keywords2[3].keywords == [ + 'Toegevoegd GDI-Vl', 'Herbruikbaar', 'Vlaamse Open data', + 'Kosteloos', 'Lijst M&R INSPIRE', 'Metadata INSPIRE-conform', + 'Metadata GDI-Vl-conform'] + + assert iden.keywords2[4].type is None + assert iden.keywords2[4].thesaurus['title'] == "DOV" + assert iden.keywords2[4].thesaurus['date'] == '2010-12-01' + assert iden.keywords2[4].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[4].keywords, 7) + assert iden.keywords2[4].keywords == [ + 'Ondergrond', 'DOV', 'Vlaanderen', 'monitoring', 'meetnetten', + 'Kaderrichtlijn Water', 'Decreet Integraal waterbeleid'] + + assert_list(iden.topiccategory, 1) + assert iden.topiccategory[0] == 'geoscientificInformation' + + assert iden.supplementalinformation == \ + "https://www.dov.vlaanderen.be/page/grondwatermeetnet" + + assert_list(md.contentinfo, 1) + ci = md.contentinfo[0] + + assert ci.compliancecode is None + assert_list(ci.language, 0) + assert ci.includedwithdataset == True + assert_list(ci.featuretypenames, 0) + + assert_list(ci.featurecatalogues, 1) + assert ci.featurecatalogues[0] == 'b142965f-b2aa-429e-86ff-a7cb0e065d48' + + +def test_md_parsing_geobretagne(): + """Test the parsing of a metadatarecord from GéoBretagne + + MD_Metadata record available in + tests/resources/csw_geobretagne_mdmetadata.xml + + """ + md_resource = get_md_resource( + 'tests/resources/csw_geobretagne_mdmetadata.xml') + md = MD_Metadata(md_resource) + + assert type(md) is MD_Metadata + + assert md.identifier == '955c3e47-411e-4969-b61b-3556d1b9f879' + assert md.dataseturi is None + assert md.parentidentifier is None + + assert md.language == 'fre' + assert md.languagecode is None + + assert md.charset == 'utf8' + assert md.datestamp == '2018-07-30T14:19:40' + + assert md.hierarchy == 'dataset' + + assert_list(md.contact, 1) + + contact = md.contact[0] + assert contact.organization == 'DIRECTION GENERALE DES FINANCES ' \ + 'PUBLIQUES BUREAU GF-3A' + assert contact.address is None + assert contact.city is None + assert contact.postcode is None + assert contact.country is None + assert contact.email == 'bureau.gf3a@dgfip.finances.gouv.fr' + assert contact.onlineresource is None + assert contact.role == 'pointOfContact' + + assert md.stdname == 'ISO 19115' + assert md.stdver == '1.0' + + assert md.referencesystem.code == 'RGF93 / CC48 (EPSG:3948)' + assert md.referencesystem.codeSpace == 'EPSG' + + assert_list(md.identificationinfo, 1) + + iden = md.identificationinfo[0] + assert iden.title == 'Cadastre 2018 en Bretagne' + assert iden.alternatetitle is None + + assert_list(iden.date, 1) + assert iden.date[0].date == '2018-09-01' + assert iden.date[0].type == 'revision' + + assert_list(iden.uricode, 1) + assert iden.uricode[0] == 'https://geobretagne.fr/geonetwork/apps/georchestra/?uuid=363e3a8e-d0ce-497d-87a9-2a2d58d82772' + assert_list(iden.uricodespace, 0) + + assert_list(iden.uselimitation, 2) + assert u"le plan cadastral décrit les limites apparentes de la " \ + u"propriété." in iden.uselimitation + + assert_list(iden.uselimitation_url, 0) + + assert_list(iden.accessconstraints, 1) + assert iden.accessconstraints[0] == 'otherRestrictions' + + assert_list(iden.classification, 0) + + assert_list(iden.otherconstraints, 1) + assert iden.otherconstraints[ + 0] == u'Usage libre sous réserve des mentions obligatoires ' \ + u'sur tout document de diffusion : "Source : DGFIP"' + + assert_list(iden.securityconstraints, 0) + + assert_list(iden.useconstraints, 1) + assert iden.useconstraints[0] == 'copyright' + + assert_list(iden.denominators, 1) + assert iden.denominators[0] == '500' + + assert_list(iden.distance, 0) + assert_list(iden.uom, 0) + + assert_list(iden.resourcelanguage, 1) + assert iden.resourcelanguage[0] == 'fre' + assert_list(iden.resourcelanguagecode, 0) + + assert_list(iden.creator, 0) + assert_list(iden.publisher, 0) + assert_list(iden.contributor, 0) + + assert iden.edition is None + + assert iden.abstract.startswith( + u"Le plan du cadastre est un document administratif qui propose " + u"l’unique plan parcellaire à grande échelle couvrant le territoire " + u"national.") + + assert iden.purpose.startswith( + u"Le but premier du plan cadastral est d'identifier, de localiser et " + u"représenter la propriété foncière, ainsi que de servir à l'assise " + u"de la fiscalité locale des propriétés non bâties.") + + assert iden.status == 'completed' + + assert_list(iden.contact, 1) + + assert iden.contact[0].organization == 'DGFIP Bretagne' + assert iden.contact[0].name == 'DIRECTION GENERALE DES FINANCES PUBLIQUES' + assert iden.contact[0].address is None + assert iden.contact[0].city is None + assert iden.contact[0].postcode is None + assert iden.contact[0].country is None + assert iden.contact[0].email == 'bureau.gf3a@dgfip.finances.gouv.fr' + assert iden.contact[0].onlineresource is None + assert iden.contact[0].role == 'pointOfContact' + + assert_list(iden.spatialrepresentationtype, 1) + assert iden.spatialrepresentationtype[0] == 'vector' + + assert_list(iden.keywords, 7) + + assert type(iden.keywords[0]) is dict + assert iden.keywords[0]['type'] == 'place' + assert iden.keywords[0]['thesaurus']['title'] is None + assert iden.keywords[0]['thesaurus']['date'] is None + assert iden.keywords[0]['thesaurus']['datetype'] is None + assert_list(iden.keywords[0]['keywords'], 1) + assert iden.keywords[0]['keywords'] == ['France'] + + assert type(iden.keywords[1]) is dict + assert iden.keywords[1]['type'] is None + assert iden.keywords[1]['thesaurus']['title'] is None + assert iden.keywords[1]['thesaurus']['date'] is None + assert iden.keywords[1]['thesaurus']['datetype'] is None + assert_list(iden.keywords[1]['keywords'], 0) + + assert type(iden.keywords[2]) is dict + assert iden.keywords[2]['type'] == 'theme' + assert iden.keywords[2]['thesaurus']['title'] is None + assert iden.keywords[2]['thesaurus']['date'] is None + assert iden.keywords[2]['thesaurus']['datetype'] is None + assert_list(iden.keywords[2]['keywords'], 7) + assert iden.keywords[2]['keywords'] == [ + u'bâtiments', 'adresses', 'parcelles cadastrales', 'hydrographie', + u'réseaux de transport', u'unités administratives', + u'référentiels de coordonnées'] + + assert type(iden.keywords[3]) is dict + assert iden.keywords[3]['type'] == 'theme' + assert iden.keywords[3]['thesaurus']['title'] is None + assert iden.keywords[3]['thesaurus']['date'] is None + assert iden.keywords[3]['thesaurus']['datetype'] is None + assert_list(iden.keywords[3]['keywords'], 5) + assert iden.keywords[3]['keywords'] == [ + u'bâtis', 'sections', 'parcelles', 'cadastre', 'cadastrale'] + + assert type(iden.keywords[4]) is dict + assert iden.keywords[4]['type'] == 'theme' + assert iden.keywords[4]['thesaurus']['title'] == u"GéoBretagne v 2.0" + assert iden.keywords[4]['thesaurus']['date'] == '2014-01-13' + assert iden.keywords[4]['thesaurus']['datetype'] == 'publication' + assert_list(iden.keywords[4]['keywords'], 1) + assert iden.keywords[4]['keywords'] == [u'référentiels : cadastre'] + + assert type(iden.keywords[5]) is dict + assert iden.keywords[5]['type'] == 'theme' + assert iden.keywords[5]['thesaurus']['title'] == "INSPIRE themes" + assert iden.keywords[5]['thesaurus']['date'] == '2008-06-01' + assert iden.keywords[5]['thesaurus']['datetype'] == 'publication' + assert_list(iden.keywords[5]['keywords'], 1) + assert iden.keywords[5]['keywords'] == ['Parcelles cadastrales'] + + assert type(iden.keywords[6]) is dict + assert iden.keywords[6]['type'] == 'theme' + assert iden.keywords[6]['thesaurus']['title'] == "GEMET" + assert iden.keywords[6]['thesaurus']['date'] == '2012-07-20' + assert iden.keywords[6]['thesaurus']['datetype'] == 'publication' + assert_list(iden.keywords[6]['keywords'], 2) + assert iden.keywords[6]['keywords'] == ['cadastre', u'bâtiment'] + + assert_list(iden.keywords2, 6) + + assert iden.keywords2[0].type == 'place' + assert iden.keywords2[0].thesaurus is None + assert_list(iden.keywords2[0].keywords, 1) + assert iden.keywords2[0].keywords == ['France'] + + assert iden.keywords2[1].type == 'theme' + assert iden.keywords2[1].thesaurus is None + assert_list(iden.keywords2[1].keywords, 7) + assert iden.keywords2[1].keywords == [ + u'bâtiments', 'adresses', 'parcelles cadastrales', 'hydrographie', + u'réseaux de transport', u'unités administratives', + u'référentiels de coordonnées'] + + assert iden.keywords2[2].type == 'theme' + assert iden.keywords2[2].thesaurus is None + assert_list(iden.keywords2[2].keywords, 5) + assert iden.keywords2[2].keywords == [ + u'bâtis', 'sections', 'parcelles', 'cadastre', 'cadastrale'] + + assert iden.keywords2[3].type == 'theme' + assert iden.keywords2[3].thesaurus['title'] == u"GéoBretagne v 2.0" + assert iden.keywords2[3].thesaurus['date'] == '2014-01-13' + assert iden.keywords2[3].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[3].keywords, 1) + assert iden.keywords2[3].keywords == [u'référentiels : cadastre'] + + assert iden.keywords2[4].type == 'theme' + assert iden.keywords2[4].thesaurus['title'] == "INSPIRE themes" + assert iden.keywords2[4].thesaurus['date'] == '2008-06-01' + assert iden.keywords2[4].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[4].keywords, 1) + assert iden.keywords2[4].keywords == ['Parcelles cadastrales'] + + assert iden.keywords2[5].type == 'theme' + assert iden.keywords2[5].thesaurus['title'] == "GEMET" + assert iden.keywords2[5].thesaurus['date'] == '2012-07-20' + assert iden.keywords2[5].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[5].keywords, 2) + assert iden.keywords2[5].keywords == ['cadastre', u'bâtiment'] + + assert_list(iden.topiccategory, 1) + assert iden.topiccategory[0] == 'planningCadastre' + + assert iden.supplementalinformation == \ + u"La légende du plan cadastral est consultable sur: " \ + "http://www.cadastre.gouv.fr/scpc/pdf/legendes/FR_fr/Legende%20du" \ + "%20plan%20sur%20internet.pdf" + + assert_list(md.contentinfo, 1) + ci = md.contentinfo[0] + + assert ci.compliancecode is None + assert_list(ci.language, 0) + assert ci.includedwithdataset == False + assert_list(ci.featuretypenames, 0) + assert_list(ci.featurecatalogues, 0) \ No newline at end of file diff -Nru owslib-0.16.0/tests/test_owscontext_atomxml.py owslib-0.18.0/tests/test_owscontext_atomxml.py --- owslib-0.16.0/tests/test_owscontext_atomxml.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_owscontext_atomxml.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- +# ============================================================================= +# Authors : Alexander Kmoch +# +# ============================================================================= + +""" +initial test setup for Ows Context +""" + +from __future__ import (absolute_import, division, print_function) + +import os + +from owslib.owscontext.atom import decode_atomxml +from owslib.owscontext.core import OwcContext +from tests.utils import resource_file, setup_logging, scratch_file + +from owslib.etree import etree +from owslib import util +from owslib.namespaces import Namespaces +from owslib.util import nspath_eval + +from owslib.util import log + +from owslib.owscontext.common import is_empty + +# default variables +add_namespaces = {"georss": "http://www.georss.org/georss", + "owc": "http://www.opengis.net/owc/1.0", + "xml": "http://www.w3.org/XML/1998/namespace"} + + +def get_namespaces(): + n = Namespaces() + ns = n.get_namespaces(["atom", "dc", "gml", "gml32", "xlink"]) + ns.update(add_namespaces) + ns[None] = n.get_namespace("atom") + return ns + + +ns = get_namespaces() + + +def nspv(path): + """ + short-hand syntax seen in waterml2.py + :param path: xpath namespace aware + :return: xml element + """ + return nspath_eval(path, ns) + + +logger = setup_logging(loglevel='DEBUG') + + +def setup_module(module): + """Setup for the owc test module""" + logger.debug('Setup logging in debug') + # Do actual setup stuff here if necessary + pass + + +def test_load_feeds_bulk(): + atom1 = open(resource_file(os.path.join('owc_atom_examples', 'geotiff.xml')), 'rb').read() + atom2 = open(resource_file(os.path.join('owc_atom_examples', 'csw_10entries.xml')), 'rb').read() + atom3 = open(resource_file(os.path.join('owc_atom_examples', 'gml_road.xml')), 'rb').read() + atom4 = open(resource_file(os.path.join('owc_atom_examples', 'gmlcov.xml')), 'rb').read() + atom5 = open(resource_file(os.path.join('owc_atom_examples', 'meris.atom')), 'rb').read() + atom6 = open(resource_file(os.path.join('owc_atom_examples', 'meris_borders_users.atom')), 'rb').read() + atom7 = open(resource_file(os.path.join('owc_atom_examples', 'meris_noauthor.xml')), 'rb').read() + atom8 = open(resource_file(os.path.join('owc_atom_examples', 'meris_noprofile.xml')), 'rb').read() + atom9 = open(resource_file(os.path.join('owc_atom_examples', 'sea_ice_extent_01.atom')), 'rb').read() + atom10 = open(resource_file(os.path.join('owc_atom_examples', 'wcs_kml.xml')), 'rb').read() + atom11 = open(resource_file(os.path.join('owc_atom_examples', 'wfs_100entries.xml')), 'rb').read() + atom12 = open(resource_file(os.path.join('owc_atom_examples', 'wms_gml_hurricane_tomas.xml')), 'rb').read() + atom13 = open(resource_file(os.path.join('owc_atom_examples', 'wms_meris.xml')), 'rb').read() + atom14 = open(resource_file(os.path.join('owc_atom_examples', 'wms_scale.xml')), 'rb').read() + atom15 = open(resource_file(os.path.join('owc_atom_examples', 'wmstestdata.xml')), 'rb').read() + atom16 = open(resource_file(os.path.join('owc_atom_examples', 'wmts.xml')), 'rb').read() + atom17 = open(resource_file(os.path.join('owc_atom_examples', 'wps_52north.xml')), 'rb').read() + + feeds = [atom1, atom2, atom3, atom4, atom5, atom6, atom7, atom8, atom9, atom10, + atom11, atom12, atom13, atom14, atom15, atom16, atom17] + + for f in feeds: + # logger.debug(f) + dict_obj = decode_atomxml(f) + assert dict_obj is not None + # logger.debug("dict title: " + dict_obj.get('properties').get('title')) + owc = OwcContext.from_dict(dict_obj) + assert owc is not None + # logger.debug("owc title: " + owc.title) + for res in owc.resources: + # logger.debug(res.id) + assert res.title is not None + # logger.debug(OwcContext.from_dict(dict_obj).to_json()) + + jsdata = owc.to_json() + assert jsdata is not None + assert len(jsdata) > 10 + re_owc = OwcContext.from_json(jsdata) + assert re_owc is not None + + assert owc.to_dict() == re_owc.to_dict() + + # and other way round + a_owc = OwcContext.from_atomxml(f) + assert a_owc is not None + assert len(a_owc.resources) > 0 + for a_res in a_owc.resources: + assert len(a_res.offerings) > 0 + for a_off in a_res.offerings: + ops = len(a_off.operations) + con = len(a_off.contents) + sty = len(a_off.styles) + assert (ops + con + sty) > 0 + + a_jsdata = a_owc.to_json() + a_re_owc = OwcContext.from_json(a_jsdata) + assert len(a_re_owc.resources) > 0 + for a_re_res in a_owc.resources: + assert len(a_re_res.offerings) > 0 + for a_re_off in a_re_res.offerings: + ops = len(a_re_off.operations) + con = len(a_re_off.contents) + sty = len(a_re_off.styles) + assert (ops + con + sty) > 0 + assert a_owc.to_dict() == a_re_owc.to_dict() + + +def test_single_atomxml_coding(): + atom1 = open(resource_file(os.path.join('owc_atom_examples', 'wms_meris.xml')), 'rb').read() + owc = OwcContext.from_atomxml(atom1) + assert owc is not None + # logger.debug("s owc title: " + owc.title) + for res in owc.resources: + # logger.debug("s res id: " + res.id) + assert res.title is not None + assert len(res.offerings) > 0 + for off in res.offerings: + # logger.debug("s off code: " + off.offering_code) + assert off.operations is not None + assert len(off.operations) > 0 + # for lnk in res.preview: + # logger.debug(lnk.to_dict()) + + jsdata = owc.to_json() + assert jsdata is not None + assert len(jsdata) > 10 + re_owc = OwcContext.from_json(jsdata) + assert re_owc is not None + for res in re_owc.resources: + # logger.debug("s res id: " + res.id) + assert res.title is not None + assert len(res.offerings) > 0 + for off in res.offerings: + # logger.debug("s off code: " + off.offering_code) + assert off.operations is not None + assert len(off.operations) > 0 + # for lnk in res.preview: + # logger.debug(lnk.to_dict()) + assert owc.to_dict() == re_owc.to_dict() + # logger.debug(owc.to_json()) diff -Nru owslib-0.16.0/tests/test_owscontext_geojson.py owslib-0.18.0/tests/test_owscontext_geojson.py --- owslib-0.16.0/tests/test_owscontext_geojson.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_owscontext_geojson.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,236 @@ +# -*- coding: utf-8 -*- +# ============================================================================= +# Authors : Alexander Kmoch +# +# ============================================================================= + +""" +initial test setup for Ows Context +""" + +from __future__ import (absolute_import, division, print_function) + +# TODO make dates from (currently) string to datetime instances +from datetime import datetime + +from owslib.owscontext.common import TimeIntervalFormat, skip_nulls, extract_p +from owslib.owscontext.core import OwcResource, OwcContext +from owslib.owscontext.geojson import decode_json +from tests.utils import resource_file, setup_logging + +import os + +logger = setup_logging(loglevel='INFO') + +def setup_module(module): + """Setup for the owc test module""" + logger.debug('Setup logging in debug') + # Do actual setup stuff here if necessary + pass + + +def test_time_interval_format(): + single_date_str = "2013-11-02T15:24:24.446+12:00" + interval_date_str = "2011-11-04T00:01:23Z/2017-12-05T17:28:56Z" + bogus = "2011-11-04" + + ti1 = TimeIntervalFormat.from_string(single_date_str) + assert isinstance(ti1.start, datetime) + logger.debug(ti1.__str__()) + logger.debug(ti1.start.isoformat()) + + ti2 = TimeIntervalFormat.from_string(interval_date_str) + assert isinstance(ti2.start, datetime) + assert isinstance(ti2.end, datetime) + logger.debug(ti2.__str__()) + logger.debug(ti2.end.isoformat()) + + ti3 = TimeIntervalFormat.from_string(bogus) + assert isinstance(ti3.start, datetime) + logger.debug(ti3.__str__()) + + +def test_extract_p(): + t1 = {"date": "2013-11-02T15:24:24.446+12:00"} + assert isinstance(t1, dict) + assert t1.items() is not None + assert t1.get('date') == "2013-11-02T15:24:24.446+12:00" + t2 = extract_p('date', t1, None) + assert t2 is not None + assert t1.get('date') == t2 + + +def test_json_decode(): + jsdata = """{ + "type": "FeatureCollection", + "id": "http://www.opengis.net/owc/1.0/examples/wps_52north/", + "features": [ + { + "id": "http://geoprocessing.demo.52north.org:8080/wps/WebProcessingService/process1/", + "geometry": null, + "properties": { + "categories": [], + "date": "2013-11-02T15:24:24.446+12:00" + } + } + ] +}""" + result = decode_json(jsdata) + assert result is not None + assert result['features'][0]['properties']['date'] == "2013-11-02T15:24:24.446+12:00" + + +def test_decode_single_json(): + jsondata1 = open(resource_file(os.path.join('owc_geojson_examples', 'owc1.geojson')), 'r').read() + + result = decode_json(jsondata1) + assert result is not None + assert result['features'][0]['properties']['date'] == "2013-11-02T15:24:24.446+12:00" + + +def test_encode_json_small(): + feat = OwcResource(id="http://the.resource.com/id=1", + update_date=datetime.now(), + title="resource title", + temporal_extent=TimeIntervalFormat.from_string( + "2013-11-02T15:24:24.446+12:00")) + assert feat.temporal_extent.to_dict() == TimeIntervalFormat.from_string( + "2013-11-02T15:24:24.446+12:00").to_dict() + + t1 = feat.to_dict() + t2 = skip_nulls(feat.to_dict()) + + assert t1.get('temporal_extent') == t2.get('temporal_extent') + + owc1 = OwcContext(id="http://ows.com/id1", + update_date=datetime.now(), + title="my context collection 1", + time_interval_of_interest=TimeIntervalFormat.from_string( + "2013-11-02T15:24:24.446+12:00"), + resources=[]) + assert owc1.time_interval_of_interest.to_dict() == TimeIntervalFormat.from_string( + "2013-11-02T15:24:24.446+12:00").to_dict() + + t3 = skip_nulls(owc1.to_dict()) + + assert owc1.id == "http://ows.com/id1" + assert owc1.language == "en" + assert owc1.title == "my context collection 1" + assert len(owc1.keywords) == 0 + + jsdata = owc1.to_json() + logger.debug(jsdata) + assert len(jsdata) > 0 + + +def test_decode_json_small(): + owc1 = OwcContext(id="http://ows.com/id1", + update_date=datetime.now(), + title="my context collection 1") + jsdata = owc1.to_json() + owc2 = OwcContext.from_json(jsdata) + assert owc2 is not None + assert isinstance(owc2, OwcContext) + logger.debug(owc2.to_dict()) + assert owc2.id == "http://ows.com/id1" + assert owc2.language == "en" + assert owc2.title == "my context collection 1" + assert len(owc1.keywords) == 0 + + +def test_load_parse(): + jsondata = open(resource_file(os.path.join('owc_geojson_examples', 'owc1.geojson')), 'rb').read().decode('utf-8') + # logger.debug(jsondata) + my_dict = decode_json(jsondata) + logger.debug(str(my_dict)) + assert my_dict is not None + + +def test_decode_full_json1(): + jsondata1 = open(resource_file(os.path.join('owc_geojson_examples', 'owc1.geojson')), 'r').read() + owc1 = OwcContext.from_json(jsondata1) + assert owc1 is not None + assert owc1.resources[0].temporal_extent.to_dict() == TimeIntervalFormat.from_string( + "2013-11-02T15:24:24.446+12:00").to_dict() + # logger.debug(owc1.to_json()) + re_owc1 = OwcContext.from_json(owc1.to_json()) + assert owc1.to_dict() == re_owc1.to_dict() + + getcapa_ops = [op for op in owc1.resources[0].offerings[0].operations if op.operations_code == "GetCapabilities"] + assert len(getcapa_ops) > 0 + assert getcapa_ops[0].mimetype == "application/xml" + +def test_decode_full_json2(): + jsondata2 = open(resource_file(os.path.join('owc_geojson_examples', 'owc2.geojson')), 'rb').read().decode('latin1') + owc2 = OwcContext.from_json(jsondata2) + assert owc2 is not None + # logger.debug(owc2.to_json()) + re_owc2 = OwcContext.from_json(owc2.to_json()) + assert owc2.to_dict() == re_owc2.to_dict() + + assert owc2.creator_application.title == "Web Enterprise Suite" + assert owc2.spec_reference[0].href == "http://www.opengis.net/spec/owc-geojson/1.0/req/core" + assert isinstance(owc2.resources[0].geospatial_extent, dict) + geo = owc2.resources[0].geospatial_extent + assert geo.get('type') == "Polygon" + assert isinstance(geo.get('coordinates'), list) + + +def test_decode_full_json3(): + jsondata3 = open(resource_file(os.path.join('owc_geojson_examples', 'owc3.geojson')), 'rb').read().decode('utf-8') + + owc3 = OwcContext.from_json(jsondata3) + assert owc3 is not None + logger.debug(owc3.to_json()) + re_owc3 = OwcContext.from_json(owc3.to_json()) + assert owc3.to_dict() == re_owc3.to_dict() + + assert owc3.creator_display.pixel_width == 800 + assert owc3.authors[0].email == "a.kmoch@gns.cri.nz" + + assert len(owc3.keywords) == 5 + assert owc3.resources[0].keywords[0].label == "Informative Layers" + + links_via = [l for l in owc3.context_metadata if + l.href == "http://portal.smart-project.info/context/smart-sac.owc.json"] + assert len(links_via) == 1 + + assert owc3.resources[0].temporal_extent.to_dict() == TimeIntervalFormat.from_string( + "2011-11-04T00:01:23Z/2017-12-05T17:28:56Z").to_dict() + + wms_offering = [of for of in owc3.resources[0].offerings if + of.offering_code == "http://www.opengis.net/spec/owc-geojson/1.0/req/wms"] + assert len(wms_offering) > 0 + assert wms_offering[0].styles[ + 0].legend_url == "http://docs.geoserver.org/latest/en/user/_images/line_simpleline1.png" + + +def test_load_bulk(): + js1 = open(resource_file(os.path.join('owc_geojson_examples','from-meta-resource.json')), 'r').read() + js2 = open(resource_file(os.path.join('owc_geojson_examples','ingest1.owc.geojson')), 'r').read() + js3 = open(resource_file(os.path.join('owc_geojson_examples','newzealand-overview.json')), 'r').read() + js4 = open(resource_file(os.path.join('owc_geojson_examples','owc1.geojson')), 'r').read() + js5 = open(resource_file(os.path.join('owc_geojson_examples','owc2.geojson')), 'r').read() + js6 = open(resource_file(os.path.join('owc_geojson_examples','owc3.geojson')), 'r').read() + js7 = open(resource_file(os.path.join('owc_geojson_examples','sac-casestudies.json')), 'r').read() + + feeds = [js1, js2, js3,js4, js5, js6, js7 ] + + for f in feeds: + logger.debug(f) + dict_obj = decode_json(f) + assert dict_obj is not None + # logger.debug(dict_obj) + owc = OwcContext.from_dict(dict_obj) + assert owc is not None + # logger.debug(OwcContext.from_dict(dict_obj).to_json()) + jsdata = owc.to_json() + assert jsdata is not None + assert len(jsdata) > 10 + re_owc = OwcContext.from_json(jsdata) + assert re_owc is not None + through = OwcContext.from_json(f) + assert owc.to_dict() == through.to_dict() + + + diff -Nru owslib-0.16.0/tests/test_ows_interfaces.py owslib-0.18.0/tests/test_ows_interfaces.py --- owslib-0.16.0/tests/test_ows_interfaces.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_ows_interfaces.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,153 @@ +# This test checks that the OWSLib service interfaces are the same across all service type: +# Author: Dominic Lowe, 17th September 2009 +# Part of OWSLib package. +from tests.utils import service_ok + +import pytest + +from tests.utils import resource_file +import owslib +from owslib.csw import CatalogueServiceWeb +from owslib.wms import WebMapService +from owslib.wcs import WebCoverageService +from owslib.wfs import WebFeatureService +from owslib.util import OrderedDict + + +# TODO, we should run all these from local XML documents (as per the WMS and WFS services) +# CSW_SERVICE_URL = 'http://data.nodc.noaa.gov/geoportal/csw' +CSW_SERVICE_URL = 'http://demo.pycsw.org/cite/csw' +WCS_SERVICE_URL = 'http://thredds.ucar.edu/thredds/wcs/grib/NCEP/NAM/CONUS_80km/best' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(CSW_SERVICE_URL), + reason='service is unreachable') +def test_ows_interfaces_csw(): + service = CatalogueServiceWeb(CSW_SERVICE_URL) + # Check each service instance conforms to OWSLib interface + service.alias = 'CSW' + isinstance(service, owslib.csw.CatalogueServiceWeb) + # URL attribute + assert service.url == CSW_SERVICE_URL + # version attribute + assert service.version == '2.0.2' + # Identification object + assert hasattr(service, 'identification') + # Check all ServiceIdentification attributes + assert service.identification.type == 'CSW' + for attribute in ['type', 'version', 'title', 'abstract', 'keywords', 'accessconstraints', 'fees']: + assert hasattr(service.identification, attribute) + # Check all ServiceProvider attributes + for attribute in ['name', 'url', 'contact']: + assert hasattr(service.provider, attribute) + # Check all operations implement IOperationMetadata + for op in service.operations: + for attribute in ['name', 'formatOptions', 'methods']: + assert hasattr(op, attribute) + # Check all contents implement IContentMetadata as a dictionary + # CSW does not work in this way so use dummy + service.contents = {'dummy': '1'} + isinstance(service.contents, dict) + # Check any item (WCS coverage, WMS layer etc) from the contents of each service + # Check it conforms to IContentMetadata interface + # CSW does not conform to this + + +def test_ows_interfaces_wms(): + wmsxml = open(resource_file('wms_JPLCapabilities.xml'), 'rb').read() + service = WebMapService('url', version='1.1.1', xml=wmsxml) + # Check each service instance conforms to OWSLib interface + service.alias = 'WMS' + isinstance(service, owslib.map.wms111.WebMapService_1_1_1) + # URL attribute + assert service.url == 'url' + # version attribute + assert service.version == '1.1.1' + # Identification object + assert hasattr(service, 'identification') + # Check all ServiceIdentification attributes + assert service.identification.type == 'OGC:WMS' + for attribute in ['type', 'version', 'title', 'abstract', 'keywords', 'accessconstraints', 'fees']: + assert hasattr(service.identification, attribute) + # Check all ServiceProvider attributes + for attribute in ['name', 'url', 'contact']: + assert hasattr(service.provider, attribute) + # Check all operations implement IOperationMetadata + for op in service.operations: + for attribute in ['name', 'formatOptions', 'methods']: + assert hasattr(op, attribute) + # Check all contents implement IContentMetadata as a dictionary + isinstance(service.contents, OrderedDict) + # Check any item (WCS coverage, WMS layer etc) from the contents of each service + # Check it conforms to IContentMetadata interface + # get random item from contents dictionary -has to be a nicer way to do this! + content = service.contents[list(service.contents.keys())[0]] + for attribute in ['id', 'title', 'boundingBox', 'boundingBoxWGS84', 'crsOptions', 'styles', 'timepositions']: + assert hasattr(content, attribute) + + +@pytest.mark.online +def test_ows_interfaces_wcs(): + service = WebCoverageService(WCS_SERVICE_URL, version='1.0.0') + # Check each service instance conforms to OWSLib interface + service.alias = 'WCS' + isinstance(service, owslib.coverage.wcs100.WebCoverageService_1_0_0) + # URL attribute + assert service.url == WCS_SERVICE_URL + # version attribute + assert service.version == '1.0.0' + # Identification object + assert hasattr(service, 'identification') + # Check all ServiceIdentification attributes + assert service.identification.type == 'OGC:WCS' + for attribute in ['type', 'version', 'title', 'abstract', 'keywords', 'fees']: + assert hasattr(service.identification, attribute) + # Check all ServiceProvider attributes + for attribute in ['name', 'url', 'contact']: + assert hasattr(service.provider, attribute) + # Check all operations implement IOperationMetadata + for op in service.operations: + for attribute in ['name', 'methods']: + assert hasattr(op, attribute) + # Check all contents implement IContentMetadata as a dictionary + isinstance(service.contents, dict) + # Check any item (WCS coverage, WMS layer etc) from the contents of each service + # Check it conforms to IContentMetadata interface + # get random item from contents dictionary -has to be a nicer way to do this! + content = service.contents[list(service.contents.keys())[0]] + for attribute in ['id', 'title', 'boundingBox', 'boundingBoxWGS84', 'crsOptions', 'styles', 'timepositions']: + assert hasattr(content, attribute) + + +def test_ows_interfaces_wfs(): + wfsxml = open(resource_file('mapserver-wfs-cap.xml'), 'rb').read() + service = WebFeatureService('url', version='1.0', xml=wfsxml) + # Check each service instance conforms to OWSLib interface + service.alias = 'CSW' + isinstance(service, owslib.feature.wfs100.WebFeatureService_1_0_0) + # URL attribute + assert service.url == 'url' + # version attribute + assert service.version == '1.0' + # Identification object + assert hasattr(service, 'identification') + # Check all ServiceIdentification attributes + assert service.identification.type == 'MapServer WFS' + for attribute in ['type', 'version', 'title', 'abstract', 'keywords', 'accessconstraints', 'fees']: + assert hasattr(service.identification, attribute) + # Check all ServiceProvider attributes + for attribute in ['name', 'url']: + assert hasattr(service.provider, attribute) + # Check all operations implement IOperationMetadata + for op in service.operations: + for attribute in ['name', 'formatOptions', 'methods']: + assert hasattr(op, attribute) + # Check all contents implement IContentMetadata as a dictionary + isinstance(service.contents, dict) + # Check any item (WCS coverage, WMS layer etc) from the contents of each service + # Check it conforms to IContentMetadata interface + # get random item from contents dictionary -has to be a nicer way to do this! + content = service.contents[list(service.contents.keys())[0]] + for attribute in ['id', 'title', 'boundingBox', 'boundingBoxWGS84', 'crsOptions', 'styles', 'timepositions']: + assert hasattr(content, attribute) diff -Nru owslib-0.16.0/tests/test_ows.py owslib-0.18.0/tests/test_ows.py --- owslib-0.16.0/tests/test_ows.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_ows.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,41 @@ +from owslib.namespaces import Namespaces + +from owslib.ows import BoundingBox, DEFAULT_OWS_NAMESPACE +from owslib import crs +from owslib.etree import etree + +DEFAULT_WPS_NAMESPACE = Namespaces().get_namespace('wps') + + +def test_ows_bbox(): + bbox_elem = etree.fromstring(""" + + 0.0 -90.0 + 180.0 90.0 + """.format(DEFAULT_OWS_NAMESPACE)) + bbox = BoundingBox(bbox_elem) + assert bbox.crs == crs.Crs('EPSG:4326') + assert bbox.crs.axisorder == 'yx' + assert bbox.dimensions == 2 + assert bbox.minx == '-90.0' + assert bbox.miny == '0.0' + assert bbox.maxx == '90.0' + assert bbox.maxy == '180.0' + + +def test_ows_bbox_with_namespaces(): + """ XML bounding box description as received from a wps request """ + + bbox_elem = etree.fromstring(""" + + 0.0 -90.0 + 180.0 90.0 + """.format(DEFAULT_WPS_NAMESPACE, DEFAULT_OWS_NAMESPACE)) + bbox = BoundingBox(bbox_elem) + assert bbox.crs == crs.Crs('EPSG:4326') + assert bbox.crs.axisorder == 'yx' + assert bbox.dimensions == 2 + assert bbox.minx == '-90.0' + assert bbox.miny == '0.0' + assert bbox.maxx == '90.0' + assert bbox.maxy == '180.0' diff -Nru owslib-0.16.0/tests/test_remote_metadata.py owslib-0.18.0/tests/test_remote_metadata.py --- owslib-0.16.0/tests/test_remote_metadata.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_remote_metadata.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,1115 @@ +import pytest + +import owslib +from owslib.etree import etree +from owslib.wfs import WebFeatureService +from owslib.wms import WebMapService +from tests.utils import service_ok + + +WMS_SERVICE_URL = 'https://www.dov.vlaanderen.be/geoserver/gw_meetnetten/wms' +WFS_SERVICE_URL = 'https://www.dov.vlaanderen.be/geoserver/gw_meetnetten/wfs' + + +@pytest.fixture +def mp_wfs_100_nometadata(monkeypatch): + """Monkeypatch the call to the remote GetCapabilities request of WFS + version 1.0.0, not containing MetadataURLs. + + Parameters + ---------- + monkeypatch : pytest.fixture + PyTest monkeypatch fixture. + + """ + def read(*args, **kwargs): + with open('tests/resources/wfs_dov_getcapabilities_100_nometadata.xml', + 'r') as f: + data = f.read() + if type(data) is not bytes: + data = data.encode('utf-8') + data = etree.fromstring(data) + return data + + monkeypatch.setattr( + owslib.feature.common.WFSCapabilitiesReader, 'read', read) + + +@pytest.fixture +def mp_wfs_110(monkeypatch): + """Monkeypatch the call to the remote GetCapabilities request of WFS + version 1.1.0. + + Parameters + ---------- + monkeypatch : pytest.fixture + PyTest monkeypatch fixture. + + """ + def read(*args, **kwargs): + with open('tests/resources/wfs_dov_getcapabilities_110.xml', 'r') as f: + data = f.read() + if type(data) is not bytes: + data = data.encode('utf-8') + data = etree.fromstring(data) + return data + + monkeypatch.setattr( + owslib.feature.common.WFSCapabilitiesReader, 'read', read) + +@pytest.fixture +def mp_wfs_110_nometadata(monkeypatch): + """Monkeypatch the call to the remote GetCapabilities request of WFS + version 1.1.0, not containing MetadataURLs. + + Parameters + ---------- + monkeypatch : pytest.fixture + PyTest monkeypatch fixture. + + """ + def read(*args, **kwargs): + with open('tests/resources/wfs_dov_getcapabilities_110_nometadata.xml', + 'r') as f: + data = f.read() + if type(data) is not bytes: + data = data.encode('utf-8') + data = etree.fromstring(data) + return data + + monkeypatch.setattr( + owslib.feature.common.WFSCapabilitiesReader, 'read', read) + + +@pytest.fixture +def mp_wfs_200(monkeypatch): + """Monkeypatch the call to the remote GetCapabilities request of WFS + version 2.0.0. + + Parameters + ---------- + monkeypatch : pytest.fixture + PyTest monkeypatch fixture. + + """ + def read(*args, **kwargs): + with open('tests/resources/wfs_dov_getcapabilities_200.xml', + 'r') as f: + data = f.read() + if type(data) is not bytes: + data = data.encode('utf-8') + data = etree.fromstring(data) + return data + + monkeypatch.setattr( + owslib.feature.common.WFSCapabilitiesReader, 'read', read) + + +@pytest.fixture +def mp_wfs_200_nometadata(monkeypatch): + """Monkeypatch the call to the remote GetCapabilities request of WFS + version 2.0.0, not containing MetadataURLs. + + Parameters + ---------- + monkeypatch : pytest.fixture + PyTest monkeypatch fixture. + + """ + def read(*args, **kwargs): + with open('tests/resources/wfs_dov_getcapabilities_200_nometadata.xml', + 'r') as f: + data = f.read() + if type(data) is not bytes: + data = data.encode('utf-8') + data = etree.fromstring(data) + return data + + monkeypatch.setattr( + owslib.feature.common.WFSCapabilitiesReader, 'read', read) + + +@pytest.fixture +def mp_wms_111_nometadata(monkeypatch): + """Monkeypatch the call to the remote GetCapabilities request of WMS + version 1.1.1, not containing MetadataURLs. + + Parameters + ---------- + monkeypatch : pytest.fixture + PyTest monkeypatch fixture. + + """ + def read(*args, **kwargs): + with open('tests/resources/wms_dov_getcapabilities_111_nometadata.xml', + 'r') as f: + data = f.read() + if type(data) is not bytes: + data = data.encode('utf-8') + data = etree.fromstring(data) + return data + + monkeypatch.setattr( + owslib.map.common.WMSCapabilitiesReader, 'read', read) + + +@pytest.fixture +def mp_wms_130(monkeypatch): + """Monkeypatch the call to the remote GetCapabilities request of WMS + version 1.3.0. + + Parameters + ---------- + monkeypatch : pytest.fixture + PyTest monkeypatch fixture. + + """ + def read(*args, **kwargs): + with open('tests/resources/wms_dov_getcapabilities_130.xml', 'r') as f: + data = f.read() + if type(data) is not bytes: + data = data.encode('utf-8') + data = etree.fromstring(data) + return data + + monkeypatch.setattr( + owslib.map.common.WMSCapabilitiesReader, 'read', read) + + +@pytest.fixture +def mp_wms_130_nometadata(monkeypatch): + """Monkeypatch the call to the remote GetCapabilities request of WMS + version 1.3.0, not containing MetadataURLs. + + Parameters + ---------- + monkeypatch : pytest.fixture + PyTest monkeypatch fixture. + + """ + def read(*args, **kwargs): + with open('tests/resources/wms_dov_getcapabilities_130_nometadata' + '.xml', 'r') as f: + data = f.read() + if type(data) is not bytes: + data = data.encode('utf-8') + data = etree.fromstring(data) + return data + + monkeypatch.setattr( + owslib.map.common.WMSCapabilitiesReader, 'read', read) + + +@pytest.fixture +def mp_remote_md(monkeypatch): + def openURL(*args, **kwargs): + with open('tests/resources/csw_dov_getrecordbyid.xml', 'r') as f: + data = f.read() + if type(data) is not bytes: + data = data.encode('utf-8') + data = etree.fromstring(data) + return data + + monkeypatch.setattr(owslib.util, 'openURL', openURL) + + +class TestOffline(object): + def test_wfs_100_noremotemd_parse_all(self, mp_wfs_100_nometadata): + """Test the remote metadata parsing for WFS 1.0.0. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wfs_100_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='1.0.0', + parse_remote_metadata=True) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wfs_100_noremotemd_parse_single(self, mp_wfs_100_nometadata): + """Test the remote metadata parsing for WFS 1.0.0. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wfs_100_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='1.0.0', + parse_remote_metadata=False) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wfs_100_noremotemd_parse_none(self, mp_wfs_100_nometadata): + """Test the remote metadata parsing for WFS 1.0.0. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + Parameters + ---------- + mp_wfs_100_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='1.0.0', + parse_remote_metadata=False) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wfs_110_noremotemd_parse_all(self, mp_wfs_110_nometadata): + """Test the remote metadata parsing for WFS 1.1.0. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wfs_110_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='1.1.0', + parse_remote_metadata=True) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wfs_110_noremotemd_parse_single(self, mp_wfs_110_nometadata): + """Test the remote metadata parsing for WFS 1.1.0. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wfs_110_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='1.1.0', + parse_remote_metadata=False) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wfs_110_noremotemd_parse_none(self, mp_wfs_110_nometadata): + """Test the remote metadata parsing for WFS 1.1.0. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + Parameters + ---------- + mp_wfs_110_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='1.1.0', + parse_remote_metadata=False) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wfs_110_remotemd_parse_all(self, mp_wfs_110, mp_remote_md): + """Test the remote metadata parsing for WFS 1.1.0. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns remote metadata + if MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wfs_110 : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + mp_remote_md : pytest.fixture + Monkeypatch the call to the remote metadata. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='1.1.0', + parse_remote_metadata=True) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 1 + + for m in mdrecords: + assert type(m) is owslib.iso.MD_Metadata + + def test_wfs_110_remotemd_parse_single(self, mp_wfs_110, mp_remote_md): + """Test the remote metadata parsing for WFS 1.1.0. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns remote metadata + if MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wfs_110 : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + mp_remote_md : pytest.fixture + Monkeypatch the call to the remote metadata. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='1.1.0', + parse_remote_metadata=False) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 1 + + for m in mdrecords: + assert type(m) is owslib.iso.MD_Metadata + + def test_wfs_110_remotemd_parse_none(self, mp_wfs_110): + """Test the remote metadata parsing for WFS 1.1.0. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + Parameters + ---------- + mp_wfs_110 : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='1.1.0', + parse_remote_metadata=False) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wfs_200_noremotemd_parse_all(self, mp_wfs_200_nometadata): + """Test the remote metadata parsing for WFS 2.0.0. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wfs_200_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='2.0.0', + parse_remote_metadata=True) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wfs_200_noremotemd_parse_single(self, mp_wfs_200_nometadata): + """Test the remote metadata parsing for WFS 2.0.0. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wfs_200_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='2.0.0', + parse_remote_metadata=False) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wfs_200_noremotemd_parse_none(self, mp_wfs_200_nometadata): + """Test the remote metadata parsing for WFS 2.0.0. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + Parameters + ---------- + mp_wfs_200_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='2.0.0', + parse_remote_metadata=False) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wfs_200_remotemd_parse_all(self, mp_wfs_200, mp_remote_md): + """Test the remote metadata parsing for WFS 2.0.0. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns remote metadata + if MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wfs_200 : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + mp_remote_md : pytest.fixture + Monkeypatch the call to the remote metadata. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='2.0.0', + parse_remote_metadata=True) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 1 + + for m in mdrecords: + assert type(m) is owslib.iso.MD_Metadata + + def test_wfs_200_remotemd_parse_single(self, mp_wfs_200, mp_remote_md): + """Test the remote metadata parsing for WFS 2.0.0. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns remote metadata + if MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wfs_200 : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + mp_remote_md : pytest.fixture + Monkeypatch the call to the remote metadata. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='2.0.0', + parse_remote_metadata=False) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 1 + + for m in mdrecords: + assert type(m) is owslib.iso.MD_Metadata + + def test_wfs_200_remotemd_parse_none(self, mp_wfs_200): + """Test the remote metadata parsing for WFS 2.0.0. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + Parameters + ---------- + mp_wfs_200 : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wfs = WebFeatureService(url='http://localhost/not_applicable', + version='2.0.0', + parse_remote_metadata=False) + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wms_111_noremotemd_parse_all(self, mp_wms_111_nometadata): + """Test the remote metadata parsing for WMS 1.1.1. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wms_111_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wms = WebMapService(url='http://localhost/not_applicable', + version='1.1.1', + parse_remote_metadata=True) + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wms_111_noremotemd_parse_single(self, mp_wms_111_nometadata): + """Test the remote metadata parsing for WMS 1.1.1. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wms_111_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wms = WebMapService(url='http://localhost/not_applicable', + version='1.1.1', + parse_remote_metadata=False) + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wms_111_noremotemd_parse_none(self, mp_wms_111_nometadata): + """Test the remote metadata parsing for WMS 1.1.1. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + Parameters + ---------- + mp_wms_111_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wms = WebMapService(url='http://localhost/not_applicable', + version='1.1.1', + parse_remote_metadata=False) + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wms_130_remotemd_parse_all(self, mp_wms_130): + """Test the remote metadata parsing for WMS 1.3.0. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns remote metadata + if MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wms_130 : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wms = WebMapService(url='http://localhost/not_applicable', + version='1.3.0', + parse_remote_metadata=True) + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 1 + + for m in mdrecords: + assert type(m) is owslib.iso.MD_Metadata + + def test_wms_130_remotemd_parse_single(self, mp_wms_130): + """Test the remote metadata parsing for WMS 1.3.0. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns remote metadata + if MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wms_130 : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wms = WebMapService(url='http://localhost/not_applicable', + version='1.3.0', + parse_remote_metadata=False) + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 1 + + for m in mdrecords: + assert type(m) is owslib.iso.MD_Metadata + + def test_wms_130_remotemd_parse_none(self, mp_wms_130): + """Test the remote metadata parsing for WMS 1.3.0. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + Parameters + ---------- + mp_wms_130 : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wms = WebMapService(url='http://localhost/not_applicable', + version='1.3.0', + parse_remote_metadata=False) + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wms_130_noremotemd_parse_all(self, mp_wms_130_nometadata): + """Test the remote metadata parsing for WMS 1.3.0. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wms_130_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wms = WebMapService(url='http://localhost/not_applicable', + version='1.3.0', + parse_remote_metadata=True) + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wms_130_noremotemd_parse_single(self, mp_wms_130_nometadata): + """Test the remote metadata parsing for WMS 1.3.0. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + Parameters + ---------- + mp_wms_130_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wms = WebMapService(url='http://localhost/not_applicable', + version='1.3.0', + parse_remote_metadata=False) + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + def test_wms_130_noremotemd_parse_none(self, mp_wms_130_nometadata): + """Test the remote metadata parsing for WMS 1.3.0. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + Parameters + ---------- + mp_wms_130_nometadata : pytest.fixture + Monkeypatch the call to the remote GetCapabilities request. + + """ + wms = WebMapService(url='http://localhost/not_applicable', + version='1.3.0', + parse_remote_metadata=False) + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + +class TestOnline(object): + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WFS_SERVICE_URL), + reason="WFS service is unreachable") + @pytest.mark.parametrize("wfs_version", ["1.1.0", "2.0.0"]) + def test_wfs_remotemd_parse_single(self, wfs_version): + """Test the remote metadata parsing for WFS. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns remote metadata. + + """ + wfs = WebFeatureService(url=WFS_SERVICE_URL, + version=wfs_version, + parse_remote_metadata=False) + + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) > 0 + + for m in mdrecords: + assert type(m) is owslib.iso.MD_Metadata + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WFS_SERVICE_URL), + reason="WFS service is unreachable") + @pytest.mark.parametrize("wfs_version", ["1.1.0", "2.0.0"]) + def test_wfs_remotemd_parse_all(self, wfs_version): + """Test the remote metadata parsing for WFS. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns remote metadata. + + """ + wfs = WebFeatureService(url=WFS_SERVICE_URL, + version=wfs_version, + parse_remote_metadata=True) + + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) > 0 + + for m in mdrecords: + assert type(m) is owslib.iso.MD_Metadata + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WFS_SERVICE_URL), + reason="WFS service is unreachable") + @pytest.mark.parametrize("wfs_version", ["1.1.0", "2.0.0"]) + def test_wfs_remotemd_parse_none(self, wfs_version): + """Test the remote metadata parsing for WFS. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + """ + wfs = WebFeatureService(url=WFS_SERVICE_URL, + version=wfs_version, + parse_remote_metadata=False) + + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WFS_SERVICE_URL), + reason="WFS service is unreachable") + @pytest.mark.parametrize("wfs_version", ["1.0.0"]) + def test_wfs_noremotemd_parse_single(self, wfs_version): + """Test the remote metadata parsing for WFS. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + """ + wfs = WebFeatureService(url=WFS_SERVICE_URL, + version=wfs_version, + parse_remote_metadata=False) + + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WFS_SERVICE_URL), + reason="WFS service is unreachable") + @pytest.mark.parametrize("wfs_version", ["1.0.0"]) + def test_wfs_noremotemd_parse_all(self, wfs_version): + """Test the remote metadata parsing for WFS. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns no remote + metadata if no MetadataURLs are available in the GetCapabilities. + + """ + wfs = WebFeatureService(url=WFS_SERVICE_URL, + version=wfs_version, + parse_remote_metadata=True) + + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WFS_SERVICE_URL), + reason="WFS service is unreachable") + @pytest.mark.parametrize("wfs_version", ["1.0.0"]) + def test_wfs_noremotemd_parse_none(self, wfs_version): + """Test the remote metadata parsing for WFS. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + """ + wfs = WebFeatureService(url=WFS_SERVICE_URL, + version=wfs_version, + parse_remote_metadata=False) + + assert 'gw_meetnetten:meetnetten' in wfs.contents + layer = wfs.contents['gw_meetnetten:meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WMS_SERVICE_URL), + reason="WMS service is unreachable") + @pytest.mark.parametrize("wms_version", ["1.3.0"]) + def test_wms_remotemd_parse_single(self, wms_version): + """Test the remote metadata parsing for WMS. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns remote metadata. + + """ + wms = WebMapService(url=WMS_SERVICE_URL, + version=wms_version, + parse_remote_metadata=False) + + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) > 0 + + for m in mdrecords: + assert type(m) is owslib.iso.MD_Metadata + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WMS_SERVICE_URL), + reason="WMS service is unreachable") + @pytest.mark.parametrize("wms_version", ["1.3.0"]) + def test_wms_remotemd_parse_all(self, wms_version): + """Test the remote metadata parsing for WMS. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns remote metadata. + + """ + wms = WebMapService(url=WMS_SERVICE_URL, + version=wms_version, + parse_remote_metadata=True) + + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) > 0 + + for m in mdrecords: + assert type(m) is owslib.iso.MD_Metadata + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WMS_SERVICE_URL), + reason="WMS service is unreachable") + @pytest.mark.parametrize("wms_version", ["1.3.0"]) + def test_wms_remotemd_parse_none(self, wms_version): + """Test the remote metadata parsing for WMS. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + """ + wms = WebMapService(url=WMS_SERVICE_URL, + version=wms_version, + parse_remote_metadata=False) + + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WMS_SERVICE_URL), + reason="WMS service is unreachable") + @pytest.mark.parametrize("wms_version", ["1.1.1"]) + def test_wms_noremotemd_parse_single(self, wms_version): + """Test the remote metadata parsing for WMS. + + Tests parsing the remote metadata for a single layer. + + Test whether the method is available and returns no remote metadata + if no MetadataURLs are available in the GetCapabilities. + + """ + wms = WebMapService(url=WMS_SERVICE_URL, + version=wms_version, + parse_remote_metadata=False) + + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + layer.parse_remote_metadata() + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WMS_SERVICE_URL), + reason="WMS service is unreachable") + @pytest.mark.parametrize("wms_version", ["1.1.1"]) + def test_wms_noremotemd_parse_all(self, wms_version): + """Test the remote metadata parsing for WMS. + + Tests parsing the remote metadata for all layers. + + Test whether the method is available and returns no remote + metadata if no MetadataURLs are available in the GetCapabilities. + + """ + wms = WebMapService(url=WMS_SERVICE_URL, + version=wms_version, + parse_remote_metadata=True) + + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 + + @pytest.mark.online + @pytest.mark.skipif(not service_ok(WMS_SERVICE_URL), + reason="WMS service is unreachable") + @pytest.mark.parametrize("wms_version", ["1.1.1"]) + def test_wms_noremotemd_parse_none(self, wms_version): + """Test the remote metadata parsing for WMS. + + Tests the case when no remote metadata is parsed. + + Test whether no remote metadata is returned. + + """ + wms = WebMapService(url=WMS_SERVICE_URL, + version=wms_version, + parse_remote_metadata=False) + + assert 'meetnetten' in wms.contents + layer = wms.contents['meetnetten'] + + mdrecords = layer.get_metadata() + assert type(mdrecords) is list + assert len(mdrecords) == 0 diff -Nru owslib-0.16.0/tests/test_sos_20_bom_gov_au.py owslib-0.18.0/tests/test_sos_20_bom_gov_au.py --- owslib-0.16.0/tests/test_sos_20_bom_gov_au.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_sos_20_bom_gov_au.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,43 @@ +# SOS version 2.0 tests on http://www.bom.gov.au/waterdata/services + +from owslib.sos import SensorObservationService + +from tests.utils import service_ok +import pytest + +SERVICE_URL = 'http://www.bom.gov.au/waterdata/services' + + +@pytest.mark.online +@pytest.mark.skip('service responds with an exception (#496)') +@pytest.mark.skipif(not service_ok(SERVICE_URL + "?service=SOS&request=GetCapabilities"), + reason="SOS service is unreachable") +def test_sos_20_bom_gov_au(): + # Setup + service = SensorObservationService(SERVICE_URL, version='2.0.0') + id = service.identification + # Check basic service metadata + assert id.service == 'SOS' + assert id.title == 'KISTERS KiWIS SOS2' + assert id.keywords == [] + assert service.provider.name == 'Provider Name' + assert service.provider.contact.name == 'Name' + assert service.provider.contact.position is None + assert len(service.operations) == 5 + assert service.get_operation_by_name('GetObservation').methods[0]['url'] == \ + 'http://bom.gov.au/waterdata/services?datasource=0' + 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 -Nru owslib-0.16.0/tests/test_sos.py owslib-0.18.0/tests/test_sos.py --- owslib-0.16.0/tests/test_sos.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_sos.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,17 @@ +# -*- coding: UTF-8 -*- +from owslib.sos import SensorObservationService + +from tests.utils import service_ok + +import pytest + +SERVICE_URL = 'http://sos.irceline.be/sos' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason="SOS service is unreachable") +def test_sos_caps(): + sos = SensorObservationService(SERVICE_URL) + assert str(sos.contents['81102 - PM10']) == "Offering id: 81102 - PM10, name: Particulate Matter < 10 µm" + assert repr(sos.contents['81102 - PM10']) == "" diff -Nru owslib-0.16.0/tests/test_util.py owslib-0.18.0/tests/test_util.py --- owslib-0.16.0/tests/test_util.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_util.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,55 @@ +# -*- coding: UTF-8 -*- +import pytest + +import codecs +from owslib.util import clean_ows_url, build_get_url, strip_bom, encode_string + + +def test_encode_string(): + assert encode_string('hello') == 'hello' + assert encode_string('Particulate Matter < 10 µm') == 'Particulate Matter < 10 µm' + assert encode_string(u'Particulate Matter < 10 µm') == 'Particulate Matter < 10 µm' + + +def test_strip_bom(): + assert strip_bom('Hamburg') == 'Hamburg' + assert strip_bom(codecs.BOM_UTF8 + 'Dublin'.encode('utf-8')) == \ + 'Dublin'.encode('utf-8') + assert strip_bom(codecs.BOM_UTF16 + 'Vancover'.encode('utf-16')) == \ + 'Vancover'.encode('utf-16') + + +def test_clean_ows_url(): + assert clean_ows_url('http//example.org/wms') == 'http//example.org/wms' + assert clean_ows_url('http//example.org/wms?service=WMS') == 'http//example.org/wms' + assert clean_ows_url('http//example.org/wms?SERVICE=WMS') == 'http//example.org/wms' + assert clean_ows_url('http//example.org/wms?SeRvIcE=WMS') == 'http//example.org/wms' + assert clean_ows_url('http//example.org/wms?SeRvIcE=WMS&version=1.3.0&request=GetCapabilities') == 'http//example.org/wms' # noqa + assert clean_ows_url('http//example.org/wms?foo=bar&SeRvIcE=WMS&version=1.3.0&request=GetCapabilities') == 'http//example.org/wms?foo=bar' # noqa + + +@pytest.mark.skip(reason="fails on python 3.4") +def test_util_py34(): + assert clean_ows_url('http://example.org/wms?map=/path/to/foo.map&SERVICE=WMS&version=1.3.0&request=GetCapabilities') == 'http://example.org/wms?map=%2Fpath%2Fto%2Ffoo.map' # noqa + assert clean_ows_url('http://example.org/wms?map=/path/to/foo.map&foo=bar&&SERVICE=WMS&version=1.3.0&request=GetCapabilities') == 'http://example.org/wms?map=%2Fpath%2Fto%2Ffoo.map&foo=bar' # noqa + + +def test_build_get_url(): + assert build_get_url("http://example.org/wps", {'service': 'WPS'}) == 'http://example.org/wps?service=WPS' + assert build_get_url("http://example.org/wms", {'SERVICE': 'wms'}) == 'http://example.org/wms?SERVICE=wms' + assert build_get_url("http://example.org/wps?service=WPS", {'request': 'GetCapabilities'}) == \ + 'http://example.org/wps?service=WPS&request=GetCapabilities' + assert build_get_url("http://example.org/wps?service=WPS", {'request': 'GetCapabilities'}) == \ + 'http://example.org/wps?service=WPS&request=GetCapabilities' + # Can not overwrite parameter + assert build_get_url("http://example.org/ows?SERVICE=WPS", {'SERVICE': 'WMS'}) == \ + 'http://example.org/ows?SERVICE=WPS' + # Parameter is case-senstive + assert build_get_url("http://example.org/ows?SERVICE=WPS", {'service': 'WMS'}) == \ + 'http://example.org/ows?SERVICE=WPS&service=WMS' + + +def test_build_get_url_overwrite(): + # Use overwrite flag + assert build_get_url("http://example.org/ows?SERVICE=WPS", {'SERVICE': 'WMS'}, overwrite=True) == \ + 'http://example.org/ows?SERVICE=WMS' diff -Nru owslib-0.16.0/tests/test_wcs_200.py owslib-0.18.0/tests/test_wcs_200.py --- owslib-0.16.0/tests/test_wcs_200.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wcs_200.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,63 @@ +from tests.utils import scratch_file +from tests.utils import service_ok +from owslib.wcs import WebCoverageService + + +import pytest +import datetime + +SERVICE_URL = 'http://ows.rasdaman.org/rasdaman/ows' + + +@pytest.mark.online +@pytest.mark.skip(reason="WCS service is broken (#494)") +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason="WCS service is unreachable") +def test_wcs_200(): + """ + Web Coverage Service + WCS Version 2.0.x + + rewritten doctest/wcs_200.txt + """ + wcs = WebCoverageService(SERVICE_URL, version="2.0.1") + assert wcs.version == '2.0.1' + assert wcs.url == SERVICE_URL + assert wcs.identification.title == 'rasdaman' + assert wcs.identification.service == 'OGC WCS' + assert wcs.provider.name == 'Jacobs University Bremen' + assert 'AvgLandTemp' in wcs.contents.keys() + assert len(wcs.contents.keys()) >= 20 + cvg = wcs.contents['AvgLandTemp'] + assert cvg.boundingboxes[0]['bbox'] == (-90, -180, + 90, 180) + assert cvg.timelimits == [datetime.datetime(2000, 2, 1, 0, 0), datetime.datetime(2015, 6, 1, 0, 0)] + assert cvg.timepositions[0:5] == [datetime.datetime(2000, 2, 1, 0, 0), datetime.datetime(2000, 3, 1, 0, 0), + datetime.datetime(2000, 4, 1, 0, 0), datetime.datetime(2000, 5, 1, 0, 0), + datetime.datetime(2000, 6, 1, 0, 0)] + assert cvg.supportedFormats == ['application/gml+xml', 'image/jpeg', 'image/png', 'image/tiff', 'image/bmp', + 'image/jp2', 'application/netcdf', 'text/csv', 'application/json', + 'application/dem', 'application/x-ogc-dted', 'application/x-ogc-ehdr', + 'application/x-ogc-elas', 'application/x-ogc-envi', 'application/x-ogc-ers', + 'application/x-ogc-fit', 'application/x-ogc-fits', 'image/gif', + 'application/x-netcdf-gmt', 'application/x-ogc-gs7bg', 'application/x-ogc-gsag', + 'application/x-ogc-gsbg', 'application/x-ogc-gta', 'application/x-ogc-hf2', + 'application/x-erdas-hfa', 'application/x-ogc-ida', 'application/x-ogc-ingr', + 'application/x-ogc-isis2', 'application/x-erdas-lan', 'application/x-ogc-mff2', + 'application/x-ogc-nitf', 'application/x-ogc-paux', 'application/x-ogc-pcidsk', + 'application/x-ogc-pcraster', 'application/x-ogc-pdf', 'application/x-ogc-pnm', + 'text/x-r', 'application/x-ogc-rmf', 'image/x-sgi', 'application/x-ogc-vrt', + 'image/xpm', 'application/x-ogc-zmap'] + assert cvg.grid.axislabels == ['Lat', 'Long', 'ansi'] + assert cvg.grid.dimension == 3 + assert cvg.grid.lowlimits == ['0', '0', '0'] + assert cvg.grid.highlimits == ['1799', '3599', '184'] + covID = 'AvgLandTemp' + time_subset = ("ansi", "2000-02-01T00:00:00Z") + lat_subset = ('Lat', 40, 50) + long_subset = ('Long', -10, 0) + formatType = 'application/netcdf' + output = wcs.getCoverage(identifier=[covID], format=formatType, subsets=[long_subset, lat_subset, time_subset]) + f = open(scratch_file('test_wcs_200.nc'), 'wb') + bytes_written = f.write(output.read()) + f.close() diff -Nru owslib-0.16.0/tests/test_wcs_idee.py owslib-0.18.0/tests/test_wcs_idee.py --- owslib-0.16.0/tests/test_wcs_idee.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wcs_idee.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,58 @@ +from tests.utils import cast_tuple_int_list, scratch_file +from tests.utils import service_ok +from owslib.wcs import WebCoverageService + +import pytest + +SERVICE_URL = 'http://www.idee.es/wcs/IDEE-WCS-UTM30N/wcsServlet' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason="WCS service is unreachable") +def test_wcs_idee(): + """ + COWS Web Coverage Service + WCS Version 1.0.0 + + rewritten doctest/wcs_idee.txt + """ + wcs = WebCoverageService(SERVICE_URL) + assert wcs.version == '1.0.0' + assert wcs.url == SERVICE_URL + assert wcs.identification.title == 'WCS UTM30N - MDT Peninsula y Baleares' + assert wcs.identification.service == 'IDEE-WCS-UTM30N' + assert wcs.provider.name == u'Instituto Geogr\xe1fico Nacional' + assert sorted(wcs.contents.keys()) == [ + 'MDT1000_peninsula_baleares', + 'MDT1000_peninsula_baleares_aspecto', + 'MDT1000_peninsula_baleares_pendientes', + 'MDT25_peninsula_ZIP', + 'MDT25_peninsula_aspecto', + 'MDT25_peninsula_pendientes', + 'MDT500_peninsula_baleares', + 'MDT500_peninsula_baleares_aspecto', + 'MDT500_peninsula_baleares_pendientes', + 'MDT_peninsula_baleares', + 'MDT_peninsula_baleares_aspecto', + 'MDT_peninsula_baleares_pendientes'] + cvg = wcs['MDT25_peninsula_pendientes'] + assert cvg.title == 'MDT25 Pendientes Peninsula' + assert cast_tuple_int_list(cvg.boundingBoxWGS84) == [-8, 35, 3, 43] + assert cvg.timelimits == [] + assert sorted(cvg.supportedFormats) == ['AsciiGrid', 'FloatGrid_Zip', 'GeoTIFF'] + assert sorted(map(lambda x: x.getcode(), cvg.supportedCRS)) == [ + 'EPSG:23028', + 'EPSG:23029', + 'EPSG:23030', + 'EPSG:23030', + 'EPSG:23031', + 'EPSG:4230', + 'EPSG:4326'] + output = wcs.getCoverage( + identifier='MDT25_peninsula_pendientes', + bbox=(600000, 4200000, 601000, 4201000), + crs='EPSG:23030', format='AsciiGrid', resX=25, resY=25) + f = open(scratch_file('test_idee.grd'), 'wb') + bytes_written = f.write(output.read()) + f.close() diff -Nru owslib-0.16.0/tests/test_wfs3_ldproxy.py owslib-0.18.0/tests/test_wfs3_ldproxy.py --- owslib-0.16.0/tests/test_wfs3_ldproxy.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wfs3_ldproxy.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,25 @@ +from tests.utils import service_ok + +import pytest + +from owslib.wfs import WebFeatureService + +SERVICE_URL = 'https://www.ldproxy.nrw.de/rest/services/kataster/?f=json' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason='service is unreachable') +def test_wfs3_ldproxy(): + w = WebFeatureService(SERVICE_URL, version='3.0') + + assert w.url == 'https://www.ldproxy.nrw.de/rest/services/kataster/' + assert w.version == '3.0' + assert w.url_query_string == 'f=json' + + conformance = w.conformance() + assert len(conformance['conformsTo']) == 5 + + api = w.api() + assert api['components']['parameters'] is not None + assert api['paths'] is not None diff -Nru owslib-0.16.0/tests/test_wfs3_pygeoapi.py owslib-0.18.0/tests/test_wfs3_pygeoapi.py --- owslib-0.16.0/tests/test_wfs3_pygeoapi.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wfs3_pygeoapi.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,40 @@ +from tests.utils import service_ok + +import pytest + +from owslib.wfs import WebFeatureService + +SERVICE_URL = 'https://demo.pygeoapi.io/master' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason='service is unreachable') +def test_wfs3_pygeoapi(): + w = WebFeatureService(SERVICE_URL, version='3.0') + + assert w.url == 'https://demo.pygeoapi.io/master/' + assert w.version == '3.0' + assert w.url_query_string is None + + api = w.api() + assert api['components']['parameters'] is not None + paths = api['paths'] + assert paths is not None + assert paths['/collections/lakes'] is not None + + conformance = w.conformance() + assert len(conformance['conformsTo']) == 4 + + collections = w.collections() + assert len(collections) > 0 + + lakes = w.collection('lakes') + assert lakes['name'] == 'lakes' + assert lakes['title'] == 'Large Lakes' + assert lakes['description'] == 'lakes of the world, public domain' + + lakes_query = w.collection_items('lakes', limit=0) + assert lakes_query['numberMatched'] == 25 + assert lakes_query['numberReturned'] == 0 + assert len(lakes_query['features']) == 0 diff -Nru owslib-0.16.0/tests/test_wms_getmap.py owslib-0.18.0/tests/test_wms_getmap.py --- owslib-0.16.0/tests/test_wms_getmap.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wms_getmap.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,153 @@ +import pytest +from tests.utils import service_ok + +from owslib.wms import WebMapService +from owslib.util import ServiceException +from owslib.util import ResponseWrapper + + +SERVICE_URL = 'http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi' +NCWMS2_URL = "http://wms.stccmop.org:8080/ncWMS2/wms" + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason="WMS service is unreachable") +def test_wms_getmap_111(): + """MESONET GetMap 1.1.1""" + wms = WebMapService(SERVICE_URL, version='1.1.1') + assert wms.request == '{}?service=WMS&request=GetCapabilities&version=1.1.1'.format(SERVICE_URL) + rsp = wms.getmap( + layers=['nexrad_base_reflect'], + styles=['default'], + srs='EPSG:4326', + bbox=(-126, 24, -66, 50), + size=(250, 250), + format='image/jpeg', + transparent=True) + import owslib.util + assert type(rsp) is ResponseWrapper + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason="WMS service is unreachable") +def test_wms_getmap_111_service_exception(): + """GetMap 1.1.1 ServiceException for an invalid CRS""" + wms = WebMapService(SERVICE_URL, version='1.1.1') + try: + wms.getmap( + layers=['nexrad_base_reflect'], + styles=['default'], + srs='EPSG:4328', + bbox=(-126, 24, -66, 50), + size=(250, 250), + format='image/jpeg', + transparent=True) + except ServiceException as e: + assert "msWMSLoadGetMapParams(): WMS server error. Invalid SRS given : SRS must be valid for all requested layers." in str(e) # noqa + else: + assert False + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason="WMS service is unreachable") +def test_wms_getmap_130(): + """GetMap 1.3.0""" + wms = WebMapService(SERVICE_URL, version='1.3.0') + rsp = wms.getmap( + layers=['nexrad_base_reflect'], + styles=['default'], + srs='EPSG:4326', + bbox=(-126, 24, -66, 50), + size=(250, 250), + format='image/jpeg', + transparent=True) + assert type(rsp) is ResponseWrapper + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason="WMS service is unreachable") +def test_wms_getmap_130_service_exception(): + """GetMap 1.3.0 ServiceException for an invalid CRS""" + wms = WebMapService(SERVICE_URL, version='1.3.0') + try: + wms.getmap( + layers=['nexrad_base_reflect'], + styles=['default'], + srs='EPSG:4328', + bbox=(-126, 24, -66, 50), + size=(250, 250), + format='image/jpeg', + transparent=True) + except ServiceException as e: + assert "msWMSLoadGetMapParams(): WMS server error. Invalid CRS given : CRS must be valid for all requested layers." in str(e) # noqa + else: + assert False + + +SERVICE_URL_NATIONAL_MAP = 'http://services.nationalmap.gov/ArcGIS/services/geonames/MapServer/WMSServer' + + +@pytest.mark.online +@pytest.mark.skip(reason="this is a flaky test") +# @pytest.mark.skipif(not service_ok(SERVICE_URL_NATIONAL_MAP), +# reason="WMS service is unreachable") +def test_getmap_130_national_map(): + """National Map""" + # TODO: use flaky tests or fix it: https://pypi.python.org/pypi/pytest-ignore-flaky + url = SERVICE_URL_NATIONAL_MAP + wms = WebMapService(url, version='1.3.0') + rsp = wms.getmap( + layers=['3'], + styles=['default'], + srs='CRS:84', + bbox=(-176.646, 17.7016, -64.8017, 71.2854), + size=(500, 300), + format='image/png', + transparent=True) + assert type(rsp) is ResponseWrapper + assert "service=WMS" in wms.request + assert "version=1.3.0" in wms.request + assert "request=GetMap" in wms.request + assert "layers=3" in wms.request + assert "styles=default" in wms.request + assert "crs=CRS%3A84" in wms.request + assert "box=-176.646%2C17.7016%2C-64.8017%2C71.2854" in wms.request + assert "width=500" in wms.request + assert "height=300" in wms.request + assert "format=image%2Fpng" in wms.request + assert "transparent=TRUE" in wms.request + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(NCWMS2_URL), reason="WMS service is unreachable") +def test_ncwms2(): + """Test with an ncWMS2 server. + """ + # Note that this does not exercise the bug in https://github.com/geopython/OWSLib/issues/556 + wms = WebMapService(NCWMS2_URL, version='1.3.0') + rsp = wms.getmap( + layers=['f33_thredds/min_temp'], + styles=['default'], + srs='CRS:84', + bbox=(-124.17, 46.02, -123.29, 46.38), + size=(256, 256), + format='image/png', + transparent=True, + mode='32bit', + + ) + assert type(rsp) is ResponseWrapper + assert "service=WMS" in wms.request + assert "version=1.3.0" in wms.request + assert "request=GetMap" in wms.request + assert "layers=f33_thredds/min_temp" in wms.request + assert "styles=default" in wms.request + assert "crs=CRS%3A84" in wms.request + assert "width=256" in wms.request + assert "height=256" in wms.request + assert "format=image%2Fpng" in wms.request + assert "transparent=TRUE" in wms.request diff -Nru owslib-0.16.0/tests/test_wms_jpl_capabilities.py owslib-0.18.0/tests/test_wms_jpl_capabilities.py --- owslib-0.16.0/tests/test_wms_jpl_capabilities.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wms_jpl_capabilities.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,103 @@ +from tests.utils import service_ok +from tests.utils import resource_file + +from owslib.wms import WebMapService +import os +from collections import OrderedDict + +import pytest + + +def test_wms_capabilities(): + # Fake a request to a WMS Server using saved doc from + # http://wms.jpl.nasa.gov/wms.cgi. + xml = open(resource_file('wms_JPLCapabilities.xml'), 'rb').read() + wms = WebMapService('url', version='1.1.1', xml=xml) + + # Test capabilities + # ----------------- + + assert wms.identification.type == 'OGC:WMS' + assert wms.identification.version == '1.1.1' + assert wms.identification.title == 'JPL Global Imagery Service' + assert wms.identification.abstract == 'WMS Server maintained by JPL, worldwide satellite imagery.' + assert wms.identification.keywords == ['ImageryBaseMapsEarthCover', 'Imagery', + 'BaseMaps', 'EarthCover', 'JPL', 'Jet Propulsion Laboratory', + 'Landsat', 'WMS', 'SLD', 'Global'] + assert wms.identification.accessconstraints == 'Server is load limited' + assert wms.identification.fees == 'none' + assert wms.provider.name == 'JPL' + assert wms.provider.url == 'http://OnEarth.jpl.nasa.gov/index.html' + + # Check contact info (some of it is missing) + assert wms.provider.contact.name == 'Lucian Plesea' + assert wms.provider.contact.email == 'lucian.plesea@jpl.nasa.gov' + wms.provider.contact.address + wms.provider.contact.city + wms.provider.contact.country + wms.provider.contact.region + wms.provider.contact.postcode + assert wms.provider.contact.organization == 'JPL' + wms.provider.contact.position + + # Test available content layers + assert isinstance(wms.items(), list) is True + assert isinstance(wms.contents, OrderedDict) is True + + # NOTE: Not sure this dictionary interface is right...?? + assert sorted(wms.contents.keys()) == ['BMNG', 'daily_afternoon', 'daily_planet', + 'gdem', 'global_mosaic', 'global_mosaic_base', + 'huemapped_srtm', 'modis', 'srtm_mag', 'srtmplus', + 'us_colordem', 'us_elevation', 'us_landsat_wgs84', + 'us_ned', 'worldwind_dem'] + + assert sorted([wms[layer].id for layer in wms.contents]) == ['BMNG', 'daily_afternoon', 'daily_planet', + 'gdem', 'global_mosaic', 'global_mosaic_base', + 'huemapped_srtm', 'modis', 'srtm_mag', 'srtmplus', + 'us_colordem', 'us_elevation', 'us_landsat_wgs84', + 'us_ned', 'worldwind_dem'] + # Test single item accessor + assert wms['global_mosaic'].title == 'WMS Global Mosaic, pan sharpened' + assert wms['global_mosaic'].keywords == [] + + ['GlobalMosaic', 'Imagery', 'BaseMaps', 'EarthCover', 'JPL', 'Jet Propulsion Laboratory', + 'Landsat', 'WMS', 'SLD', 'Global'] + + wms['global_mosaic'].boundingBox + assert wms['global_mosaic'].boundingBoxWGS84 == (-180.0, -60.0, 180.0, 84.0) + assert sorted(wms['global_mosaic'].crsOptions) == ['AUTO:42003', 'EPSG:4326'] + + x = wms['global_mosaic'].styles + assert x == {'pseudo_bright': {'title': 'Pseudo-color image (Uses IR and Visual bands, 542 mapping), gamma 1.5'}, + 'pseudo': {'title': '(default) Pseudo-color image, pan sharpened (Uses IR and Visual bands, 542 mapping), gamma 1.5'}, # noqa + 'visual': {'title': 'Real-color image, pan sharpened (Uses the visual bands, 321 mapping), gamma 1.5'}, + 'pseudo_low': {'title': 'Pseudo-color image, pan sharpened (Uses IR and Visual bands, 542 mapping)'}, + 'visual_low': {'title': 'Real-color image, pan sharpened (Uses the visual bands, 321 mapping)'}, + 'visual_bright': {'title': 'Real-color image (Uses the visual bands, 321 mapping), gamma 1.5'}} + + # Expecting a KeyError for invalid names + with pytest.raises(KeyError, message="Expecting a KeyError for invalid names"): + wms['utterly bogus'].title + + # Test operations + assert sorted([op.name for op in wms.operations]) == ['GetCapabilities', 'GetMap', 'GetTileService'] + + x = wms.getOperationByName('GetMap').methods + assert x == [{'type': 'Get', 'url': 'http://wms.jpl.nasa.gov/wms.cgi?'}] + + assert wms.getOperationByName('GetMap').formatOptions == ['image/jpeg', 'image/png', 'image/geotiff', + 'image/tiff', 'application/vnd.google-earth.kml+xml'] + + # Test exceptions + assert wms.exceptions == ['application/vnd.ogc.se_xml'] + + +SERVICE_URL = 'http://giswebservices.massgis.state.ma.us/geoserver/wms' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason="WMS service is unreachable") +def test_wms_getmap(): + # Lastly, test the getcapabilities and getmap methods + wms = WebMapService(SERVICE_URL, version='1.1.1') diff -Nru owslib-0.16.0/tests/test_wmts.py owslib-0.18.0/tests/test_wmts.py --- owslib-0.16.0/tests/test_wmts.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wmts.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,51 @@ +from tests.utils import scratch_file +from tests.utils import service_ok + +import pytest + +SERVICE_URL = 'http://map1c.vis.earthdata.nasa.gov/wmts-geo/wmts.cgi' + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL), + reason="WMTS service is unreachable") +def test_wmts(): + # Find out what a WMTS has to offer. Service metadata: + from owslib.wmts import WebMapTileService + wmts = WebMapTileService(SERVICE_URL) + assert wmts.identification.type == 'OGC WMTS' + assert wmts.identification.version == '1.0.0' + assert wmts.identification.title == 'NASA Global Imagery Browse Services for EOSDIS' + bytearray(wmts.identification.abstract, 'utf-8') + bytearray(b'Near real time imagery from multiple NASA instruments') + assert wmts.identification.keywords == ['World', 'Global'] + # Service Provider: + assert wmts.provider.name == 'National Aeronautics and Space Administration' + assert wmts.provider.url == 'https://earthdata.nasa.gov/' + # Available Layers: + assert len(wmts.contents.keys()) > 0 + assert sorted(list(wmts.contents))[0] == 'AIRS_All_Sky_Outgoing_Longwave_Radiation_Daily_Day' + # Fetch a tile (using some defaults): + tile = wmts.gettile(layer='MODIS_Terra_CorrectedReflectance_TrueColor', + tilematrixset='EPSG4326_250m', tilematrix='0', + row=0, column=0, format="image/jpeg") + out = open(scratch_file('nasa_modis_terra_truecolour.jpg'), 'wb') + bytes_written = out.write(tile.read()) + out.close() + # Test styles for several layers + # TODO: fix dict order + # assert wmts.contents['MLS_SO2_147hPa_Night'].styles == {'default': {'isDefault': True, 'title': 'default'}} + assert wmts.contents['MLS_SO2_147hPa_Night'].styles['default']['isDefault'] is True + # assert wmts.contents['MLS_SO2_147hPa_Night'].styles == {'default': {'isDefault': True, 'title': 'default'}} + assert wmts.contents['MLS_SO2_147hPa_Night'].styles['default']['isDefault'] is True + + +SERVICE_URL_ARCGIS = 'http://data.geus.dk/arcgis/rest/services/OneGeologyGlobal/S071_G2500_OneGeology/MapServer/WMTS/1.0.0/WMTSCapabilities.xml' # noqa + + +@pytest.mark.online +@pytest.mark.skipif(not service_ok(SERVICE_URL_ARCGIS), + reason="WMTS service is unreachable") +def test_wmts_without_serviceprovider_tag(): + # Test a WMTS without a ServiceProvider tag in Capababilities XML + wmts = WebMapTileService(SERVICE_URL_ARCGIS) diff -Nru owslib-0.16.0/tests/test_wps_describeprocess_bbox.py owslib-0.18.0/tests/test_wps_describeprocess_bbox.py --- owslib-0.16.0/tests/test_wps_describeprocess_bbox.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_describeprocess_bbox.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,33 @@ +from tests.utils import resource_file + +from owslib.wps import WebProcessingService + + +def test_wps_describeprocess_bbox(): + # Initialize WPS client + wps = WebProcessingService('http://localhost:8094/wps', skip_caps=True) + # Execute fake invocation of DescribeProcess operation by parsing cached response from Emu service + xml = open(resource_file('wps_bbox_DescribeProcess.xml'), 'rb').read() + process = wps.describeprocess('bbox', xml=xml) + # Check process description + assert process.identifier == 'bbox' + assert process.title == 'Bounding Box' + # Check process inputs + # Example Input: + # identifier=bbox, title=Bounding Box, abstract=None, data type=BoundingBoxData + # Supported Value: EPSG:4326 + # Supported Value: EPSG:3035 + # Default Value: EPSG:4326 + # minOccurs=1, maxOccurs=1 + for input in process.dataInputs: + assert input.identifier == 'bbox' + assert input.dataType == 'BoundingBoxData' + # Example Output: + # identifier=bbox, title=Bounding Box, abstract=None, data type=BoundingBoxData + # Supported Value: EPSG:4326 + # Default Value: EPSG:4326 + # reference=None, mimeType=None + # Check process outputs + for output in process.processOutputs: + assert output.identifier == 'bbox' + assert output.dataType == 'BoundingBoxData' diff -Nru owslib-0.16.0/tests/test_wps_describeprocess_ceda.py owslib-0.18.0/tests/test_wps_describeprocess_ceda.py --- owslib-0.16.0/tests/test_wps_describeprocess_ceda.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_describeprocess_ceda.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,35 @@ +from tests.utils import resource_file +from owslib.wps import WebProcessingService + + +def test_wps_describeprocess_ceda(): + # Initialize WPS client + wps = WebProcessingService('http://ceda-wps2.badc.rl.ac.uk/wps', skip_caps=True) + # Execute fake invocation of DescribeProcess operation by parsing cached response from CEDA service + xml = open(resource_file('wps_CEDADescribeProcess.xml'), 'rb').read() + process = wps.describeprocess('Doubleit', xml=xml) + # Check process description + assert process.identifier == 'DoubleIt' + assert process.title == 'Doubles the input number and returns value' + assert process.abstract == 'This is test process used to demonstrate how the WPS and the WPS User Interface work. The process accepts an integer or floating point number and returns some XML containing the input number double.' # NOQA + # Check process properties + assert process.statusSupported is False + assert process.storeSupported is True + # Check process inputs + # Example Input: + # identifier=NumberToDouble, title=NumberToDouble, abstract=NumberToDouble, data type=LiteralData + # Any value allowed + # Default Value: None + # minOccurs=1, maxOccurs=-1 + for input in process.dataInputs: + assert input.identifier == 'NumberToDouble' + assert input.dataType == 'LiteralData' + # Example Output: + # identifier=OutputXML, title=OutputXML, abstract=OutputXML, data type=ComplexData + # Supported Value: mimeType=text/XML, encoding=UTF-8, schema=NONE + # Default Value: None + # reference=None, mimeType=None + # Check process outputs + for output in process.processOutputs: + assert output.identifier == 'OutputXML' + assert output.dataType == 'ComplexData' diff -Nru owslib-0.16.0/tests/test_wps_describeprocess_emu_all.py owslib-0.18.0/tests/test_wps_describeprocess_emu_all.py --- owslib-0.16.0/tests/test_wps_describeprocess_emu_all.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_describeprocess_emu_all.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,13 @@ +from tests.utils import resource_file +from owslib.wps import WebProcessingService, Process + + +def test_wps_describeprocess_emu_all(): + # Initialize WPS client + wps = WebProcessingService('http://localhost:8094/wps', skip_caps=True) + # Execute fake invocation of DescribeProcess operation by parsing cached response from + xml = open(resource_file('wps_EmuDescribeProcess_all.xml'), 'rb').read() + process = wps.describeprocess('nap', xml=xml) + processes = wps.describeprocess('all', xml=xml) + assert isinstance(process, Process) + assert isinstance(processes, list) diff -Nru owslib-0.16.0/tests/test_wps_describeprocess_usgs.py owslib-0.18.0/tests/test_wps_describeprocess_usgs.py --- owslib-0.16.0/tests/test_wps_describeprocess_usgs.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_describeprocess_usgs.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,107 @@ +from tests.utils import resource_file +from owslib.wps import WebProcessingService + + +def test_wps_describeprocess_usgs(): + # Initialize WPS client + wps = WebProcessingService('http://cida.usgs.gov/gdp/process/WebProcessingService', skip_caps=True) + # Execute fake invocation of DescribeProcess operation by parsing cached response from + xml = open(resource_file('wps_USGSDescribeProcess.xml'), 'rb').read() + process = wps.describeprocess('gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm', xml=xml) + # Check process description + assert process.identifier == 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' + assert process.title == 'Feature Weighted Grid Statistics' + assert process.abstract == 'This algorithm generates area weighted statistics of a gridded dataset for a set of vector polygon features. Using the bounding-box that encloses the feature data and the time range, if provided, a subset of the gridded dataset is requested from the remote gridded data server. Polygon representations are generated for cells in the retrieved grid. The polygon grid-cell representations are then projected to the feature data coordinate reference system. The grid-cells are used to calculate per grid-cell feature coverage fractions. Area-weighted statistics are then calculated for each feature using the grid values and fractions as weights. If the gridded dataset has a time range the last step is repeated for each time step within the time range or all time steps if a time range was not supplied.' # NOQA + # Check process inputs + # Expected Input: + # Process input: + # identifier=FEATURE_COLLECTION, title=Feature Collection, abstract=A feature collection encoded as a WFS request or one of the supported GML profiles., data type=ComplexData # NOQA + # Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.0.0/feature.xsd + # Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.1/feature.xsd + # Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.2/feature.xsd + # Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.1.2.1/feature.xsd + # Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.0.0/base/feature.xsd + # Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.0.1/base/feature.xsd + # Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.1.0/base/feature.xsd + # Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.1.1/base/feature.xsd + # Supported Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/3.2.1/base/feature.xsd + # Default Value: mimeType=text/xml, encoding=UTF-8, schema=http://schemas.opengis.net/gml/2.0.0/feature.xsd + # minOccurs=1, maxOccurs=1 + # Process input: + # identifier=DATASET_URI, title=Dataset URI, abstract=The base data web service URI for the dataset of interest., data type=anyURI # NOQA + # Any value allowed + # Default Value: None + # minOccurs=1, maxOccurs=1 + # Process input: + # identifier=DATASET_ID, title=Dataset Identifier, abstract=The unique identifier for the data type or variable of interest., data type=string # NOQA + # Any value allowed + # Default Value: None + # minOccurs=1, maxOccurs=2147483647 + # Process input: + # identifier=REQUIRE_FULL_COVERAGE, title=Require Full Coverage, abstract=If turned on, the service will require that the dataset of interest fully cover the polygon analysis zone data., data type=boolean # NOQA + # Any value allowed + # Default Value: True + # minOccurs=1, maxOccurs=1 + # Process input: + # identifier=TIME_START, title=Time Start, abstract=The date to begin analysis., data type=dateTime + # Any value allowed + # Default Value: None + # minOccurs=0, maxOccurs=1 + # Process input: + # identifier=TIME_END, title=Time End, abstract=The date to end analysis., data type=dateTime + # Any value allowed + # Default Value: None + # minOccurs=0, maxOccurs=1 + # Process input: + # identifier=FEATURE_ATTRIBUTE_NAME, title=Feature Attribute Name, abstract=The attribute that will be used to label column headers in processing output., data type=string # NOQA + # Any value allowed + # Default Value: None + # minOccurs=1, maxOccurs=1 + # Process input: + # identifier=DELIMITER, title=Delimiter, abstract=The delimiter that will be used to separate columns in the processing output., data type=string # NOQA + # Allowed Value: COMMA + # Allowed Value: TAB + # Allowed Value: SPACE + # Default Value: COMMA + # minOccurs=1, maxOccurs=1 + # Process input: + # identifier=STATISTICS, title=Statistics, abstract=Statistics that will be returned for each feature in the processing output., data type=string # NOQA + # Allowed Value: MEAN + # Allowed Value: MINIMUM + # Allowed Value: MAXIMUM + # Allowed Value: VARIANCE + # Allowed Value: STD_DEV + # Allowed Value: WEIGHT_SUM + # Allowed Value: COUNT + # Default Value: None + # minOccurs=1, maxOccurs=7 + # Process input: + # identifier=GROUP_BY, title=Group By, abstract=If multiple features and statistics are selected, this will change whether the processing output columns are sorted according to statistics or feature attributes., data type=string # NOQA + # Allowed Value: STATISTIC + # Allowed Value: FEATURE_ATTRIBUTE + # Default Value: None + # minOccurs=1, maxOccurs=1 + # Process input: + # identifier=SUMMARIZE_TIMESTEP, title=Summarize Timestep, abstract=If selected, processing output will include columns with summarized statistics for all feature attribute values for each timestep, data type=boolean # NOQA + # Any value allowed + # Default Value: True + # minOccurs=0, maxOccurs=1 + # Process input: + # identifier=SUMMARIZE_FEATURE_ATTRIBUTE, title=Summarize Feature Attribute, abstract=If selected, processing output will include a final row of statistics summarizing all timesteps for each feature attribute value, data type=boolean # NOQA + # Any value allowed + # Default Value: True + # minOccurs=0, maxOccurs=1 + assert len(process.dataInputs) == 12 + input = process.dataInputs[0] + assert input.identifier == 'FEATURE_COLLECTION' + assert input.dataType == 'ComplexData' + # Expected Output: + # identifier=OUTPUT, title=Output File, abstract=A delimited text file containing requested process output., data type=ComplexData # NOQA + # Supported Value: mimeType=text/csv, encoding=UTF-8, schema=None + # Default Value: mimeType=text/csv, encoding=UTF-8, schema=None + # reference=None, mimeType=None + # Check process outputs + assert len(process.processOutputs) == 1 + output = process.processOutputs[0] + assert output.identifier == 'OUTPUT' + assert output.dataType == 'ComplexData' diff -Nru owslib-0.16.0/tests/test_wps_execute_invalid_request.py owslib-0.18.0/tests/test_wps_execute_invalid_request.py --- owslib-0.16.0/tests/test_wps_execute_invalid_request.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_execute_invalid_request.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,25 @@ +# Simulate a WPS Execute invocation with INVALID arguments. +# This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. + +from tests.utils import resource_file, setup_logging +from owslib.wps import WebProcessingService + + +def test_wps_execute_invalid_request(): + # Initialize WPS client + wps = WebProcessingService( + 'http://cida.usgs.gov/gdp/process/WebProcessingService', + skip_caps=True) + + # Submit fake invocation of Execute operation using cached HTTP request and response + request = open(resource_file('wps_USGSExecuteInvalidRequest.xml'), 'rb').read() + response = open(resource_file('wps_USGSExecuteInvalidRequestResponse.xml'), 'rb').read() + execution = wps.execute(None, [], request=request, response=response) + + assert execution.isComplete() is True + + # Display errors + ex = execution.errors[0] + assert ex.code is None + assert ex.locator is None + assert ex.text == 'Attribute null not found in feature collection' diff -Nru owslib-0.16.0/tests/test_wps_execute.py owslib-0.18.0/tests/test_wps_execute.py --- owslib-0.16.0/tests/test_wps_execute.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_execute.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,29 @@ +# Simulate a WPS Execute invocation. +# This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. + +from tests.utils import resource_file, setup_logging +from owslib.wps import WebProcessingService + + +def test_wps_execute(): + wps = WebProcessingService( + 'http://cida.usgs.gov/gdp/process/WebProcessingService', + skip_caps=True) + + # Execute fake invocation of Execute operation using cached HTTP request and response + request = open(resource_file('wps_USGSExecuteRequest1.xml'), 'rb').read() + response = open(resource_file('wps_USGSExecuteResponse1a.xml'), 'rb').read() + execution = wps.execute(None, [], request=request, response=response) + assert execution.status == 'ProcessStarted' + assert execution.isComplete() is False + + # Simulate end of process + response = open(resource_file('wps_USGSExecuteResponse1b.xml'), 'rb').read() + execution.checkStatus(sleepSecs=0, response=response) + assert execution.status == 'ProcessSucceeded' + assert execution.isComplete() is True + + # Display location of process output + output = execution.processOutputs[0] + assert output.reference == \ + 'http://cida.usgs.gov/climate/gdp/process/RetrieveResultServlet?id=1318528582026OUTPUT.601bb3d0-547f-4eab-8642-7c7d2834459e' # noqa diff -Nru owslib-0.16.0/tests/test_wps_getcapabilities_52n.py owslib-0.18.0/tests/test_wps_getcapabilities_52n.py --- owslib-0.16.0/tests/test_wps_getcapabilities_52n.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_getcapabilities_52n.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,37 @@ +# Simulate a WPS GetCapabilities invocation. +# This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. + +from tests.utils import resource_file +from owslib.wps import WebProcessingService + + +def test_wps_getcapabilities_52n(): + # Initialize WPS client + wps = WebProcessingService( + 'http://geoprocessing.demo.52north.org:8080/52n-wps-webapp-3.3.1/WebProcessingService', + skip_caps=True) + + # Execute fake invocation of GetCapabilities operation by parsing cached response from 52North service + xml = open(resource_file('wps_52nCapabilities.xml'), 'rb').read() + wps.getcapabilities(xml=xml) + + # Check WPS description + assert wps.identification.type == 'WPS' + + # Check available operations + operations = [op.name for op in wps.operations] + assert operations == [ + 'GetCapabilities', + 'DescribeProcess', + 'Execute'] + + # Check high level process descriptions + processes = [(p.identifier, p.title) for p in wps.processes] + assert processes == [ + ('org.n52.wps.server.algorithm.test.MultiReferenceInputAlgorithm', 'for testing multiple inputs by reference'), + ('org.n52.wps.server.algorithm.test.EchoProcess', 'Echo process'), + ('org.n52.wps.server.algorithm.test.MultiReferenceBinaryInputAlgorithm', 'for testing multiple binary inputs by reference'), # noqa + ('org.n52.wps.server.algorithm.test.LongRunningDummyTestClass', 'org.n52.wps.server.algorithm.test.LongRunningDummyTestClass'), # noqa + ('org.n52.wps.server.algorithm.JTSConvexHullAlgorithm', 'org.n52.wps.server.algorithm.JTSConvexHullAlgorithm'), + ('org.n52.wps.server.algorithm.test.MultipleComplexInAndOutputsDummyTestClass', 'org.n52.wps.server.algorithm.test.MultipleComplexInAndOutputsDummyTestClass'), # noqa + ('org.n52.wps.server.algorithm.test.DummyTestClass', 'org.n52.wps.server.algorithm.test.DummyTestClass')] diff -Nru owslib-0.16.0/tests/test_wps_getcapabilities_ceda.py owslib-0.18.0/tests/test_wps_getcapabilities_ceda.py --- owslib-0.16.0/tests/test_wps_getcapabilities_ceda.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_getcapabilities_ceda.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,62 @@ +# Simulate a WPS GetCapabilities invocation. +# This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. + +from tests.utils import resource_file +from owslib.wps import WebProcessingService + + +def test_wps_getcapabilities_ceda(): + # Initialize WPS client + wps = WebProcessingService('http://ceda-wps2.badc.rl.ac.uk/wps', skip_caps=True) + + # Execute fake invocation of GetCapabilities operation by parsing cached response from USGS service + xml = open(resource_file('wps_CEDACapabilities.xml'), 'rb').read() + wps.getcapabilities(xml=xml) + + # Check WPS description + assert wps.identification.type == 'WPS' + assert wps.identification.title == 'WPS Pylons Test Server' + assert wps.identification.abstract is None + + # Check available operations + operations = [op.name for op in wps.operations] + assert operations == [ + 'GetCapabilities', + 'DescribeProcess', + 'Execute'] + + # Check high level process descriptions + processes = [(p.identifier, p.title) for p in wps.processes] + assert processes == [ + ('CDMSSubsetVariable', 'Writes a text file and returns an output.'), + ('NCDumpIt', 'Calls ncdump on the input file path and writes it to an output file.'), + ('TestDap', 'Writes a text file and returns an output.'), + ('CDMSDescribeVariableDomain', 'Writes a text file and returns an output.'), + ('CFCheck', 'Writes a text file and returns an output.'), + ('DoubleIt', 'Doubles the input number and returns value'), + ('SimplePlot', 'Creates a simple map plot.'), + ('CDMSListDatasets', 'Writes a text file and returns an output.'), + ('CDMSListVariables', 'Writes a text file and returns an output.'), + ('WCSWrapper', 'Web Coverage Service Wrapper Process'), + ('GetWeatherStations', 'Writes a text file with one weather station per line'), + ('ListPPFileHeader', 'Writes a text file that contains a listing of pp-records in a file.'), + ('TakeAges', 'A test process to last a long time.'), + ('CMIP5FileFinder', 'Writes a test file of matched CMIP5 files.'), + ('SubsetPPFile', 'Filters a PP-file to generate a new subset PP-file.'), + ('ExtractUKStationData', 'ExtractUKStationData'), + ('CDOWrapper1', 'Writes a text file and returns an output.'), + ('MMDNCDiff', 'MMDNCDiff'), + ('PlotRotatedGrid', 'Creates a plot - to show we can plot a rotated grid.'), + ('MMDAsync', 'Writes a text file and returns an output.'), + ('MashMyDataMultiplier', 'Writes a text file and returns an output.'), + ('Delegator', 'Writes a text file and returns an output.'), + ('ExArchProc1', 'Writes a text file and returns an output.'), + ('CDOShowInfo', 'Writes a text file and returns an output.'), + ('PostTest', 'Writes a text file and returns an output.'), + ('StatusTestProcess', 'An process to test status responses'), + ('WaitForFileDeletionCached', 'An asynchronous job that waits for a file to be deleted'), + ('WaitForAllFilesToBeDeleted', 'An asynchronous job that waits for a number of files to be deleted'), + ('AsyncTest', 'Does an asynchronous test job run'), + ('SyncTest1', 'Just creates a file.'), + ('WaitForFileDeletion', 'An asynchronous job that waits for a file to be deleted'), + ('ProcessTemplate', 'Writes a text file and returns an output.')] diff -Nru owslib-0.16.0/tests/test_wps_getcapabilities_usgs.py owslib-0.18.0/tests/test_wps_getcapabilities_usgs.py --- owslib-0.16.0/tests/test_wps_getcapabilities_usgs.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_getcapabilities_usgs.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,41 @@ +# Simulate a WPS GetCapabilities invocation. +# This test does not execute any live HTTP request, rather it parses XML files containing pre-made HTTP responses. + +from tests.utils import resource_file +from owslib.wps import WebProcessingService + + +def test_wps_getcapabilities_usgs(): + # Initialize WPS client + wps = WebProcessingService('http://cida.usgs.gov/gdp/process/WebProcessingService', skip_caps=True) + + # Execute fake invocation of GetCapabilities operation by parsing cached response from USGS service + xml = open(resource_file('wps_USGSCapabilities.xml'), 'rb').read() + wps.getcapabilities(xml=xml) + + # Check WPS description + assert wps.updateSequence is not None + assert wps.identification.type == 'WPS' + assert wps.identification.title == 'Geo Data Portal WPS Implementation' + assert wps.identification.abstract == 'A Geo Data Portal Service based on the 52north implementation of WPS 1.0.0' + + # Check available operations + operations = [op.name for op in wps.operations] + assert operations == [ + 'GetCapabilities', + 'DescribeProcess', + 'Execute'] + + # Check high level process descriptions + processes = [(p.identifier, p.title) for p in wps.processes] + assert processes == [ + ('gov.usgs.cida.gdp.wps.algorithm.filemanagement.ReceiveFiles', 'gov.usgs.cida.gdp.wps.algorithm.filemanagement.ReceiveFiles'), # noqa + ('gov.usgs.cida.gdp.wps.algorithm.discovery.CalculateWCSCoverageInfo', 'gov.usgs.cida.gdp.wps.algorithm.discovery.CalculateWCSCoverageInfo'), # noqa + ('gov.usgs.cida.gdp.wps.algorithm.communication.EmailWhenFinishedAlgorithm', 'gov.usgs.cida.gdp.wps.algorithm.communication.EmailWhenFinishedAlgorithm'), # noqa + ('gov.usgs.cida.gdp.wps.algorithm.communication.GeoserverManagementAlgorithm', 'gov.usgs.cida.gdp.wps.algorithm.communication.GeoserverManagementAlgorithm'), # noqa + ('gov.usgs.cida.gdp.wps.algorithm.discovery.GetWcsCoverages', 'gov.usgs.cida.gdp.wps.algorithm.discovery.GetWcsCoverages'), # noqa + ('gov.usgs.cida.gdp.wps.algorithm.filemanagement.GetWatersGeom', 'gov.usgs.cida.gdp.wps.algorithm.filemanagement.GetWatersGeom'), # noqa + ('gov.usgs.cida.gdp.wps.algorithm.discovery.ListOpendapGrids', 'gov.usgs.cida.gdp.wps.algorithm.discovery.ListOpendapGrids'), # noqa + ('gov.usgs.cida.gdp.wps.algorithm.filemanagement.CreateNewShapefileDataStore', 'gov.usgs.cida.gdp.wps.algorithm.filemanagement.CreateNewShapefileDataStore'), # noqa + ('gov.usgs.cida.gdp.wps.algorithm.discovery.GetGridTimeRange', 'gov.usgs.cida.gdp.wps.algorithm.discovery.GetGridTimeRange'), # noqa + ] diff -Nru owslib-0.16.0/tests/test_wps.py owslib-0.18.0/tests/test_wps.py --- owslib-0.16.0/tests/test_wps.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,93 @@ +import pytest + + +from tests.utils import resource_file +from owslib.wps import WebProcessingService, WPSExecution, Process, is_reference, Input +from owslib.etree import etree + + +@pytest.fixture +def wps(): + '''Returns a WPS instance''' + # Initialize WPS client + wps = WebProcessingService('http://example.org/wps', skip_caps=True) + xml = open(resource_file('wps_CEDACapabilities.xml'), 'rb').read() + wps.getcapabilities(xml=xml) + return wps + + +def test_wps_getOperationByName(wps): + wps.getOperationByName("GetCapabilities") + wps.getOperationByName("DescribeProcess") + wps.getOperationByName("Execute") + # Unavailable operations + with pytest.raises(KeyError): + wps.getOperationByName("GetStatus") + + +def test_wps_checkStatus(): + execution = WPSExecution() + xml = open(resource_file('wps_PMLExecuteResponse5.xml'), 'rb').read() + execution.checkStatus(response=xml) + assert execution.isSucceded() + assert execution.creationTime == '2011-11-08T21:36:55Z' + + +def test_wps_process_representation(wps): + p = wps.processes[0] + assert repr(p) == '' + assert str(p) == 'WPS Process: CDMSSubsetVariable, title=Writes a text file and returns an output.' + + +def test_wps_process_properties(wps): + p = wps.processes[0] + assert p.statusSupported is None + assert p.storeSupported is None + + +def test_wps_process_with_invalid_identifier(): + p = Process(etree.Element('invalid')) + assert repr(p) == '' + assert str(p) == 'WPS Process: , title=' + + +def test_wps_literal_data_input_parsing_references(): + xml = open(resource_file('wps_inout_parsing.xml'), 'r').read() + inputs = etree.fromstring(xml) + for i, i_elem in enumerate(inputs): + wps_in = Input(i_elem) + assert wps_in.identifier == 'input{}'.format(i + 1) + assert wps_in.dataType == 'string' + + +def test_wps_response_with_lineage(): + execution = WPSExecution() + xml = open(resource_file('wps_HummingbirdExecuteResponse1.xml'), 'rb').read() + execution.checkStatus(response=xml) + assert execution.isSucceded() + assert execution.creationTime == '2018-05-08T14:00:54Z' + # check lineage input with literal data + inp = execution.dataInputs[0] + assert inp.identifier == 'test' + assert inp.title == 'Select the test you want to run.' + assert inp.abstract == 'CF-1.6=Climate and Forecast Conventions (CF)' + assert inp.data[0] == 'CF-1.6' + # check lineage input with reference + inp = execution.dataInputs[1] + assert inp.identifier == 'dataset' + assert inp.title == 'Upload your NetCDF file here' + assert inp.abstract == 'or enter a URL pointing to a NetCDF file.' + assert inp.reference.startswith('https://www.esrl.noaa.gov/') + # check output with reference + outp = execution.processOutputs[0] + assert outp.identifier == 'output' + assert outp.title == 'Test Report' + assert outp.abstract == 'Compliance checker test report.' + assert outp.reference.startswith('http://localhost:8090/wpsoutputs') + + +def test_is_reference(): + assert is_reference('http://testing.org') + assert is_reference(b'http://testing.org') + assert not is_reference('mumbo jumbo') + assert not is_reference(b'mumbo jumbo') diff -Nru owslib-0.16.0/tests/test_wps_request10.py owslib-0.18.0/tests/test_wps_request10.py --- owslib-0.16.0/tests/test_wps_request10.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_request10.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,47 @@ +# Test generation of a WPS request from input arguments. +# The specific request involves a FeatureWeightedGridStatisticsAlgorithm process over a WFS feature. + +from tests.utils import resource_file, compare_xml +from owslib.wps import WPSExecution, WFSFeatureCollection, WFSQuery +from owslib.etree import etree + + +def test_wps_request10(): + # Supply process input arguments + wfsUrl = "http://igsarm-cida-gdp2.er.usgs.gov:8082/geoserver/wfs" + query = WFSQuery("sample:CONUS_States", propertyNames=['the_geom', "STATE"], + filters=["CONUS_States.508", "CONUS_States.469"]) + method = 'POST' + featureCollection = WFSFeatureCollection(wfsUrl, query, wfsMethod=method) + processid = 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' + inputs = [("FEATURE_ATTRIBUTE_NAME", "STATE"), + ("DATASET_URI", "dods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncml"), + ("DATASET_ID", "ccsm3_a1b_tmax"), + ("DATASET_ID", "ccsm3_a1b_pr"), + ("DATASET_ID", "ccsm3_a1fi_tmax"), + ("TIME_START", "1960-01-01T00:00:00.000Z"), + ("TIME_END", "1960-12-31T00:00:00.000Z"), + ("REQUIRE_FULL_COVERAGE", "true"), + ("DELIMITER", "COMMA"), + ("STATISTICS", "MEAN"), + ("STATISTICS", "MINIMUM"), + ("STATISTICS", "MAXIMUM"), + ("STATISTICS", "WEIGHT_SUM"), + ("STATISTICS", "VARIANCE"), + ("STATISTICS", "STD_DEV"), + ("STATISTICS", "COUNT"), + ("GROUP_BY", "STATISTIC"), + ("SUMMARIZE_TIMESTEP", "true"), + ("SUMMARIZE_FEATURE_ATTRIBUTE", "true"), + ("FEATURE_COLLECTION", featureCollection) + ] + output = "OUTPUT" + + # build XML request for WPS process execution + execution = WPSExecution() + requestElement = execution.buildRequest(processid, inputs, output=[(output, True)]) + request = etree.tostring(requestElement) + + # Compare to cached XML request + _request = open(resource_file('wps_USGSExecuteRequest4.xml'), 'rb').read() + assert compare_xml(request, _request) is True diff -Nru owslib-0.16.0/tests/test_wps_request11_bbox.py owslib-0.18.0/tests/test_wps_request11_bbox.py --- owslib-0.16.0/tests/test_wps_request11_bbox.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_request11_bbox.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,22 @@ +# Test generation of a WPS request from input arguments. +# The specific request involves a "bbox" process submitted to the Emu WPS service +# (https://github.com/bird-house/emu). + +from tests.utils import resource_file, compare_xml +from owslib.wps import WebProcessingService, WPSExecution, BoundingBoxDataInput +from owslib.etree import etree + + +def test_wps_request11_bbox(): + processid = "bbox" + bbox = BoundingBoxDataInput([51.9, 7.0, 53.0, 8.0]) + inputs = [("bbox", bbox)] + + # Build XML request for WPS process execution + execution = WPSExecution() + requestElement = execution.buildRequest(processid, inputs) + request = etree.tostring(requestElement) + + # Compare to cached XML request + _request = open(resource_file('wps_EmuExecuteRequest11.xml'), 'rb').read() + assert compare_xml(request, _request) is True diff -Nru owslib-0.16.0/tests/test_wps_request2.py owslib-0.18.0/tests/test_wps_request2.py --- owslib-0.16.0/tests/test_wps_request2.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_request2.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,47 @@ +# Test generation of a WPS request from input arguments. +# The specific request involves a FeatureWeightedGridStatisticsAlgorithm process over a WFS feature. + +from tests.utils import resource_file, compare_xml +from owslib.wps import WPSExecution, WFSFeatureCollection, WFSQuery +from owslib.etree import etree + + +def test_wps_request2(): + # Supply process input argument + wfsUrl = "http://igsarm-cida-gdp2.er.usgs.gov:8082/geoserver/wfs" + query = WFSQuery("sample:CONUS_States", + propertyNames=['the_geom', "STATE"], + filters=["CONUS_States.508", "CONUS_States.469"]) + featureCollection = WFSFeatureCollection(wfsUrl, query) + processid = 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' + inputs = [("FEATURE_ATTRIBUTE_NAME", "STATE"), + ("DATASET_URI", "dods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncml"), + ("DATASET_ID", "ccsm3_a1b_tmax"), + ("DATASET_ID", "ccsm3_a1b_pr"), + ("DATASET_ID", "ccsm3_a1fi_tmax"), + ("TIME_START", "1960-01-01T00:00:00.000Z"), + ("TIME_END", "1960-12-31T00:00:00.000Z"), + ("REQUIRE_FULL_COVERAGE", "true"), + ("DELIMITER", "COMMA"), + ("STATISTICS", "MEAN"), + ("STATISTICS", "MINIMUM"), + ("STATISTICS", "MAXIMUM"), + ("STATISTICS", "WEIGHT_SUM"), + ("STATISTICS", "VARIANCE"), + ("STATISTICS", "STD_DEV"), + ("STATISTICS", "COUNT"), + ("GROUP_BY", "STATISTIC"), + ("SUMMARIZE_TIMESTEP", "true"), + ("SUMMARIZE_FEATURE_ATTRIBUTE", "true"), + ("FEATURE_COLLECTION", featureCollection) + ] + output = "OUTPUT" + + # build XML request for WPS process execution + execution = WPSExecution() + requestElement = execution.buildRequest(processid, inputs, output=[(output, True)]) + request = etree.tostring(requestElement) + + # Compare to cached XML request + _request = open(resource_file('wps_USGSExecuteRequest2.xml'), 'rb').read() + assert compare_xml(request, _request) is True diff -Nru owslib-0.16.0/tests/test_wps_request3.py owslib-0.18.0/tests/test_wps_request3.py --- owslib-0.16.0/tests/test_wps_request3.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_request3.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,40 @@ +# Python doctest file to test generation of a WPS request from input arguments. +# The specific request involves a FeatureWeightedGridStatisticsAlgorithm process over a multi-polygon feature. + +from tests.utils import resource_file, compare_xml +from owslib.wps import GMLMultiPolygonFeatureCollection, WebProcessingService, WPSExecution +from owslib.etree import etree + + +def test_wps_request3(): + # Supply process input arguments + polygon = [(-102.8184, 39.5273), (-102.8184, 37.418), (-101.2363, 37.418), + (-101.2363, 39.5273), (-102.8184, 39.5273)] + featureCollection = GMLMultiPolygonFeatureCollection([polygon]) + processid = 'gov.usgs.cida.gdp.wps.algorithm.FeatureWeightedGridStatisticsAlgorithm' + inputs = [("FEATURE_ATTRIBUTE_NAME", "the_geom"), + ("DATASET_URI", "dods://igsarm-cida-thredds1.er.usgs.gov:8080/thredds/dodsC/dcp/conus_grid.w_meta.ncml"), + ("DATASET_ID", "ccsm3_a1b_tmax"), + ("TIME_START", "1960-01-01T00:00:00.000Z"), + ("TIME_END", "1960-12-31T00:00:00.000Z"), + ("REQUIRE_FULL_COVERAGE", "true"), + ("DELIMITER", "COMMA"), + ("STATISTICS", "MEAN"), + ("STATISTICS", "MINIMUM"), + ("STATISTICS", "MAXIMUM"), + ("STATISTICS", "WEIGHT_SUM"), + ("STATISTICS", "VARIANCE"), + ("STATISTICS", "STD_DEV"), + ("STATISTICS", "COUNT"), + ("GROUP_BY", "STATISTIC"), + ("SUMMARIZE_TIMESTEP", "false"), + ("SUMMARIZE_FEATURE_ATTRIBUTE", "false"), + ("FEATURE_COLLECTION", featureCollection)] + output = "OUTPUT" + # build XML request for WPS process execution + execution = WPSExecution() + requestElement = execution.buildRequest(processid, inputs, output=[(output, True)]) + request = etree.tostring(requestElement) + # Compare to cached XML request + _request = open(resource_file('wps_USGSExecuteRequest3.xml'), 'rb').read() + assert compare_xml(request, _request) is True diff -Nru owslib-0.16.0/tests/test_wps_request4.py owslib-0.18.0/tests/test_wps_request4.py --- owslib-0.16.0/tests/test_wps_request4.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_request4.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,23 @@ +# Test generation of a WPS request from input arguments. +# The specific request involves a "reprojectImage" process submitted to the PML WPS service. + +from tests.utils import resource_file, compare_xml +from owslib.wps import WebProcessingService, WPSExecution +from owslib.etree import etree + + +def test_wps_request4(): + # Process input/ouutput arguments + processid = "reprojectImage" + inputs = [("inputImage", "http://rsg.pml.ac.uk/wps/testdata/elev_srtm_30m.img"), + ("outputSRS", "EPSG:4326")] + output = "outputImage" + + # build XML request for WPS process execution + execution = WPSExecution() + requestElement = execution.buildRequest(processid, inputs, output=[(output, True)]) + request = etree.tostring(requestElement) + + # Compare to cached XML request + _request = open(resource_file('wps_PMLExecuteRequest4.xml'), 'rb').read() + assert compare_xml(request, _request) is True diff -Nru owslib-0.16.0/tests/test_wps_request5.py owslib-0.18.0/tests/test_wps_request5.py --- owslib-0.16.0/tests/test_wps_request5.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_request5.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,23 @@ +# Test generation of a WPS request from input arguments. +# The specific request involves a "reprojectCoords" process submitted to the PML WPS service. + +from tests.utils import resource_file, compare_xml +from owslib.wps import WebProcessingService, WPSExecution +from owslib.etree import etree + + +def test_wps_request5(): + # Process input/output arguments + processid = "reprojectCoords" + inputs = [("coords", "http://rsg.pml.ac.uk/wps/testdata/coords.txt"), + ("outputSRS", "EPSG:32630"), + ("inputSRS", "EPSG:4326")] + + # build XML request for WPS process execution + execution = WPSExecution() + requestElement = execution.buildRequest(processid, inputs) + request = etree.tostring(requestElement) + + # Compare to cached XML request + _request = open(resource_file('wps_PMLExecuteRequest5.xml'), 'rb').read() + assert compare_xml(request, _request) is True diff -Nru owslib-0.16.0/tests/test_wps_request6.py owslib-0.18.0/tests/test_wps_request6.py --- owslib-0.16.0/tests/test_wps_request6.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_request6.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,24 @@ +# Test generation of a WPS request from input arguments. +# The specific request involves a "v.net.path" process submitted to the PML WPS service. + + +from tests.utils import resource_file, compare_xml +from owslib.wps import WebProcessingService, WPSExecution +from owslib.etree import etree + + +def test_wps_request6(): + # Process input/output arguments + + processid = "v.net.path" + inputs = [("input", "http://rsg.pml.ac.uk/wps/example/graph.gml"), + ("file", "1 -960123.1421801624 4665723.56559387 -101288.65106088226 5108200.011823481")] + + # Build XML request for WPS process execution + execution = WPSExecution() + requestElement = execution.buildRequest(processid, inputs) + request = etree.tostring(requestElement) + + # Compare to cached XML request + _request = open(resource_file('wps_PMLExecuteRequest6.xml'), 'rb').read() + assert compare_xml(request, _request) is True diff -Nru owslib-0.16.0/tests/test_wps_request7.py owslib-0.18.0/tests/test_wps_request7.py --- owslib-0.16.0/tests/test_wps_request7.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_request7.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,26 @@ +# Test generation of a WPS request from input arguments. +# The specific request involves a "wordcount" process submitted to the Emu WPS service +# (https://github.com/bird-house/emu). + +from tests.utils import resource_file, compare_xml +from owslib.wps import WebProcessingService, WPSExecution, ComplexDataInput +from owslib.wps import SYNC +from owslib.etree import etree + + +def test_wps_request7(): + # Process input/ouutput arguments + processid = "wordcount" + textdoc = ComplexDataInput("http://emu.readthedocs.org/en/latest/index.html") + inputs = [("text", textdoc), ] + outputs = [("output", False)] + + # Build XML request for WPS process execution, sync request + execution = WPSExecution() + requestElement = execution.buildRequest(processid, inputs, output=outputs, mode=SYNC, lineage=False) + request = etree.tostring(requestElement) + + # Compare to cached XML request + _request = open(resource_file('wps_EmuExecuteRequest7.xml'), 'rb').read() + print(request) + assert compare_xml(request, _request) is True diff -Nru owslib-0.16.0/tests/test_wps_request8.py owslib-0.18.0/tests/test_wps_request8.py --- owslib-0.16.0/tests/test_wps_request8.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_request8.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,25 @@ +# Test generation of a WPS request from input arguments. +# The specific request involves a "wordcount" process submitted to the Emu WPS service +# (https://github.com/bird-house/emu). + +from tests.utils import resource_file, compare_xml +from owslib.wps import WebProcessingService, WPSExecution, ComplexDataInput +from owslib.wps import ASYNC +from owslib.etree import etree + + +def test_wps_request8(): + # Process input/ouutput arguments + processid = "wordcount" + textdoc = ComplexDataInput("Alice was beginning to get very tired ...") + inputs = [("text", textdoc), ] + outputs = [("output", True), ] + + # Build XML request for WPS process execution + execution = WPSExecution() + requestElement = execution.buildRequest(processid, inputs, output=outputs, mode=ASYNC, lineage=True) + request = etree.tostring(requestElement) + + # Compare to cached XML request + _request = open(resource_file('wps_EmuExecuteRequest8.xml'), 'rb').read() + assert compare_xml(request, _request) is True diff -Nru owslib-0.16.0/tests/test_wps_request9.py owslib-0.18.0/tests/test_wps_request9.py --- owslib-0.16.0/tests/test_wps_request9.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_request9.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,22 @@ +# Test generation of a WPS request from input arguments. +# The specific request involves a "helloworld" process submitted to the Emu WPS service +# (https://github.com/bird-house/emu). + +from tests.utils import resource_file, compare_xml +from owslib.wps import WebProcessingService, WPSExecution, ComplexDataInput +from owslib.etree import etree + + +def test_wps_request9(): + # Process input/output arguments + processid = "helloworld" + inputs = [("user", 'Pingu')] + + # Build XML request for WPS process execution + execution = WPSExecution() + requestElement = execution.buildRequest(processid, inputs) + request = etree.tostring(requestElement) + + # Compare to cached XML request + _request = open(resource_file('wps_EmuExecuteRequest9.xml'), 'rb').read() + assert compare_xml(request, _request) is True diff -Nru owslib-0.16.0/tests/test_wps_response6.py owslib-0.18.0/tests/test_wps_response6.py --- owslib-0.16.0/tests/test_wps_response6.py 1970-01-01 00:00:00.000000000 +0000 +++ owslib-0.18.0/tests/test_wps_response6.py 2019-06-25 00:00:28.000000000 +0000 @@ -0,0 +1,32 @@ +from tests.utils import resource_file, compare_xml, setup_logging +from owslib.wps import WebProcessingService + + +def test_wps_response6(): + # Build WPS object; service has been down for some time so skip caps here + wps = WebProcessingService('http://rsg.pml.ac.uk/wps/vector.cgi', skip_caps=True) + + # Execute face WPS invocation + request = open(resource_file('wps_PMLExecuteRequest6.xml'), 'rb').read() + response = open(resource_file('wps_PMLExecuteResponse6.xml'), 'rb').read() + execution = wps.execute(None, [], request=request, response=response) + + # Check execution result + assert execution.status == 'ProcessSucceeded' + assert execution.url == 'http://rsg.pml.ac.uk/wps/vector.cgi' + assert execution.statusLocation == \ + 'http://rsg.pml.ac.uk/wps/wpsoutputs/pywps-132084838963.xml' + assert execution.serviceInstance == \ + 'http://rsg.pml.ac.uk/wps/vector.cgi?service=WPS&request=GetCapabilities&version=1.0.0' + assert execution.version == '1.0.0' + # check single output + output = execution.processOutputs[0] + assert output.identifier == 'output' + assert output.title == 'Name for output vector map' + assert output.mimeType == 'text/xml' + assert output.dataType == 'ComplexData' + assert output.reference is None + + response = output.data[0] + should_return = '''\n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t -960123.14218016264665723.56559387\n\t\t\t\t\t -101288.65106088225108200.011823481\n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t -960123.142180162365548,4665723.565593870356679,0 -960123.142180162365548,4665723.565593870356679,0 -960123.142180162598379,4665723.565593870356679,0 -960123.142180162598379,4665723.565593870356679,0 -711230.141176006174646,4710278.48552671354264,0 -711230.141176006174646,4710278.48552671354264,0 -623656.677859728806652,4848552.374973464757204,0 -623656.677859728806652,4848552.374973464757204,0 -410100.337491964863148,4923834.82589447684586,0 -410100.337491964863148,4923834.82589447684586,0 -101288.651060882242746,5108200.011823480948806,0 -101288.651060882242746,5108200.011823480948806,0 -101288.651060882257298,5108200.011823480948806,0 -101288.651060882257298,5108200.011823480948806,0\n\t\t\t\t\t 1\n\t\t\t\t\t 1\n\t\t\t\t\t 0\n\t\t\t\t\t 0\n\t\t\t\t\t 0\n\t\t\t\t\t 1002619.181\n\t\t\t\t\t 0\n\t\t\t\t\t 0\n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t''' # noqa + assert compare_xml(should_return, response) is True diff -Nru owslib-0.16.0/tests/utils.py owslib-0.18.0/tests/utils.py --- owslib-0.16.0/tests/utils.py 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tests/utils.py 2019-06-25 00:00:28.000000000 +0000 @@ -3,12 +3,14 @@ import logging import os import sys +import requests from owslib.etree import etree, ElementType try: # Python 3 from urllib.parse import urlparse except ImportError: # Python 2 from urlparse import urlparse + def setup_logging(loglevel='INFO'): """Helper function to setup logging for tests""" logger = logging.getLogger('owslib') @@ -19,30 +21,36 @@ logger.addHandler(sh) return logger + def resource_file(filepath): return os.path.join(test_directory(), 'resources', filepath) + def test_directory(): """Helper function to return path to the tests directory""" return os.path.dirname(__file__) + def scratch_directory(): """Helper function to return path to the tests scratch directory""" return os.path.join(test_directory(), 'scratch') + def scratch_file(filename): """Helper function to return file path in the tests scratch directory""" return os.path.join(scratch_directory(), filename) -def compare_xml(a,b): + +def compare_xml(a, b): if not isinstance(a, ElementType): a = etree.fromstring(a) if not isinstance(b, ElementType): b = etree.fromstring(b) - return compare_elements(a,b) + return compare_elements(a, b) -def compare_elements(a,b): + +def compare_elements(a, b): # Tag if a.tag != b.tag: return False @@ -62,14 +70,33 @@ return True + def cast_tuple_int_list(tup): """Set tuple float values to int for more predictable test results""" return [int(a) for a in tup] + def cast_tuple_int_list_srs(tup): tup2 = cast_tuple_int_list(tup[:4]) tup2.append(tup[-1]) return tup2 + def sorted_url_query(url): return sorted(urlparse(url).query.split("&")) + + +def service_ok(url, timeout=5): + try: + resp = requests.get(url, timeout=timeout) + if 'html' in resp.headers['content-type']: + ok = False + else: + ok = resp.ok + except requests.exceptions.ReadTimeout: + ok = False + except requests.exceptions.ConnectTimeout: + ok = False + except Exception: + ok = False + return ok diff -Nru owslib-0.16.0/tox.ini owslib-0.18.0/tox.ini --- owslib-0.16.0/tox.ini 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/tox.ini 2019-06-25 00:00:28.000000000 +0000 @@ -1,8 +1,18 @@ [pytest] 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 +norecursedirs = .git docs examples etc cov* *.egg* pytest* .tox _broken + +[flake8] +ignore=F401,E402 +max-line-length=120 +exclude = + .git, + __pycache__, + docs/source/conf.py, + build, + dist + examples, + etc, [tox] skipsdist=True diff -Nru owslib-0.16.0/.travis.yml owslib-0.18.0/.travis.yml --- owslib-0.16.0/.travis.yml 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/.travis.yml 2019-06-25 00:00:28.000000000 +0000 @@ -1,9 +1,19 @@ language: python python: - "2.7" - - "3.4" + - "3.5" - "3.6" -# - "pypy" +# Enable 3.7 without globally enabling sudo and dist: xenial for other build jobs +matrix: + include: + - python: 3.7 + dist: xenial + sudo: true + env: LMXL=true + - python: 3.7 + dist: xenial + sudo: true + env: LMXL=false sudo: false env: - LXML=true @@ -14,9 +24,10 @@ - if [ "$LXML" == "true" ]; then pip install lxml; fi script: - python -m pytest - - pep8 owslib/wmts.py + - flake8 owslib/wmts.py + - flake8 owslib/wps.py after_success: - - coveralls + - coveralls notifications: irc: - "irc.freenode.org#geopython" diff -Nru owslib-0.16.0/VERSION.txt owslib-0.18.0/VERSION.txt --- owslib-0.16.0/VERSION.txt 2017-12-22 02:05:04.000000000 +0000 +++ owslib-0.18.0/VERSION.txt 2019-06-25 00:00:28.000000000 +0000 @@ -1 +1 @@ -0.16.0 +0.18.0