From 0f135d33e0ebc762c11c57424dffc903d0cac63f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20de=20Sousa?= <luis.de.sousa@protonmail.ch> Date: Fri, 6 Dec 2019 17:20:48 +0100 Subject: [PATCH] Adapted to 2019 services --- WCS-getExtent.ipynb | 141 +++++++++++++++++++++ WCS.ipynb | 271 ---------------------------------------- WCS_basics.ipynb | 293 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 434 insertions(+), 271 deletions(-) create mode 100644 WCS-getExtent.ipynb delete mode 100644 WCS.ipynb create mode 100644 WCS_basics.ipynb diff --git a/WCS-getExtent.ipynb b/WCS-getExtent.ipynb new file mode 100644 index 0000000..bcb4007 --- /dev/null +++ b/WCS-getExtent.ipynb @@ -0,0 +1,141 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This time a connection is made to the service for soil pH:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from owslib.wcs import WebCoverageService\n", + "wcs = WebCoverageService('http://maps.isric.org/mapserv?map=/map/phh2o.map', version='1.0.0')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A bounding box broadly matching Senegal:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "bbox = (-1784000, 1356000, -1140000, 1863000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now fetch the coverage for Senegal:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "response = wcs.getCoverage(\n", + " identifier='phh20_0-5cm_mean', \n", + " crs='urn:ogc:def:crs:EPSG::152160',\n", + " bbox=bbox, \n", + " resx=1, resy=1, \n", + " format='GeoTIFF')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "with open('./data/Senegal_pH_0-5_mean.tif', 'wb') as file:\n", + " file.write(response.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the data on the client side some regular interaction can be started with a library like resterIO:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "ename": "RasterioIOError", + "evalue": "'./data/Senegal_CEC0m.tif' not recognized as a supported file format.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mCPLE_OpenFailedError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32mrasterio/_base.pyx\u001b[0m in \u001b[0;36mrasterio._base.DatasetBase.__init__\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mrasterio/_shim.pyx\u001b[0m in \u001b[0;36mrasterio._shim.open_dataset\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mrasterio/_err.pyx\u001b[0m in \u001b[0;36mrasterio._err.exc_wrap_pointer\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mCPLE_OpenFailedError\u001b[0m: './data/Senegal_CEC0m.tif' not recognized as a supported file format.", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mRasterioIOError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-14-3c4dada614d1>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mrasterio\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mCEC\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrasterio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./data/Senegal_CEC0m.tif\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"GTiff\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mCEC\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtitle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Cation Exchange Capacity at 0 metres in Senegal'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcmap\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'gist_ncar'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3/dist-packages/rasterio/env.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m 428\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 429\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0menv_ctor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 430\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 431\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 432\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3/dist-packages/rasterio/__init__.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(fp, mode, driver, width, height, count, crs, transform, dtype, nodata, sharing, **kwargs)\u001b[0m\n\u001b[1;32m 214\u001b[0m \u001b[0;31m# None.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 216\u001b[0;31m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDatasetReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdriver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msharing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msharing\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 217\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'r+'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_writer_for_path\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdriver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msharing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msharing\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mrasterio/_base.pyx\u001b[0m in \u001b[0;36mrasterio._base.DatasetBase.__init__\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mRasterioIOError\u001b[0m: './data/Senegal_CEC0m.tif' not recognized as a supported file format." + ] + } + ], + "source": [ + "import rasterio\n", + "CEC = rasterio.open(\"./data/Senegal_CEC0m.tif\", driver=\"GTiff\")\n", + "show(CEC, title='Cation Exchange Capacity at 0 metres in Senegal', cmap='gist_ncar')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next steps:\n", + "https://publicwiki.deltares.nl/display/OET/WCS+primer\n", + "https://geoscripting-wur.github.io/PythonRaster/" + ] + } + ], + "metadata": { + "@webio": { + "lastCommId": "C7CD903630FF4971A278510DC0E27447", + "lastKernelId": "5e40268c-f755-4e83-aec6-935c11d843f6" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/WCS.ipynb b/WCS.ipynb deleted file mode 100644 index 5399d1e..0000000 --- a/WCS.ipynb +++ /dev/null @@ -1,271 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "ename": "ServiceException", - "evalue": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>401 Unauthorized</title>\n</head><body>\n<h1>Unauthorized</h1>\n<p>This server could not verify that you\nare authorized to access the document\nrequested. Either you supplied the wrong\ncredentials (e.g., bad password), or your\nbrowser doesn't understand how to supply\nthe credentials required.</p>\n<hr>\n<address>Apache/2.4.29 (Ubuntu) Server at maps.isric.org Port 80</address>\n</body></html>\n", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mServiceException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-3-85257035e0f7>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mowslib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutil\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mAuthentication\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mauth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mAuthentication\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"luis\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"coruja\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mwcs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mWebCoverageService\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'http://maps.isric.org/mapserv?map=/map/bdod2.map'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mversion\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'1.0.0'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mauth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mauth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwcs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontents\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/lib/python3/dist-packages/owslib/wcs.py\u001b[0m in \u001b[0;36mWebCoverageService\u001b[0;34m(url, version, xml, cookies, timeout, auth)\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mversion\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'1.0.0'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m return wcs100.WebCoverageService_1_0_0.__new__(\n\u001b[0;32m---> 44\u001b[0;31m wcs100.WebCoverageService_1_0_0, clean_url, xml, cookies, auth=auth)\n\u001b[0m\u001b[1;32m 45\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mversion\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'1.1.0'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 46\u001b[0m return wcs110.WebCoverageService_1_1_0.__new__(\n", - "\u001b[0;32m/usr/lib/python3/dist-packages/owslib/coverage/wcsBase.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(self, url, xml, cookies, auth)\u001b[0m\n\u001b[1;32m 51\u001b[0m \"\"\"\n\u001b[1;32m 52\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__new__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxml\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcookies\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mauth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mauth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 54\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcookies\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcookies\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_describeCoverage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m \u001b[0;31m#cache for DescribeCoverage responses\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/lib/python3/dist-packages/owslib/coverage/wcs100.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, url, xml, cookies, auth)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_capabilities\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mreader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreadString\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxml\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_capabilities\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mreader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 54\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0;31m# check for exceptions\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/lib/python3/dist-packages/owslib/coverage/wcsBase.py\u001b[0m in \u001b[0;36mread\u001b[0;34m(self, service_url, timeout)\u001b[0m\n\u001b[1;32m 116\u001b[0m \"\"\"\n\u001b[1;32m 117\u001b[0m \u001b[0mrequest\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcapabilities_url\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mservice_url\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mu\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopenURL\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcookies\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcookies\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mauth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0metree\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfromstring\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mu\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/lib/python3/dist-packages/owslib/util.py\u001b[0m in \u001b[0;36mopenURL\u001b[0;34m(url_base, data, method, cookies, username, password, timeout, headers, verify, cert, auth)\u001b[0m\n\u001b[1;32m 199\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 200\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatus_code\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m400\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m401\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 201\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mServiceException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 202\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatus_code\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m404\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m500\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m502\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m503\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m504\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# add more if needed\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mServiceException\u001b[0m: <!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>401 Unauthorized</title>\n</head><body>\n<h1>Unauthorized</h1>\n<p>This server could not verify that you\nare authorized to access the document\nrequested. Either you supplied the wrong\ncredentials (e.g., bad password), or your\nbrowser doesn't understand how to supply\nthe credentials required.</p>\n<hr>\n<address>Apache/2.4.29 (Ubuntu) Server at maps.isric.org Port 80</address>\n</body></html>\n" - ] - } - ], - "source": [ - "from owslib.wcs import WebCoverageService\n", - "from owslib.util import Authentication\n", - "auth = Authentication(\"luis\", \"coruja\")\n", - "wcs = WebCoverageService('http://maps.isric.org/mapserv?map=/map/bdod2.map', version='1.0.0', auth=auth)\n", - "print(list(wcs.contents))" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['GetCapabilities', 'DescribeCoverage', 'GetCoverage']\n" - ] - } - ], - "source": [ - "print([op.name for op in wcs.operations])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That is a large set of coverages, but it is easy to filter the dictionary. For instance, to get the name of all SoilGrids coverages:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['sg250m:ACDWRB_M_ss_250m', 'sg250m:AWCh1_M_sl1_250m', 'sg250m:AWCh1_M_sl2_250m', 'sg250m:AWCh1_M_sl3_250m', 'sg250m:AWCh1_M_sl4_250m', 'sg250m:AWCh1_M_sl5_250m', 'sg250m:AWCh1_M_sl6_250m', 'sg250m:AWCh1_M_sl7_250m', 'sg250m:AWCh2_M_sl1_250m', 'sg250m:AWCh2_M_sl2_250m', 'sg250m:AWCh2_M_sl3_250m', 'sg250m:AWCh2_M_sl4_250m', 'sg250m:AWCh2_M_sl5_250m', 'sg250m:AWCh2_M_sl6_250m', 'sg250m:AWCh2_M_sl7_250m', 'sg250m:AWCh3_M_sl1_250m', 'sg250m:AWCh3_M_sl2_250m', 'sg250m:AWCh3_M_sl3_250m', 'sg250m:AWCh3_M_sl4_250m', 'sg250m:AWCh3_M_sl5_250m', 'sg250m:AWCh3_M_sl6_250m', 'sg250m:AWCh3_M_sl7_250m', 'sg250m:AWCtS_M_sl1_250m', 'sg250m:AWCtS_M_sl2_250m', 'sg250m:AWCtS_M_sl3_250m', 'sg250m:AWCtS_M_sl4_250m', 'sg250m:AWCtS_M_sl5_250m', 'sg250m:AWCtS_M_sl6_250m', 'sg250m:AWCtS_M_sl7_250m', 'sg250m:BDRICM_M_250m', 'sg250m:BDRLOG_M_250m', 'sg250m:BDTICM_M_250m', 'sg250m:BLDFIE_M_sl1_250m', 'sg250m:BLDFIE_M_sl2_250m', 'sg250m:BLDFIE_M_sl3_250m', 'sg250m:BLDFIE_M_sl4_250m', 'sg250m:BLDFIE_M_sl5_250m', 'sg250m:BLDFIE_M_sl6_250m', 'sg250m:BLDFIE_M_sl7_250m', 'sg250m:CECSOL_M_sl1_250m', 'sg250m:CECSOL_M_sl2_250m', 'sg250m:CECSOL_M_sl3_250m', 'sg250m:CECSOL_M_sl4_250m', 'sg250m:CECSOL_M_sl5_250m', 'sg250m:CECSOL_M_sl6_250m', 'sg250m:CECSOL_M_sl7_250m', 'sg250m:CLYPPT_M_sl1_250m', 'sg250m:CLYPPT_M_sl2_250m', 'sg250m:CLYPPT_M_sl3_250m', 'sg250m:CLYPPT_M_sl4_250m', 'sg250m:CLYPPT_M_sl5_250m', 'sg250m:CLYPPT_M_sl6_250m', 'sg250m:CLYPPT_M_sl7_250m', 'sg250m:CRFVOL_M_sl1_250m', 'sg250m:CRFVOL_M_sl2_250m', 'sg250m:CRFVOL_M_sl3_250m', 'sg250m:CRFVOL_M_sl4_250m', 'sg250m:CRFVOL_M_sl5_250m', 'sg250m:CRFVOL_M_sl6_250m', 'sg250m:CRFVOL_M_sl7_250m', 'sg250m:HISTPR_250m', 'sg250m:OCDENS_M_sl1_250m', 'sg250m:OCDENS_M_sl2_250m', 'sg250m:OCDENS_M_sl3_250m', 'sg250m:OCDENS_M_sl4_250m', 'sg250m:OCDENS_M_sl5_250m', 'sg250m:OCDENS_M_sl6_250m', 'sg250m:OCDENS_M_sl7_250m', 'sg250m:OCSTHA_M_100cm_250m', 'sg250m:OCSTHA_M_200cm_250m', 'sg250m:OCSTHA_M_30cm_250m', 'sg250m:OCSTHA_M_sd1_250m', 'sg250m:OCSTHA_M_sd2_250m', 'sg250m:OCSTHA_M_sd3_250m', 'sg250m:OCSTHA_M_sd4_250m', 'sg250m:OCSTHA_M_sd5_250m', 'sg250m:OCSTHA_M_sd6_250m', 'sg250m:ORCDRC_M_sl1_250m', 'sg250m:ORCDRC_M_sl2_250m', 'sg250m:ORCDRC_M_sl3_250m', 'sg250m:ORCDRC_M_sl4_250m', 'sg250m:ORCDRC_M_sl5_250m', 'sg250m:ORCDRC_M_sl6_250m', 'sg250m:ORCDRC_M_sl7_250m', 'sg250m:PHIHOX_M_sl1_250m', 'sg250m:PHIHOX_M_sl2_250m', 'sg250m:PHIHOX_M_sl3_250m', 'sg250m:PHIHOX_M_sl4_250m', 'sg250m:PHIHOX_M_sl5_250m', 'sg250m:PHIHOX_M_sl6_250m', 'sg250m:PHIHOX_M_sl7_250m', 'sg250m:PHIKCL_M_sl1_250m', 'sg250m:PHIKCL_M_sl2_250m', 'sg250m:PHIKCL_M_sl3_250m', 'sg250m:PHIKCL_M_sl4_250m', 'sg250m:PHIKCL_M_sl5_250m', 'sg250m:PHIKCL_M_sl6_250m', 'sg250m:PHIKCL_M_sl7_250m', 'sg250m:SLGWRB_250m', 'sg250m:SLTPPT_M_sl1_250m', 'sg250m:SLTPPT_M_sl2_250m', 'sg250m:SLTPPT_M_sl3_250m', 'sg250m:SLTPPT_M_sl4_250m', 'sg250m:SLTPPT_M_sl5_250m', 'sg250m:SLTPPT_M_sl6_250m', 'sg250m:SLTPPT_M_sl7_250m', 'sg250m:SNDPPT_M_sl1_250m', 'sg250m:SNDPPT_M_sl2_250m', 'sg250m:SNDPPT_M_sl3_250m', 'sg250m:SNDPPT_M_sl4_250m', 'sg250m:SNDPPT_M_sl5_250m', 'sg250m:SNDPPT_M_sl6_250m', 'sg250m:SNDPPT_M_sl7_250m', 'sg250m:TAXNWRB_250m', 'sg250m:TAXNWRB_Acric.Ferralsols_250m', 'sg250m:TAXNWRB_Acric.Plinthosols_250m', 'sg250m:TAXNWRB_Albic.Arenosols_250m', 'sg250m:TAXNWRB_Albic.Luvisols_250m', 'sg250m:TAXNWRB_Alic.Nitisols_250m', 'sg250m:TAXNWRB_Aluandic.Andosols_250m', 'sg250m:TAXNWRB_Aric.Regosols_250m', 'sg250m:TAXNWRB_Calcaric.Regosols_250m', 'sg250m:TAXNWRB_Calcic.Chernozems_250m', 'sg250m:TAXNWRB_Calcic.Gleysols_250m', 'sg250m:TAXNWRB_Calcic.Gypsisols_250m', 'sg250m:TAXNWRB_Calcic.Histosols_250m', 'sg250m:TAXNWRB_Calcic.Kastanozems_250m', 'sg250m:TAXNWRB_Calcic.Luvisols_250m', 'sg250m:TAXNWRB_Calcic.Solonetz_250m', 'sg250m:TAXNWRB_Calcic.Vertisols_250m', 'sg250m:TAXNWRB_Cryic.Histosols_250m', 'sg250m:TAXNWRB_Cutanic.Alisols_250m', 'sg250m:TAXNWRB_Endogleyic.Cambisols_250m', 'sg250m:TAXNWRB_Endogleyic.Planosols_250m', 'sg250m:TAXNWRB_Ferralic.Arenosols_250m', 'sg250m:TAXNWRB_Ferralic.Cambisols_250m', 'sg250m:TAXNWRB_Fibric.Histosols_250m', 'sg250m:TAXNWRB_Gleyic.Luvisols_250m', 'sg250m:TAXNWRB_Gleyic.Podzols_250m', 'sg250m:TAXNWRB_Gleyic.Solonetz_250m', 'sg250m:TAXNWRB_Gypsic.Solonchaks_250m', 'sg250m:TAXNWRB_Haplic.Acrisols..Alumic._250m', 'sg250m:TAXNWRB_Haplic.Acrisols..Ferric._250m', 'sg250m:TAXNWRB_Haplic.Acrisols..Humic._250m', 'sg250m:TAXNWRB_Haplic.Acrisols_250m', 'sg250m:TAXNWRB_Haplic.Albeluvisols_250m', 'sg250m:TAXNWRB_Haplic.Alisols_250m', 'sg250m:TAXNWRB_Haplic.Andosols_250m', 'sg250m:TAXNWRB_Haplic.Arenosols..Calcaric._250m', 'sg250m:TAXNWRB_Haplic.Arenosols_250m', 'sg250m:TAXNWRB_Haplic.Calcisols..Sodic._250m', 'sg250m:TAXNWRB_Haplic.Calcisols_250m', 'sg250m:TAXNWRB_Haplic.Cambisols..Calcaric._250m', 'sg250m:TAXNWRB_Haplic.Cambisols..Chromic._250m', 'sg250m:TAXNWRB_Haplic.Cambisols..Dystric._250m', 'sg250m:TAXNWRB_Haplic.Cambisols..Eutric._250m', 'sg250m:TAXNWRB_Haplic.Cambisols..Humic._250m', 'sg250m:TAXNWRB_Haplic.Cambisols..Sodic._250m', 'sg250m:TAXNWRB_Haplic.Cambisols_250m', 'sg250m:TAXNWRB_Haplic.Chernozems_250m', 'sg250m:TAXNWRB_Haplic.Cryosols_250m', 'sg250m:TAXNWRB_Haplic.Ferralsols..Rhodic._250m', 'sg250m:TAXNWRB_Haplic.Ferralsols..Xanthic._250m', 'sg250m:TAXNWRB_Haplic.Ferralsols_250m', 'sg250m:TAXNWRB_Haplic.Fluvisols..Arenic._250m', 'sg250m:TAXNWRB_Haplic.Fluvisols..Calcaric._250m', 'sg250m:TAXNWRB_Haplic.Fluvisols..Dystric._250m', 'sg250m:TAXNWRB_Haplic.Fluvisols..Eutric._250m', 'sg250m:TAXNWRB_Haplic.Fluvisols_250m', 'sg250m:TAXNWRB_Haplic.Gleysols..Dystric._250m', 'sg250m:TAXNWRB_Haplic.Gleysols..Eutric._250m', 'sg250m:TAXNWRB_Haplic.Gleysols_250m', 'sg250m:TAXNWRB_Haplic.Gypsisols_250m', 'sg250m:TAXNWRB_Haplic.Kastanozems_250m', 'sg250m:TAXNWRB_Haplic.Leptosols..Eutric._250m', 'sg250m:TAXNWRB_Haplic.Leptosols_250m', 'sg250m:TAXNWRB_Haplic.Lixisols..Chromic._250m', 'sg250m:TAXNWRB_Haplic.Lixisols..Ferric._250m', 'sg250m:TAXNWRB_Haplic.Lixisols_250m', 'sg250m:TAXNWRB_Haplic.Luvisols..Chromic._250m', 'sg250m:TAXNWRB_Haplic.Luvisols..Ferric._250m', 'sg250m:TAXNWRB_Haplic.Luvisols_250m', 'sg250m:TAXNWRB_Haplic.Nitisols..Rhodic._250m', 'sg250m:TAXNWRB_Haplic.Phaeozems_250m', 'sg250m:TAXNWRB_Haplic.Planosols..Dystric._250m', 'sg250m:TAXNWRB_Haplic.Planosols..Eutric._250m', 'sg250m:TAXNWRB_Haplic.Podzols_250m', 'sg250m:TAXNWRB_Haplic.Regosols..Dystric._250m', 'sg250m:TAXNWRB_Haplic.Regosols..Eutric._250m', 'sg250m:TAXNWRB_Haplic.Regosols..Sodic._250m', 'sg250m:TAXNWRB_Haplic.Solonchaks..Sodic._250m', 'sg250m:TAXNWRB_Haplic.Solonchaks_250m', 'sg250m:TAXNWRB_Haplic.Solonetz_250m', 'sg250m:TAXNWRB_Haplic.Umbrisols_250m', 'sg250m:TAXNWRB_Haplic.Vertisols..Eutric._250m', 'sg250m:TAXNWRB_Haplic.Vertisols_250m', 'sg250m:TAXNWRB_Hemic.Histosols_250m', 'sg250m:TAXNWRB_Histic.Albeluvisols_250m', 'sg250m:TAXNWRB_Hypoluvic.Arenosols_250m', 'sg250m:TAXNWRB_Leptic.Cambisols_250m', 'sg250m:TAXNWRB_Leptic.Luvisols_250m', 'sg250m:TAXNWRB_Leptic.Phaeozems_250m', 'sg250m:TAXNWRB_Leptic.Regosols_250m', 'sg250m:TAXNWRB_Leptic.Umbrisols_250m', 'sg250m:TAXNWRB_Lithic.Leptosols_250m', 'sg250m:TAXNWRB_Lixic.Plinthosols_250m', 'sg250m:TAXNWRB_Luvic.Calcisols_250m', 'sg250m:TAXNWRB_Luvic.Chernozems_250m', 'sg250m:TAXNWRB_Luvic.Phaeozems_250m', 'sg250m:TAXNWRB_Luvic.Planosols_250m', 'sg250m:TAXNWRB_Luvic.Stagnosols_250m', 'sg250m:TAXNWRB_Mollic.Gleysols_250m', 'sg250m:TAXNWRB_Mollic.Leptosols_250m', 'sg250m:TAXNWRB_Mollic.Solonetz_250m', 'sg250m:TAXNWRB_Mollic.Vertisols_250m', 'sg250m:TAXNWRB_Petric.Calcisols_250m', 'sg250m:TAXNWRB_Petric.Durisols_250m', 'sg250m:TAXNWRB_Plinthic.Acrisols_250m', 'sg250m:TAXNWRB_Protic.Arenosols_250m', 'sg250m:TAXNWRB_Rendzic.Leptosols_250m', 'sg250m:TAXNWRB_Sapric.Histosols_250m', 'sg250m:TAXNWRB_Solodic.Planosols_250m', 'sg250m:TAXNWRB_Stagnic.Luvisols_250m', 'sg250m:TAXNWRB_Turbic.Cryosols_250m', 'sg250m:TAXNWRB_Umbric.Albeluvisols_250m', 'sg250m:TAXNWRB_Umbric.Ferralsols_250m', 'sg250m:TAXNWRB_Umbric.Gleysols_250m', 'sg250m:TAXNWRB_Vertic.Cambisols_250m', 'sg250m:TAXNWRB_Vertic.Luvisols_250m', 'sg250m:TAXNWRB_Vetic.Acrisols_250m', 'sg250m:TAXNWRB_Vitric.Andosols_250m', 'sg250m:TAXNWRB_Vitric.Cryosols_250m', 'sg250m:TAXOUSDA_250m', 'sg250m:TAXOUSDA_Albolls_250m', 'sg250m:TAXOUSDA_Aqualfs_250m', 'sg250m:TAXOUSDA_Aquands_250m', 'sg250m:TAXOUSDA_Aquents_250m', 'sg250m:TAXOUSDA_Aquepts_250m', 'sg250m:TAXOUSDA_Aquerts_250m', 'sg250m:TAXOUSDA_Aquods_250m', 'sg250m:TAXOUSDA_Aquolls_250m', 'sg250m:TAXOUSDA_Aquox_250m', 'sg250m:TAXOUSDA_Aquults_250m', 'sg250m:TAXOUSDA_Arents_250m', 'sg250m:TAXOUSDA_Argids_250m', 'sg250m:TAXOUSDA_Borolls_250m', 'sg250m:TAXOUSDA_Calcids_250m', 'sg250m:TAXOUSDA_Cambids_250m', 'sg250m:TAXOUSDA_Cryalfs_250m', 'sg250m:TAXOUSDA_Cryands_250m', 'sg250m:TAXOUSDA_Cryepts_250m', 'sg250m:TAXOUSDA_Cryids_250m', 'sg250m:TAXOUSDA_Cryods_250m', 'sg250m:TAXOUSDA_Cryolls_250m', 'sg250m:TAXOUSDA_Durids_250m', 'sg250m:TAXOUSDA_Fibrists_250m', 'sg250m:TAXOUSDA_Fluvents_250m', 'sg250m:TAXOUSDA_Folists_250m', 'sg250m:TAXOUSDA_Gelands_250m', 'sg250m:TAXOUSDA_Gelepts_250m', 'sg250m:TAXOUSDA_Gelods_250m', 'sg250m:TAXOUSDA_Gypsids_250m', 'sg250m:TAXOUSDA_Hemists_250m', 'sg250m:TAXOUSDA_Histels_250m', 'sg250m:TAXOUSDA_Humods_250m', 'sg250m:TAXOUSDA_Humults_250m', 'sg250m:TAXOUSDA_Ochrepts_250m', 'sg250m:TAXOUSDA_Orthels_250m', 'sg250m:TAXOUSDA_Orthents_250m', 'sg250m:TAXOUSDA_Orthods_250m', 'sg250m:TAXOUSDA_Perox_250m', 'sg250m:TAXOUSDA_Psamments_250m', 'sg250m:TAXOUSDA_Rendolls_250m', 'sg250m:TAXOUSDA_Salids_250m', 'sg250m:TAXOUSDA_Saprists_250m', 'sg250m:TAXOUSDA_Torrands_250m', 'sg250m:TAXOUSDA_Torrerts_250m', 'sg250m:TAXOUSDA_Torrox_250m', 'sg250m:TAXOUSDA_Turbels_250m', 'sg250m:TAXOUSDA_Udalfs_250m', 'sg250m:TAXOUSDA_Udands_250m', 'sg250m:TAXOUSDA_Udepts_250m', 'sg250m:TAXOUSDA_Uderts_250m', 'sg250m:TAXOUSDA_Udolls_250m', 'sg250m:TAXOUSDA_Udox_250m', 'sg250m:TAXOUSDA_Udults_250m', 'sg250m:TAXOUSDA_Ustalfs_250m', 'sg250m:TAXOUSDA_Ustands_250m', 'sg250m:TAXOUSDA_Ustepts_250m', 'sg250m:TAXOUSDA_Usterts_250m', 'sg250m:TAXOUSDA_Ustolls_250m', 'sg250m:TAXOUSDA_Ustox_250m', 'sg250m:TAXOUSDA_Ustults_250m', 'sg250m:TAXOUSDA_Vitrands_250m', 'sg250m:TAXOUSDA_Xeralfs_250m', 'sg250m:TAXOUSDA_Xerands_250m', 'sg250m:TAXOUSDA_Xerepts_250m', 'sg250m:TAXOUSDA_Xererts_250m', 'sg250m:TAXOUSDA_Xerolls_250m', 'sg250m:TAXOUSDA_Xerults_250m', 'sg250m:TEXMHT_M_sl1_250m', 'sg250m:TEXMHT_M_sl2_250m', 'sg250m:TEXMHT_M_sl3_250m', 'sg250m:TEXMHT_M_sl4_250m', 'sg250m:TEXMHT_M_sl5_250m', 'sg250m:TEXMHT_M_sl6_250m', 'sg250m:TEXMHT_M_sl7_250m', 'sg250m:WWP_M_sl1_250m', 'sg250m:WWP_M_sl2_250m', 'sg250m:WWP_M_sl3_250m', 'sg250m:WWP_M_sl4_250m', 'sg250m:WWP_M_sl5_250m', 'sg250m:WWP_M_sl6_250m', 'sg250m:WWP_M_sl7_250m']\n" - ] - } - ], - "source": [ - "names = [k for k in wcs.contents.keys() if k.startswith(\"sg250m\")]\n", - "print(names)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or to search for all the coverages regarding cation exchange capacity (CEC):" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['sg250m:CECSOL_M_sl1_250m', 'sg250m:CECSOL_M_sl2_250m', 'sg250m:CECSOL_M_sl3_250m', 'sg250m:CECSOL_M_sl4_250m', 'sg250m:CECSOL_M_sl5_250m', 'sg250m:CECSOL_M_sl6_250m', 'sg250m:CECSOL_M_sl7_250m']\n" - ] - } - ], - "source": [ - "cec_covs = [k for k in wcs.contents.keys() if k.find(\"CECSOL\") != -1]\n", - "print(cec_covs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "These are the SoilGrids predictions for CEC at the seven standard depths.\n", - "\n", - "The details for one of these coverages can be inspected using the identifiers above:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[urn:ogc:def:crs:EPSG::4326]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cec0cm = wcs.contents['sg250m:CECSOL_M_sl1_250m']\n", - "cec0cm.supportedCRS" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['ArcGrid', 'GeoTIFF', 'GIF', 'Gtopo30', 'ImageMosaic', 'JPEG', 'PNG', 'TIFF']" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cec0cm.supportedFormats" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A bounding box broadly matching Senegal:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "bbox = (-17.1, 12.65, -13.15, 14.95) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now fetch the coverage for Senegal:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "response = wcs.getCoverage(\n", - " identifier='sg250m:CECSOL_M_sl1_250m', \n", - " crs='urn:ogc:def:crs:EPSG::4326',\n", - " bbox=bbox, \n", - " resx=1, resy=1, \n", - " format='GeoTIFF')" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "with open('./data/Senegal_CEC0m.tif', 'wb') as file:\n", - " file.write(response.read())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the data on the client side some regular interaction can be started with a library like resterIO:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "ename": "RasterioIOError", - "evalue": "'./data/Senegal_CEC0m.tif' not recognized as a supported file format.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mCPLE_OpenFailedError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32mrasterio/_base.pyx\u001b[0m in \u001b[0;36mrasterio._base.DatasetBase.__init__\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mrasterio/_shim.pyx\u001b[0m in \u001b[0;36mrasterio._shim.open_dataset\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mrasterio/_err.pyx\u001b[0m in \u001b[0;36mrasterio._err.exc_wrap_pointer\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mCPLE_OpenFailedError\u001b[0m: './data/Senegal_CEC0m.tif' not recognized as a supported file format.", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mRasterioIOError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-14-3c4dada614d1>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mrasterio\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mCEC\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrasterio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./data/Senegal_CEC0m.tif\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"GTiff\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mCEC\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtitle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Cation Exchange Capacity at 0 metres in Senegal'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcmap\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'gist_ncar'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/lib/python3/dist-packages/rasterio/env.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m 428\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 429\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0menv_ctor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 430\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 431\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 432\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/lib/python3/dist-packages/rasterio/__init__.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(fp, mode, driver, width, height, count, crs, transform, dtype, nodata, sharing, **kwargs)\u001b[0m\n\u001b[1;32m 214\u001b[0m \u001b[0;31m# None.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 216\u001b[0;31m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDatasetReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdriver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msharing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msharing\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 217\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'r+'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_writer_for_path\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdriver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msharing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msharing\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32mrasterio/_base.pyx\u001b[0m in \u001b[0;36mrasterio._base.DatasetBase.__init__\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mRasterioIOError\u001b[0m: './data/Senegal_CEC0m.tif' not recognized as a supported file format." - ] - } - ], - "source": [ - "import rasterio\n", - "CEC = rasterio.open(\"./data/Senegal_CEC0m.tif\", driver=\"GTiff\")\n", - "show(CEC, title='Cation Exchange Capacity at 0 metres in Senegal', cmap='gist_ncar')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next steps:\n", - "https://publicwiki.deltares.nl/display/OET/WCS+primer\n", - "https://geoscripting-wur.github.io/PythonRaster/" - ] - } - ], - "metadata": { - "@webio": { - "lastCommId": "CDDA2476DA3848E283992C81E6F7DFAE", - "lastKernelId": "bc6b6543-4fef-4e17-972e-8a9f3ffe950d" - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/WCS_basics.ipynb b/WCS_basics.ipynb new file mode 100644 index 0000000..ed9be7d --- /dev/null +++ b/WCS_basics.ipynb @@ -0,0 +1,293 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First load the `WebCoverageService` class from the OWSLib and create a connection to a service:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "from owslib.wcs import WebCoverageService\n", + "wcs = WebCoverageService('http://maps.isric.org/mapserv?map=/map/bdod.map', version='1.0.0')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A bounding box broadly matching Senegal:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The absense of errors means that a connection was sucessfully established. To get more information about this service, start by identifying the operations available from this service:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['GetCapabilities', 'DescribeCoverage', 'GetCoverage']\n" + ] + } + ], + "source": [ + "print([op.name for op in wcs.operations])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The full list of coverages available from this service is in the `contents` property:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['bdod_15-30cm_Q0.95', 'bdod_0-5cm_mean', 'bdod_5-15cm_Q0.95', 'bdod_15-30cm_Q0.5', 'bdod_30-60cm_Q0.05', 'bdod_100-200cm_Q0.05', 'bdod_15-30cm_Q0.05', 'bdod_100-200cm_Q0.95', 'bdod_0-5cm_Q0.5', 'bdod_0-5cm_Q0.05', 'bdod_5-15cm_Q0.5', 'bdod_100-200cm_mean', 'bdod_60-100cm_Q0.95', 'bdod_5-15cm_Q0.05', 'bdod_30-60cm_mean', 'bdod_5-15cm_mean', 'bdod_100-200cm_Q0.5', 'bdod_30-60cm_Q0.95', 'bdod_15-30cm_mean', 'bdod_0-5cm_Q0.95', 'bdod_60-100cm_Q0.05', 'bdod_60-100cm_Q0.5', 'bdod_60-100cm_mean', 'bdod_30-60cm_Q0.5']\n" + ] + } + ], + "source": [ + "print(list(wcs.contents))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That is a large set of coverages, but it is easy to filter the dictionary. For instance, to get the name of all coverages for the 0 cm to 5 cm depth interval:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['bdod_0-5cm_mean', 'bdod_0-5cm_Q0.5', 'bdod_0-5cm_Q0.05', 'bdod_0-5cm_Q0.95']\n" + ] + } + ], + "source": [ + "names = [k for k in wcs.contents.keys() if k.startswith(\"bdod_0-5cm\")]\n", + "print(names)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or to search for all the coverages reporting the median prediction:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['bdod_15-30cm_Q0.5', 'bdod_0-5cm_Q0.5', 'bdod_5-15cm_Q0.5', 'bdod_100-200cm_Q0.5', 'bdod_60-100cm_Q0.5', 'bdod_30-60cm_Q0.5']\n" + ] + } + ], + "source": [ + "q0_5_covs = [k for k in wcs.contents.keys() if k.find(\"Q0.5\") != -1]\n", + "print(q0_5_covs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These are the SoilGrids predictions for bulk density for the six standard depths defined in the GlobalSoilMap specifications.\n", + "\n", + "The details for one of these coverages can be inspected using the identifiers above:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[urn:ogc:def:crs:EPSG::152160, urn:ogc:def:crs:EPSG::152160]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bdod_5_15_median = wcs.contents['bdod_5-15cm_Q0.5']\n", + "bdod_5_15_median.supportedCRS" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['GEOTIFF_16']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bdod_5_15_median.supportedFormats" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "bbox = (-17.1, 12.65, -13.15, 14.95) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now fetch the coverage for Senegal:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "response = wcs.getCoverage(\n", + " identifier='phh20_0-5cm_mean', \n", + " crs='urn:ogc:def:crs:EPSG::152160',\n", + " bbox=bbox, \n", + " resx=1, resy=1, \n", + " format='GeoTIFF')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "with open('./data/Senegal_CEC0m.tif', 'wb') as file:\n", + " file.write(response.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the data on the client side some regular interaction can be started with a library like resterIO:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "ename": "RasterioIOError", + "evalue": "'./data/Senegal_CEC0m.tif' not recognized as a supported file format.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mCPLE_OpenFailedError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32mrasterio/_base.pyx\u001b[0m in \u001b[0;36mrasterio._base.DatasetBase.__init__\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mrasterio/_shim.pyx\u001b[0m in \u001b[0;36mrasterio._shim.open_dataset\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mrasterio/_err.pyx\u001b[0m in \u001b[0;36mrasterio._err.exc_wrap_pointer\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mCPLE_OpenFailedError\u001b[0m: './data/Senegal_CEC0m.tif' not recognized as a supported file format.", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mRasterioIOError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-14-3c4dada614d1>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mrasterio\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mCEC\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrasterio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./data/Senegal_CEC0m.tif\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"GTiff\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mCEC\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtitle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Cation Exchange Capacity at 0 metres in Senegal'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcmap\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'gist_ncar'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3/dist-packages/rasterio/env.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m 428\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 429\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0menv_ctor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 430\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 431\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 432\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3/dist-packages/rasterio/__init__.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(fp, mode, driver, width, height, count, crs, transform, dtype, nodata, sharing, **kwargs)\u001b[0m\n\u001b[1;32m 214\u001b[0m \u001b[0;31m# None.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 216\u001b[0;31m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDatasetReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdriver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msharing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msharing\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 217\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'r+'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_writer_for_path\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdriver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msharing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msharing\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mrasterio/_base.pyx\u001b[0m in \u001b[0;36mrasterio._base.DatasetBase.__init__\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mRasterioIOError\u001b[0m: './data/Senegal_CEC0m.tif' not recognized as a supported file format." + ] + } + ], + "source": [ + "import rasterio\n", + "CEC = rasterio.open(\"./data/Senegal_CEC0m.tif\", driver=\"GTiff\")\n", + "show(CEC, title='Cation Exchange Capacity at 0 metres in Senegal', cmap='gist_ncar')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next steps:\n", + "https://publicwiki.deltares.nl/display/OET/WCS+primer\n", + "https://geoscripting-wur.github.io/PythonRaster/" + ] + } + ], + "metadata": { + "@webio": { + "lastCommId": "15E983DED5BA45E28DEE0958687E8D50", + "lastKernelId": "9ef91650-4d26-43d0-a331-f95652b81618" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} -- GitLab