+ ```bash
+ ogrinfo OAPIF:https://demo.pygeoapi.io/master/collections/obs obs -so
+ ```
+
+
Now, let's convert the observations into a shapefile
@@ -255,7 +263,7 @@ QGIS is one of the first GIS Desktop clients which added support for OGC API - F
!!! Note
- You can even use OGR to append new features to an OGC API - Features collection which supports transactions (pygeoapi transaction support is planned for future implementation)
+ You can even use OGR to append new features to an OGC API - Features collection which supports transactions. Read more [here](https://docs.pygeoapi.io/en/latest/transactions.html) about support for transactions in pygeoapi.
!!! tip "Use GDAL from the commandline with Docker"
@@ -312,6 +320,56 @@ QGIS is one of the first GIS Desktop clients which added support for OGC API - F
[OWSLib](https://owslib.readthedocs.io) is a Python library to interact with OGC Web Services and supports a number of OGC APIs including OGC API - Features.
+This exercise will be done using a jupyter notebook. If you prefer, you can do it using python from the command line (see bellow).
+
+Before continuing, make sure you are in the `workshop/exercises` folder. You will need that, to be able to use the jupyter notebook.
+
+=== "Linux/Mac"
+
+
+ ```bash
+ pwd
+ ```
+
+
+=== "Windows"
+
+
+ ```bash
+ cd
+ ```
+
+
+Then run a container to start a jupyter notebook, mounting the local folder:
+
+=== "Linux/Mac"
+
+
+ ```bash
+ docker run -p 8888:8888 -v $(pwd):/home/jovyan/work jupyter/base-notebook
+ ```
+
+
+=== "Windows"
+
+
+ ```bash
+ docker run -p 8888:8888 -v ${pwd}:/home/jovyan/work jupyter/base-notebook
+ ```
+
+
+Enter the url stated on the command line, `http://127.0.0.1:8888/lab` followed by a token. Enter the `work` folder and open the `features-owslib.ipynb`.
+
+![jupyter notebook](../assets/images/jupyter1.png)
+
+Run through the notebook, to explore an OGC API - Features server, using owslib.
+
+!!! note
+
+ You can run the same instructions using your local pygeoapi server, instead of the demo pygeoapi instance.
+
+#### Using python from the command line
+
!!! question "Interact with OGC API - Features via OWSLib"
If you do not have Python installed, consider running this exercise in a Docker container. See the [Setup Chapter](../setup.md#using-docker-for-python-clients).
diff --git a/workshop/exercises/features-owslib.ipynb b/workshop/exercises/features-owslib.ipynb
new file mode 100644
index 0000000..348ee1b
--- /dev/null
+++ b/workshop/exercises/features-owslib.ipynb
@@ -0,0 +1,474 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "1e8fc759-a2cb-4c9e-9884-6355c72b4dbb",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Collecting owslib\n",
+ " Downloading OWSLib-0.31.0-py2.py3-none-any.whl.metadata (6.7 kB)\n",
+ "Collecting lxml (from owslib)\n",
+ " Downloading lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (3.8 kB)\n",
+ "Requirement already satisfied: python-dateutil>=1.5 in /opt/conda/lib/python3.11/site-packages (from owslib) (2.8.2)\n",
+ "Requirement already satisfied: pytz in /opt/conda/lib/python3.11/site-packages (from owslib) (2023.3.post1)\n",
+ "Requirement already satisfied: pyyaml in /opt/conda/lib/python3.11/site-packages (from owslib) (6.0.1)\n",
+ "Requirement already satisfied: requests>=1.0 in /opt/conda/lib/python3.11/site-packages (from owslib) (2.31.0)\n",
+ "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.11/site-packages (from python-dateutil>=1.5->owslib) (1.16.0)\n",
+ "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.11/site-packages (from requests>=1.0->owslib) (3.3.0)\n",
+ "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.11/site-packages (from requests>=1.0->owslib) (3.4)\n",
+ "Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.11/site-packages (from requests>=1.0->owslib) (2.0.7)\n",
+ "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.11/site-packages (from requests>=1.0->owslib) (2023.7.22)\n",
+ "Downloading OWSLib-0.31.0-py2.py3-none-any.whl (233 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m233.1/233.1 kB\u001b[0m \u001b[31m4.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hDownloading lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl (5.0 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.0/5.0 MB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hInstalling collected packages: lxml, owslib\n",
+ "Successfully installed lxml-5.3.0 owslib-0.31.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install owslib"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "3f211694-bef8-4eb2-9d86-9029d3de9f54",
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from owslib.ogcapi.features import Features"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "8695ca2f-5a4d-42a5-9a2d-12cefb5a8dfc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "w = Features('https://demo.pygeoapi.io/master')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "7b600f06-06bc-4289-8435-24f92e398b10",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'https://demo.pygeoapi.io/master/'"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "w.url"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "41327b78-03ea-4976-b578-3e85cbe02f40",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "conformance = w.conformance()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "ca16ceed-6c14-4132-8dca-945f642544ae",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "api = w.api() # OpenAPI document"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "ad2bc865-b84d-44ac-88d9-7be45513394b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "collections = w.collections()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "7156ee4f-8743-466d-8181-2c2b6d49e2db",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "17"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(collections['collections'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "b8aeba52-296f-4fd3-acfe-cf67742c9840",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "feature_collections = w.feature_collections()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "797bd30a-c30a-4e1c-bd32-daa34e529aa6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "13"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(feature_collections)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "19e706bc-1b4e-4663-ae2c-6ac6eb4dd816",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "lakes = w.collection('lakes')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "3dc97850-989a-4381-b395-5247dad8a643",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'lakes'"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lakes['id']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "8e85d304-160c-4c23-8f91-33b21accb79d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'Large Lakes'"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lakes['title']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "be654238-32f5-456a-8968-eeb357e7556a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'lakes of the world, public domain'"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lakes['description']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "f742a28f-ef7f-4b53-bf04-87168160fab7",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "lakes_queryables = w.collection_queryables('lakes')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "d49cbbec-30f7-4d2a-8e56-c31498da2898",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "7"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(lakes_queryables['properties'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "e687bf9e-3d81-4520-b795-5c4c085907f4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "lakes_query = w.collection_items('lakes')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "f3dbaebe-79d6-4ed5-92ee-80585ee4685a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'id': 0,\n",
+ " 'scalerank': 0,\n",
+ " 'name': 'Lake Baikal',\n",
+ " 'name_alt': 'https://en.wikipedia.org/wiki/Lake_Baikal',\n",
+ " 'admin': None,\n",
+ " 'featureclass': 'Lake'}"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lakes_query['features'][0]['properties']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "523dd5c9-18c6-4ed5-90d6-2d4cb712e495",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Collecting geopandas\n",
+ " Downloading geopandas-1.0.1-py3-none-any.whl.metadata (2.2 kB)\n",
+ "Collecting matplotlib\n",
+ " Downloading matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)\n",
+ "Collecting numpy>=1.22 (from geopandas)\n",
+ " Downloading numpy-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (60 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m60.9/60.9 kB\u001b[0m \u001b[31m2.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[?25hCollecting pyogrio>=0.7.2 (from geopandas)\n",
+ " Downloading pyogrio-0.10.0-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (5.5 kB)\n",
+ "Requirement already satisfied: packaging in /opt/conda/lib/python3.11/site-packages (from geopandas) (23.2)\n",
+ "Collecting pandas>=1.4.0 (from geopandas)\n",
+ " Downloading pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (89 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m89.9/89.9 kB\u001b[0m \u001b[31m3.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[?25hCollecting pyproj>=3.3.0 (from geopandas)\n",
+ " Downloading pyproj-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (31 kB)\n",
+ "Collecting shapely>=2.0.0 (from geopandas)\n",
+ " Downloading shapely-2.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.0 kB)\n",
+ "Collecting contourpy>=1.0.1 (from matplotlib)\n",
+ " Downloading contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.4 kB)\n",
+ "Collecting cycler>=0.10 (from matplotlib)\n",
+ " Downloading cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB)\n",
+ "Collecting fonttools>=4.22.0 (from matplotlib)\n",
+ " Downloading fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (163 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m163.7/163.7 kB\u001b[0m \u001b[31m3.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hCollecting kiwisolver>=1.3.1 (from matplotlib)\n",
+ " Downloading kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.3 kB)\n",
+ "Collecting pillow>=8 (from matplotlib)\n",
+ " Downloading pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (9.1 kB)\n",
+ "Collecting pyparsing>=2.3.1 (from matplotlib)\n",
+ " Downloading pyparsing-3.2.0-py3-none-any.whl.metadata (5.0 kB)\n",
+ "Requirement already satisfied: python-dateutil>=2.7 in /opt/conda/lib/python3.11/site-packages (from matplotlib) (2.8.2)\n",
+ "Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.11/site-packages (from pandas>=1.4.0->geopandas) (2023.3.post1)\n",
+ "Collecting tzdata>=2022.7 (from pandas>=1.4.0->geopandas)\n",
+ " Downloading tzdata-2024.2-py2.py3-none-any.whl.metadata (1.4 kB)\n",
+ "Requirement already satisfied: certifi in /opt/conda/lib/python3.11/site-packages (from pyogrio>=0.7.2->geopandas) (2023.7.22)\n",
+ "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n",
+ "Downloading geopandas-1.0.1-py3-none-any.whl (323 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m323.6/323.6 kB\u001b[0m \u001b[31m4.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hDownloading matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.3 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.3/8.3 MB\u001b[0m \u001b[31m5.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hDownloading contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (323 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m323.2/323.2 kB\u001b[0m \u001b[31m6.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hDownloading cycler-0.12.1-py3-none-any.whl (8.3 kB)\n",
+ "Downloading fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.9 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m4.9/4.9 MB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hDownloading kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.4/1.4 MB\u001b[0m \u001b[31m7.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n",
+ "\u001b[?25hDownloading numpy-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.3 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m16.3/16.3 MB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hDownloading pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.1 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.1/13.1 MB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hDownloading pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl (4.4 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m4.4/4.4 MB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hDownloading pyogrio-0.10.0-cp311-cp311-manylinux_2_28_x86_64.whl (24.1 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m24.1/24.1 MB\u001b[0m \u001b[31m3.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hDownloading pyparsing-3.2.0-py3-none-any.whl (106 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m106.9/106.9 kB\u001b[0m \u001b[31m2.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hDownloading pyproj-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.5 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.5/9.5 MB\u001b[0m \u001b[31m6.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hDownloading shapely-2.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.5/2.5 MB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n",
+ "\u001b[?25hDownloading tzdata-2024.2-py2.py3-none-any.whl (346 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m346.6/346.6 kB\u001b[0m \u001b[31m7.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hInstalling collected packages: tzdata, pyproj, pyparsing, pillow, numpy, kiwisolver, fonttools, cycler, shapely, pyogrio, pandas, contourpy, matplotlib, geopandas\n",
+ "Successfully installed contourpy-1.3.0 cycler-0.12.1 fonttools-4.54.1 geopandas-1.0.1 kiwisolver-1.4.7 matplotlib-3.9.2 numpy-2.1.2 pandas-2.2.3 pillow-11.0.0 pyogrio-0.10.0 pyparsing-3.2.0 pyproj-3.7.0 shapely-2.0.6 tzdata-2024.2\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install geopandas matplotlib"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "dfec0969-8a6a-4093-9ffe-f19b28d5ce63",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "570f937f-cef3-4e4f-a25a-dd72c7df1670",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import geopandas as gpd\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "7c4de3dc-19c3-4fa7-889e-8f3619c1f038",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "plt.rcParams['figure.figsize'] = (20, 10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "52551b37-0841-4055-88eb-642e949a978c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_lakes = gpd.read_file(\"https://demo.pygeoapi.io/master/collections/lakes/items\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "72db9e92-968d-4fd1-a458-f823506455f6",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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374ZN25cnnrqqUqPBQAAAGyAadOSAw7YuM+8973JfvuVb9MMANBVVTSQvPrqq3n3u9+dXr165fbbb8/vf//7fO1rX8s222zTts+ll16aq666Ktddd11mz56drbfeOuPHj8/y5csrORoAAACwAQYOTGbOTA4+eMM/89WvJr/6VfluBQAAXVVFn0Fyzjnn5IEHHsj999+/zu2lUinDhg3LmWeemc9//vNJkubm5tTX12fGjBk57rjj3vR7eAYJAAAAVN7f/pYce2zy3/+9Zt0uu5SvFFm+vLz9b38rv77ppmT33as3KwBQbF3iIe2jRo3K+PHj8/zzz+fee+/N2972tnzmM5/JJz/5ySTJM888k1122SW//vWvs++++7Z97uCDD86+++6br3/962sds7W1Na2trW3vW1paMnz4cIEEAAAAKmzFimTAgHIISZJ77y3fTgsAoCvZ0EBS0VtsPfPMM/nmN7+Z3XbbLXfeeWdOO+20fPazn82NN96YJGlsbEyS1NfXt/tcfX1927Z/NH369NTV1bUtw4cPr+SPAAAAAPw/vXsn73pX8s53JiefLI4AAJu3npU8+OrVq7P//vvnK1/5SpLkne98Zx5//PFcd911mThx4iYdc9q0aZk6dWrb+9evIAEAAAAq7557qj0BAEDHqOgVJEOHDs2oUaPardtzzz0zf/78JMmQIUOSJE1NTe32aWpqatv2j/r06ZPa2tp2CwAAAAAAwMaoaCB597vfnXnz5rVb98c//jE77rhjkmTEiBEZMmRIZs6c2ba9paUls2fPTkNDQyVHAwAAAAAACqyit9g644wzcuCBB+YrX/lK/uVf/iUPP/xwrr/++lx//fVJkpqamkyZMiVf+tKXsttuu2XEiBE577zzMmzYsBx99NGVHA0AAAAAACiwigaSAw44ILfcckumTZuWiy++OCNGjMiVV16Z448/vm2fs846K8uWLcupp56axYsX56CDDsodd9yRLbfcspKjAQAAAAAABVZTKpVK1R7irWhpaUldXV2am5s9jwQAAAAAAApuQ7tBRZ9BAgAAAAAA0BUJJAAAAAAAQOEIJAAAAAAAQOEIJAAAAAAAQOEIJAAAAAAAQOEIJAAAAAAAQOEIJAAAAAAAQOEIJAAAAAAAQOEIJAAAAAAAQOEIJAAAAAAAQOEIJAAAAAAAQOEIJAAAAAAAQOEI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a5ObbkpeeKE6MyxbVn7w+zbbJPX11ZkBAAAAAOg8AglQNStXJv/+78nFFyfLl1d7mrLx45OammpPAQAAAABUmmeQAFUxe3YyenTyb//21uLIqFHJ5ZcnAwd2zFxnn10ONp5JAgAAAADdm0ACdKq//jX53OeShobkd7/btGNssUVyzDHlB6w//njy2mvJK6903IwXXJB89asddzwAAAAAoOtxiy2g0zz6aHLCCcm8eZv2+bq65NOfTiZNSoYPL6975ZXkK1/puBlfN3Zsxx8TAAAAAOg6BBKg4l57LbnkkuSii8qvN9YOOyRnnJGcckrSv3/7bT/7WfkB6x1pt92Sgw/u2GMCAAAAAF1LTam0ed9pv6WlJXV1dWlubk5tbW21xwHW4V/+Jbn55mTYsOSgg9YsAwaUb7d1223r/ty7312+WuTDH056vkHOXbYsmTWrfMut665LXn31rc07YEBy3HHlud/73vItvQAAAICNVyoljzyStLQkW26Z9O1b/vr3r/v1S3r3rvakQHeyod1AIAEq7n/+J9l992THHZOamvbbSqXyVSCTJycvvJDstFPy8Y8nJ56Y7Lrrxn+vF19Mzjkn+e531729Z8/y7bN22y0ZOrQcbV7/utVWyaGHJi+/XN53+PDy7cD69t34OQAAAKDoHnggOffc5J571qzr2zf529/a71dTk4wYkYwc2X4ZMSLp0SNZvbq89OmT1NeXP7N8efK//1t+NukTTyTz5yfHH5/867++8R9ZAsUgkACblebm8kPbDzyw/MvPW/XAA8lpp5WPucMOyRFHJO9/fzmAvNGp4sc/Ll89kiTf/375mSkAAADAhpszJznvvOT229feduqp5WeM3nhj8tJL5fCxMY48MjnrrOQ3v0k++9n22y67LDnzzLX/OBMoHoEEKLzXXkueeaZ8tciG/nJUKiXPP588/XT5OSQdEWsAAACgKM48M7n88vbrjj02Ofzw8t0l9t472Wab8vrVq5PFi8uhZF3Liy8mTU3JokXlr01NycqV5c9usUWyalX59fbbl7/nhz/caT8m0MUJJAAAAABAp1m2LBkyJFm6dM26fv2Sv/zlje/msKFKpXJQeT2WlErJXnslgwa99WMD3cuGdgN35AMAAAAANtlLLyU775wsWdJ+/c47J5MmdUwcScp3h9hmm/IycmTHHBMoNoEEAAAAANhk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KByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKJyKBpJvfvOb2XvvvVNbW5va2to0NDTk9ttvb9u+fPnyTJo0KYMGDUq/fv0yYcKENDU1VXIkAAAAAACAygaS7bffPpdccknmzJmTRx99NIceemg+9KEP5YknnkiSnHHGGbntttty88035957783ChQtzzDHHVHIkAAAAAACA1JRKpVJnfsOBAwfmsssuy7HHHpvBgwfnpptuyrHHHpskefLJJ7Pnnntm1qxZGTt27AYdr6WlJXV1dWlubk5tbW0lRwcAAAAAALq4De0GnfYMklWrVuVHP/pRli1bloaGhsyZMycrV67MuHHj2vYZOXJkdthhh8yaNWu9x2ltbU1LS0u7BQAAAAAAYGNUPJD87ne/S79+/dKnT598+tOfzi233JJRo0alsbExvXv3zoABA9rtX19fn8bGxvUeb/r06amrq2tbhg8fXuGfAAAAAAAA6G4qHkj22GOPzJ07N7Nnz85pp52WiRMn5ve///0mH2/atGlpbm5uWxYsWNCB0wIAAAAAAEXQs9LfoHfv3tl1112TJKNHj84jjzySr3/96/nIRz6SFStW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5tJLL01jY2POPffcTJo0SQABAAAAAAAqqqZUKpUqceCTTjopN95441rr77777rzvfe9Lkjz33HM57bTTcs8992TrrbfOxIkTc8kll6Rnzw3vNi0tLamrq0tzc3Nqa2s7anwAAAAAAGAztKHdoGKBpLMIJAAAAAAAwOs2tBv06MSZAAAAAAAAugSBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKByBBAAAAAAAKJye1R7grSqVSkmSlpaWKk8CAAAAAABU2+u94PV+sD6bfSBZsmRJkmT48OFVngQAAAAAAOgqlixZkrq6uvVurym9WULp4lavXp2FCxemf//+qampqfY40KFaWloyfPjwLFiwILW1tdUeB2CTOZ8B3YlzGtCdOKcB3YXzGX+vVCplyZIlGTZsWHr0WP+TRjb7K0h69OiR7bffvtpjQEXV1tY6sQPdgvMZ0J04pwHdiXMa0F04n/G6N7py5HUe0g4AAAAAABSOQAIAAAAAABSOQAJdWJ8+fXLBBRekT58+1R4F4C1xPgO6E+c0oDtxTgO6C+czNsVm/5B2AAAAAACAjeUKEgAAAAAAoHAEEgAAAAAAoHAEEgAAAAAAoHAEEgAAAAAAoHAEEugCvvzlL+fAAw/MVlttlQEDBqxzn/nz5+fII4/MVlttle222y5f+MIX8tprr7Xb55577sl+++2XPn36ZNddd82MGTMqPzzAm9hpp51SU1PTbrnkkkva7fPb3/4273nPe7Lllltm+PDhufTSS6s0LcCbu+aaa7LTTjtlyy23zJgxY/Lwww9XeySAN3ThhReu9fvYyJEj27YvX748kyZNyqBBg9KvX79MmDAhTU1NVZwYYI377rsvRx11VIYNG5aamprceuut7baXSqWcf/75GTp0aPr27Ztx48blqaeearfPK6+8kuOPPz61tbUZMGBATjnllCxdurQTfwq6KoEEuoAVK1bkwx/+cE477bR1bl+1alWOPPLIrFixIg8++GBuvPHGzJgxI+eff37bPs8++2yOPPLIHHLIIZk7d26mTJmST3ziE7nzzjs768cAWK+LL744L7zwQtsyefLktm0tLS05/PDDs+OOO2bOnDm57LLLcuGFF+b666+v4sQA6/bjH/84U6dOzQUXXJDHHnss++yzT8aPH59FixZVezSAN/T2t7+93e9jv/rVr9q2nXHGGbntttty88035957783ChQtzzDHHVHFagDWWLVuWffbZJ9dcc806t1966aW56qqrct1112X27NnZeuutM378+Cxfvrxtn+OPPz5PPPFE7rrrrvz85z/Pfffdl1NPPbWzfgS6sJpSqVSq9hBA2YwZMzJlypQsXry43frbb789H/zgB7Nw4cLU19cnSa677rqcffbZefHFF9O7d++cffbZ+cUvfpHHH3+87XPHHXdcFi9enDvuuKMzfwyAdnbaaadMmTIlU6ZMWef2b37zm/niF7+YxsbG9O7dO0lyzjnn5NZbb82TTz7ZiZMCvLkxY8bkgAMOyNVXX50kWb16dYYPH57JkyfnnHPOqfJ0AOt24YUX5tZbb83cuXPX2tbc3JzBgwfnpptuyrHHHpskefLJJ7Pnnntm1qxZGTt2bCdPC7B+NTU1ueWWW3L00UcnKV89MmzYsJx55pn5/Oc/n6R8Xquvr8+MGTNy3HHH5Q9/+ENGjRqVRx55JPvvv3+S5I477sgHPvCBPP/88xk2bFi1fhy6AFeQwGZg1qxZ2WuvvdriSJKMHz8+LS0teeKJJ9r2GTduXLvPjR8/PrNmzerUWQHW5ZJLLsmgQYPyzne+M5dddlm7WwTOmjUr733ve9viSFI+f82bNy+vvvpqNcYFWKcVK1Zkzpw57X7n6tGjR8aNG+d3LqDLe+qppzJs2LDsvPPOOf744zN//vwkyZw5c7Jy5cp257aRI0dmhx12cG4Durxnn302jY2N7c5hdXV1GTNmTNs5bNasWRkwYEBbHEmScePGpUePHpk9e3anz0zX0rPaAwBvrrGxsV0cSdL2vrGx8Q33aWlpyd/+9rf07du3c4YF+Aef/exns99++2XgwIF58MEHM23atLzwwgu5/PLLk5TPXyNGjGj3mb8/x22zzTadPjPAurz00ktZtWrVOn/ncsUb0JWNGTMmM2bMyB577JEXXnghF110Ud7znvfk8ccfb7uK9x+fh1lfX9/2702Arur189S6fj/7+/8z22677dpt79mzZwYOHOg8h0AClXLOOefkq1/96hvu84c//KHdg/EANhcbc46bOnVq27q99947vXv3zqc+9alMnz49ffr0qfSoAACFd8QRR7S93nvvvTNmzJjsuOOO+clPfuKP6QAoNIEEKuTMM8/MSSed9Ib77Lzzzht0rCFDhuThhx9ut66pqalt2+tfX1/39/vU1tb6hRfocG/lHDdmzJi89tpr+fOf/5w99thjveevZM05DqAr2HbbbbPFFlus85zlfAVsTgYMGJDdd989Tz/9dA477LCsWLEiixcvbncViXMbsDl4/TzV1NSUoUOHtq1vamrKvvvu27bPokWL2n3utddeyyuvvOI8h0AClTJ48OAMHjy4Q47V0NCQL3/5y1m0aFHbJYF33XVXamtrM2rUqLZ9/vu//7vd5+666640NDR0yAwAf++tnOPmzp2bHj16tJ3PGhoa8sUvfjErV65Mr169kpTPX3vssYfbawFdSu/evTN69OjMnDmz7cGgq1evzsyZM3P66adXdziAjbB06dL86U9/yoknnpjRo0enV69emTlzZiZMmJAkmTdvXubPn+/fk0CXN2LEiAwZMiQzZ85sCyItLS2ZPXt2TjvttCTlf3MuXrw4c+bMyejRo5Mkv/zlL7N69eqMGTOmWqPTRQgk0AXMnz8/r7zySubPn59Vq1Zl7ty5SZJdd901/fr1y+GHH55Ro0blxBNPzKWXXprGxsace+65mTRpUtvtaT796U/n6quvzllnnZV//dd/zS9/+cv85Cc/yS9+8Ysq/mRA0c2aNSuzZ8/OIYcckv79+2fWrFk544wzcsIJJ7TFj4997GO56KKLcsopp+Tss8/O448/nq9//eu54oorqjw9wNqmTp2aiRMnZv/998+73vWuXHnllVm2bFlOPvnkao8GsF6f//znc9RRR2XHHXfMwoULc8EFF2SLLbbIRz/60dTV1eWUU07J1KlTM3DgwNTW1mby5MlpaGjI2LFjqz06QJYuXZqnn3667f2zzz6buXPnZuDAgdlhhx0yZcqUfOlLX8puu+2WESNG5LzzzsuwYcPa/qBlzz33zPvf//588pOfzHXXXZeVK1fm9NNPz3HHHZdhw4ZV6aeiq6gplUqlag8BRXfSSSflxhtvXGv93Xffnfe9731Jkueeey6nnXZa7rnnnmy99daZOHFiLrnkkvTsuaZz3nPPPTnjjDPy+9//Pttvv33OO++8N70FDkAlPfbYY/nMZz6TJ598Mq2trRkxYkROPPHETJ06td3zR377299m0qRJeeSRR7Lttttm8uTJOfvss6s4OcD6XX311bnsssvS2NiYfffdN1dddZW/PgS6tOOOOy733XdfXn755QwePDgHHXRQvvzlL2eXXXZJkixfvjxnnnlmfvjDH6a1tTXjx4/Ptdde69YzQJdwzz335JBDDllr/cSJEzNjxoyUSqVccMEFuf7667N48eIcdNBBufbaa7P77ru37fvKK6/k9NNPz2233ZYePXpkwoQJueqqq9KvX7/O/FHoggQSAAAAAACgcHpUewAAAAAAAIDOJpAAAAAAAACFI5AAAAAAAACFI5AAAAAAAACFI5AAAAAAAACFI5AAAAAAAACFI5AAAAAAAACFI5AAAAAAAACFI5AAAAAAAACFI5AAAAAAAACFI5AAAAAAAACFI5AAAAAAAACF8/8DpUzi/Sg1oJQAAAAASUVORK5CYII=",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "ax = df_lakes.plot(color='blue')"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "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.11.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/workshop/exercises/pygeoapi.config.yml b/workshop/exercises/pygeoapi.config.yml
index 5bcee3f..7cd1a0e 100644
--- a/workshop/exercises/pygeoapi.config.yml
+++ b/workshop/exercises/pygeoapi.config.yml
@@ -230,7 +230,7 @@ resources:
# cp-tartu:
# type: collection
# title: Tartu Cadastral Parcels
-# description: Cadasral parcels in downtown Tartu
+# description: Cadastral parcels in downtown Tartu
# keywords:
# - Cadastral parcels
# - Tartu