{ "cells": [ { "cell_type": "markdown", "id": "7a130dc8", "metadata": {}, "source": [ "# How well does the Robertson Soil Behavior Type based on CPTs describe our Flemish peat samples?\n", "\n", "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/DOV-Vlaanderen/pydov/master?filepath=docs%2Fworkshop%2Fpeat-samples-cpt-robertson.ipynb)" ] }, { "cell_type": "markdown", "id": "26762368", "metadata": {}, "source": [ "A practical example to query the DOV database using pydov to validate the Robertson Soil Behavior Type against observed data using samples, observations, boreholes and CPT measurements.\n", "\n", "First, we retrieve all observations where a high content (at least 50%) of organic matter was measured. We also retrieve the depth below ground surface. Subsequently, we retrieve the borehole data via the corresponding sample, specifically the start level in mTAW. This allows us to determine the absolute depth (mTAW) of the sample.\n", "\n", "Next, we perform a geographical search to find CPT measurements that are located near (within 5 meters) these peat samples. This allows us to efficiently retrieve the nearest CPT measurement for each of the samples. We also recalculate the CPT data to absolute elevation values in meter TAW, so that we can retain only the portion that corresponds planimetrically and altimetrically with the peat sample for further calculations.\n", "\n", "Subsequently, the Robertson Soil Behavior Type analysis is performed for each sample (observation) based on the available CPT measurement data. Finally, the results are displayed in charts." ] }, { "cell_type": "markdown", "id": "04aa0d1f", "metadata": {}, "source": [ "### Imports\n", "\n", "First we import the required classes and libraries:" ] }, { "cell_type": "code", "execution_count": 1, "id": "a843910e", "metadata": {}, "outputs": [], "source": [ "from pydov.search.observatie import ObservatieSearch\n", "from pydov.search.monster import MonsterSearch\n", "from pydov.search.sondering import SonderingSearch\n", "from pydov.search.boring import BoringSearch\n", "\n", "from pydov.types.observatie import Observatie\n", "from pydov.types.sondering import Sondering\n", "\n", "from pydov.search.fields import GeometryReturnField\n", "\n", "from pydov.util.location import WithinDistance, GeopandasFilter\n", "from pydov.util.query import Join\n", "\n", "from owslib.fes2 import PropertyIsEqualTo\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import geopandas as gpd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "8e5703dd", "metadata": {}, "source": [ "### Search objects\n", "\n", "Next we create a search object for each dataset we need. These search objects can then be used to query each of the datasets." ] }, { "cell_type": "code", "execution_count": 2, "id": "195c03cb", "metadata": {}, "outputs": [], "source": [ "observatie_search = ObservatieSearch()\n", "monster_search = MonsterSearch()\n", "sondering_search = SonderingSearch()\n", "boring_search = BoringSearch()" ] }, { "cell_type": "markdown", "id": "dd872d29", "metadata": {}, "source": [ "We don't need all fields from all datasets: here we define which fields we want to retrieve for each dataset.\n", "\n", "For the observations and CPT measurements we need the geometry in addition to the standard fields, to be able to perform the spatial join later.\n", "\n", "We retrieve the CPT measurements in two phases: first only the permanent key and the geometry (needed for the spatial join), and only later the complete CPT data." ] }, { "cell_type": "markdown", "id": "f38f9b3c", "metadata": {}, "source": [ "### Retrieve data\n", "\n", "#### Peat observations" ] }, { "cell_type": "markdown", "id": "e861ce03", "metadata": {}, "source": [ "For the observations we also need the geometry in addition to the standard fields, which we add here:" ] }, { "cell_type": "code", "execution_count": 3, "id": "8b33e2a4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['pkey_observatie',\n", " 'pkey_parent',\n", " 'fenomeentijd',\n", " 'diepte_van_m',\n", " 'diepte_tot_m',\n", " 'parametergroep',\n", " 'parameter',\n", " 'detectieconditie',\n", " 'resultaat',\n", " 'eenheid',\n", " 'methode',\n", " 'uitvoerder',\n", " 'herkomst',\n", " ]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "observatie_fields = Observatie.get_field_names()\n", "observatie_fields.extend([GeometryReturnField(f.name, 31370) for f in observatie_search.get_fields(type='geometry').values()])\n", "\n", "observatie_fields" ] }, { "cell_type": "markdown", "id": "935c392b", "metadata": {}, "source": [ "Now we can start retrieving the required data. First we retrieve the observations for the parameter 'Gehalte Organische stoffen' (Organic matter content). The result is a percentage and we convert it to numbers (float), to retain only those with a percentage of at least 50 percent.\n", "\n", "We also add a column with the `pkey_monster` to which the observations are linked. When observations are linked to objects other than samples, this column will remain empty." ] }, { "cell_type": "code", "execution_count": 4, "id": "8316ca22", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/002] ..\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_observatiepkey_parentfenomeentijddiepte_van_mdiepte_tot_mparametergroepparameterdetectieconditieresultaateenheidmethodeuitvoerderherkomstgeompkey_monster
59https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2023-06-265.755.97Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN88.1%Chemische reactie met waterstofperoxideNaNLABOPOINT (150277.4 211260.94)https://www.dov.vlaanderen.be/data/monster/202...
90https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2023-10-047.507.90Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN62.6%Chemische reactie met waterstofperoxideVO - Afdeling GeotechniekLABOPOINT (143476.04 161514.62)https://www.dov.vlaanderen.be/data/monster/202...
99https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2023-10-046.707.00Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN60.7%Chemische reactie met waterstofperoxideVO - Afdeling GeotechniekLABOPOINT (143476.04 161514.62)https://www.dov.vlaanderen.be/data/monster/202...
102https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2017-04-057.508.00Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN75.8%Chemische reactie met waterstofperoxideGMALABOPOINT (148857.03 212851.95)https://www.dov.vlaanderen.be/data/monster/201...
103https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2017-04-058.108.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN83.8%Chemische reactie met waterstofperoxideGMALABOPOINT (148857.03 212851.95)https://www.dov.vlaanderen.be/data/monster/201...
................................................
13429https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2002-12-027.007.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN70.8%Chemische reactie met waterstofperoxideVO - Afdeling GeotechniekLABOPOINT (116790.49 189146.29)https://www.dov.vlaanderen.be/data/monster/201...
13542https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...1967-03-213.003.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN59.8%Chemische reactie met waterstofperoxideRijksinstituut voor GrondmechanicaLABOPOINT (153802 176597)https://www.dov.vlaanderen.be/data/monster/201...
13589https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2006-07-068.508.96Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN62.0%Chemische reactie met waterstofperoxideKatholieke Universiteit Leuven (KUL)LABOPOINT (141229.95 225203.22)https://www.dov.vlaanderen.be/data/monster/201...
13751https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2007-04-174.504.98Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN54.8%Chemische reactie met waterstofperoxideVO - Afdeling GeotechniekLABOPOINT (119536.32 189184.38)https://www.dov.vlaanderen.be/data/monster/201...
13758https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2001-08-284.805.20Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN79.6%Chemische reactie met waterstofperoxideVO - Afdeling GeotechniekLABOPOINT (126518.8 189455)https://www.dov.vlaanderen.be/data/monster/201...
\n", "

306 rows × 15 columns

\n", "
" ], "text/plain": [ " pkey_observatie \\\n", "59 https://www.dov.vlaanderen.be/data/observatie/... \n", "90 https://www.dov.vlaanderen.be/data/observatie/... \n", "99 https://www.dov.vlaanderen.be/data/observatie/... \n", "102 https://www.dov.vlaanderen.be/data/observatie/... \n", "103 https://www.dov.vlaanderen.be/data/observatie/... \n", "... ... \n", "13429 https://www.dov.vlaanderen.be/data/observatie/... \n", "13542 https://www.dov.vlaanderen.be/data/observatie/... \n", "13589 https://www.dov.vlaanderen.be/data/observatie/... \n", "13751 https://www.dov.vlaanderen.be/data/observatie/... \n", "13758 https://www.dov.vlaanderen.be/data/observatie/... \n", "\n", " pkey_parent fenomeentijd \\\n", "59 https://www.dov.vlaanderen.be/data/monster/202... 2023-06-26 \n", "90 https://www.dov.vlaanderen.be/data/monster/202... 2023-10-04 \n", "99 https://www.dov.vlaanderen.be/data/monster/202... 2023-10-04 \n", "102 https://www.dov.vlaanderen.be/data/monster/201... 2017-04-05 \n", "103 https://www.dov.vlaanderen.be/data/monster/201... 2017-04-05 \n", "... ... ... \n", "13429 https://www.dov.vlaanderen.be/data/monster/201... 2002-12-02 \n", "13542 https://www.dov.vlaanderen.be/data/monster/201... 1967-03-21 \n", "13589 https://www.dov.vlaanderen.be/data/monster/201... 2006-07-06 \n", "13751 https://www.dov.vlaanderen.be/data/monster/201... 2007-04-17 \n", "13758 https://www.dov.vlaanderen.be/data/monster/201... 2001-08-28 \n", "\n", " diepte_van_m diepte_tot_m parametergroep \\\n", "59 5.75 5.97 Onderkenning - proeven \n", "90 7.50 7.90 Onderkenning - proeven \n", "99 6.70 7.00 Onderkenning - proeven \n", "102 7.50 8.00 Onderkenning - proeven \n", "103 8.10 8.50 Onderkenning - proeven \n", "... ... ... ... \n", "13429 7.00 7.50 Onderkenning - proeven \n", "13542 3.00 3.50 Onderkenning - proeven \n", "13589 8.50 8.96 Onderkenning - proeven \n", "13751 4.50 4.98 Onderkenning - proeven \n", "13758 4.80 5.20 Onderkenning - proeven \n", "\n", " parameter detectieconditie \\\n", "59 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "90 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "99 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "102 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "103 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "... ... ... \n", "13429 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "13542 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "13589 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "13751 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "13758 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "\n", " resultaat eenheid methode \\\n", "59 88.1 % Chemische reactie met waterstofperoxide \n", "90 62.6 % Chemische reactie met waterstofperoxide \n", "99 60.7 % Chemische reactie met waterstofperoxide \n", "102 75.8 % Chemische reactie met waterstofperoxide \n", "103 83.8 % Chemische reactie met waterstofperoxide \n", "... ... ... ... \n", "13429 70.8 % Chemische reactie met waterstofperoxide \n", "13542 59.8 % Chemische reactie met waterstofperoxide \n", "13589 62.0 % Chemische reactie met waterstofperoxide \n", "13751 54.8 % Chemische reactie met waterstofperoxide \n", "13758 79.6 % Chemische reactie met waterstofperoxide \n", "\n", " uitvoerder herkomst \\\n", "59 NaN LABO \n", "90 VO - Afdeling Geotechniek LABO \n", "99 VO - Afdeling Geotechniek LABO \n", "102 GMA LABO \n", "103 GMA LABO \n", "... ... ... \n", "13429 VO - Afdeling Geotechniek LABO \n", "13542 Rijksinstituut voor Grondmechanica LABO \n", "13589 Katholieke Universiteit Leuven (KUL) LABO \n", "13751 VO - Afdeling Geotechniek LABO \n", "13758 VO - Afdeling Geotechniek LABO \n", "\n", " geom \\\n", "59 POINT (150277.4 211260.94) \n", "90 POINT (143476.04 161514.62) \n", "99 POINT (143476.04 161514.62) \n", "102 POINT (148857.03 212851.95) \n", "103 POINT (148857.03 212851.95) \n", "... ... \n", "13429 POINT (116790.49 189146.29) \n", "13542 POINT (153802 176597) \n", "13589 POINT (141229.95 225203.22) \n", "13751 POINT (119536.32 189184.38) \n", "13758 POINT (126518.8 189455) \n", "\n", " pkey_monster \n", "59 https://www.dov.vlaanderen.be/data/monster/202... \n", "90 https://www.dov.vlaanderen.be/data/monster/202... \n", "99 https://www.dov.vlaanderen.be/data/monster/202... \n", "102 https://www.dov.vlaanderen.be/data/monster/201... \n", "103 https://www.dov.vlaanderen.be/data/monster/201... \n", "... ... \n", "13429 https://www.dov.vlaanderen.be/data/monster/201... \n", "13542 https://www.dov.vlaanderen.be/data/monster/201... \n", "13589 https://www.dov.vlaanderen.be/data/monster/201... \n", "13751 https://www.dov.vlaanderen.be/data/monster/201... \n", "13758 https://www.dov.vlaanderen.be/data/monster/201... \n", "\n", "[306 rows x 15 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_observaties = observatie_search.search(\n", " query= PropertyIsEqualTo('parameter', 'Gehalte Organische stoffen (Gehalte Organische stoffen)'),\n", " return_fields=observatie_fields\n", ")\n", "df_observaties['resultaat'] = df_observaties['resultaat'].astype(float)\n", "df_observaties = df_observaties[df_observaties['resultaat'] >= 50]\n", "df_observaties['pkey_monster'] = df_observaties['pkey_parent'].apply(lambda x: x if 'monster' in x else np.nan)\n", "\n", "df_observaties" ] }, { "cell_type": "markdown", "id": "dc57d382", "metadata": {}, "source": [ "We already have the (relative) depth available for these observations, but to convert this to absolute elevations we also need the start level (ground surface). This can be found via the sample and the borehole.\n", "\n", "First we retrieve the samples to which these observations are linked and add a column with the `pkey_boring`. For samples linked to multiple boreholes, the first one is retained; for samples linked to other objects, this column remains empty." ] }, { "cell_type": "code", "execution_count": 5, "id": "573f3d8e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/001] .\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_monsterpkey_parentspkey_boring
0https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2001...
1https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2000...
2https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2001...
3https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2001...
4https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2001...
............
301https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2005...
302https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2008...
303https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2008...
304https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2008...
305https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2008...
\n", "

306 rows × 3 columns

\n", "
" ], "text/plain": [ " pkey_monster \\\n", "0 https://www.dov.vlaanderen.be/data/monster/201... \n", "1 https://www.dov.vlaanderen.be/data/monster/201... \n", "2 https://www.dov.vlaanderen.be/data/monster/201... \n", "3 https://www.dov.vlaanderen.be/data/monster/201... \n", "4 https://www.dov.vlaanderen.be/data/monster/201... \n", ".. ... \n", "301 https://www.dov.vlaanderen.be/data/monster/201... \n", "302 https://www.dov.vlaanderen.be/data/monster/201... \n", "303 https://www.dov.vlaanderen.be/data/monster/201... \n", "304 https://www.dov.vlaanderen.be/data/monster/201... \n", "305 https://www.dov.vlaanderen.be/data/monster/201... \n", "\n", " pkey_parents \\\n", "0 (https://www.dov.vlaanderen.be/data/boring/200... \n", "1 (https://www.dov.vlaanderen.be/data/boring/200... \n", "2 (https://www.dov.vlaanderen.be/data/boring/200... \n", "3 (https://www.dov.vlaanderen.be/data/boring/200... \n", "4 (https://www.dov.vlaanderen.be/data/boring/200... \n", ".. ... \n", "301 (https://www.dov.vlaanderen.be/data/boring/200... \n", "302 (https://www.dov.vlaanderen.be/data/boring/200... \n", "303 (https://www.dov.vlaanderen.be/data/boring/200... \n", "304 (https://www.dov.vlaanderen.be/data/boring/200... \n", "305 (https://www.dov.vlaanderen.be/data/boring/200... \n", "\n", " pkey_boring \n", "0 https://www.dov.vlaanderen.be/data/boring/2001... \n", "1 https://www.dov.vlaanderen.be/data/boring/2000... \n", "2 https://www.dov.vlaanderen.be/data/boring/2001... \n", "3 https://www.dov.vlaanderen.be/data/boring/2001... \n", "4 https://www.dov.vlaanderen.be/data/boring/2001... \n", ".. ... \n", "301 https://www.dov.vlaanderen.be/data/boring/2005... \n", "302 https://www.dov.vlaanderen.be/data/boring/2008... \n", "303 https://www.dov.vlaanderen.be/data/boring/2008... \n", "304 https://www.dov.vlaanderen.be/data/boring/2008... \n", "305 https://www.dov.vlaanderen.be/data/boring/2008... \n", "\n", "[306 rows x 3 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_monsters = monster_search.search(\n", " query=Join(df_observaties, on='pkey_monster'),\n", " return_fields=['pkey_monster', 'pkey_parents']\n", ")\n", "df_monsters['pkey_boring'] = df_monsters['pkey_parents'].apply(lambda x: [i for i in x if 'boring' in i][0])\n", "df_monsters" ] }, { "cell_type": "markdown", "id": "c5ed6cdd", "metadata": {}, "source": [ "Based on this link to the boreholes, we can finally retrieve the start level of the borehole:" ] }, { "cell_type": "code", "execution_count": 6, "id": "a5de109d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/001] .\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_boringstart_boring_mtaw
0https://www.dov.vlaanderen.be/data/boring/1998...6.58
1https://www.dov.vlaanderen.be/data/boring/1998...2.48
2https://www.dov.vlaanderen.be/data/boring/1998...4.54
3https://www.dov.vlaanderen.be/data/boring/1999...0.55
4https://www.dov.vlaanderen.be/data/boring/2002...6.89
.........
256https://www.dov.vlaanderen.be/data/boring/2013...8.01
257https://www.dov.vlaanderen.be/data/boring/2013...6.00
258https://www.dov.vlaanderen.be/data/boring/2013...6.24
259https://www.dov.vlaanderen.be/data/boring/2013...2.09
260https://www.dov.vlaanderen.be/data/boring/2013...1.96
\n", "

261 rows × 2 columns

\n", "
" ], "text/plain": [ " pkey_boring start_boring_mtaw\n", "0 https://www.dov.vlaanderen.be/data/boring/1998... 6.58\n", "1 https://www.dov.vlaanderen.be/data/boring/1998... 2.48\n", "2 https://www.dov.vlaanderen.be/data/boring/1998... 4.54\n", "3 https://www.dov.vlaanderen.be/data/boring/1999... 0.55\n", "4 https://www.dov.vlaanderen.be/data/boring/2002... 6.89\n", ".. ... ...\n", "256 https://www.dov.vlaanderen.be/data/boring/2013... 8.01\n", "257 https://www.dov.vlaanderen.be/data/boring/2013... 6.00\n", "258 https://www.dov.vlaanderen.be/data/boring/2013... 6.24\n", "259 https://www.dov.vlaanderen.be/data/boring/2013... 2.09\n", "260 https://www.dov.vlaanderen.be/data/boring/2013... 1.96\n", "\n", "[261 rows x 2 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_boringen = boring_search.search(\n", " query=Join(df_monsters, on='pkey_boring'),\n", " return_fields=['pkey_boring', 'start_boring_mtaw']\n", ")\n", "df_boringen" ] }, { "cell_type": "markdown", "id": "52f82168", "metadata": {}, "source": [ "Subsequently, we can merge all results back into a single dataframe using `pd.merge()`. First we merge the samples and the boreholes based on the `pkey_boring`, and then this result with the observations based on the `pkey_monster`:" ] }, { "cell_type": "code", "execution_count": 7, "id": "aaa350b9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_observatiepkey_parentfenomeentijddiepte_van_mdiepte_tot_mparametergroepparameterdetectieconditieresultaateenheidmethodeuitvoerderherkomstgeompkey_monsterpkey_parentspkey_boringstart_boring_mtaw
0https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/196...1967-03-204.24.28Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN59.3%Chemische reactie met waterstofperoxideRijksinstituut voor GrondmechanicaLABOPOINT (153931 176643)https://www.dov.vlaanderen.be/data/monster/196...(https://www.dov.vlaanderen.be/data/boring/196...https://www.dov.vlaanderen.be/data/boring/1967...17.83
1https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2006-08-0311.011.47Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN92.2%Chemische reactie met waterstofperoxideMVG - Afdeling GeotechniekLABOPOINT (149350 196921)https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2006...8.24
2https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...1967-03-176.56.75Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN71.4%Chemische reactie met waterstofperoxideRijksinstituut voor GrondmechanicaLABOPOINT (154018 176662)https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/196...https://www.dov.vlaanderen.be/data/boring/1967...18.47
3https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...1967-03-207.07.28Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN59.3%Chemische reactie met waterstofperoxideRijksinstituut voor GrondmechanicaLABOPOINT (153931 176643)https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/196...https://www.dov.vlaanderen.be/data/boring/1967...17.83
4https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...1967-03-213.03.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN59.8%Chemische reactie met waterstofperoxideRijksinstituut voor GrondmechanicaLABOPOINT (153802 176597)https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/196...https://www.dov.vlaanderen.be/data/boring/1967...17.62
.........................................................
301https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-03-188.08.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN76.2%Chemische reactie met waterstofperoxideVO - Afdeling GeotechniekLABOPOINT (140180.82 220020.08)https://www.dov.vlaanderen.be/data/monster/202...(https://www.dov.vlaanderen.be/data/boring/202...https://www.dov.vlaanderen.be/data/boring/2025...6.27
302https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-03-207.57.90Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN97.8%Chemische reactie met waterstofperoxideVO - Afdeling GeotechniekLABOPOINT (140027.49 220118.96)https://www.dov.vlaanderen.be/data/monster/202...(https://www.dov.vlaanderen.be/data/boring/202...https://www.dov.vlaanderen.be/data/boring/2025...6.38
303https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-03-219.510.00Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN67.4%Chemische reactie met waterstofperoxideVO - Afdeling GeotechniekLABOPOINT (139978.91 219818.45)https://www.dov.vlaanderen.be/data/monster/202...(https://www.dov.vlaanderen.be/data/boring/202...https://www.dov.vlaanderen.be/data/boring/2025...7.26
304https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-08-299.09.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN81.7%Chemische reactie met waterstofperoxideVO - Afdeling GeotechniekLABOPOINT (69751.19 225638.32)https://www.dov.vlaanderen.be/data/monster/202...(https://www.dov.vlaanderen.be/data/boring/202...https://www.dov.vlaanderen.be/data/boring/2025...7.75
305https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-08-2913.013.48Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN78.2%Chemische reactie met waterstofperoxideVO - Afdeling GeotechniekLABOPOINT (69751.19 225638.32)https://www.dov.vlaanderen.be/data/monster/202...(https://www.dov.vlaanderen.be/data/boring/202...https://www.dov.vlaanderen.be/data/boring/2025...7.75
\n", "

306 rows × 18 columns

\n", "
" ], "text/plain": [ " pkey_observatie \\\n", "0 https://www.dov.vlaanderen.be/data/observatie/... \n", "1 https://www.dov.vlaanderen.be/data/observatie/... \n", "2 https://www.dov.vlaanderen.be/data/observatie/... \n", "3 https://www.dov.vlaanderen.be/data/observatie/... \n", "4 https://www.dov.vlaanderen.be/data/observatie/... \n", ".. ... \n", "301 https://www.dov.vlaanderen.be/data/observatie/... \n", "302 https://www.dov.vlaanderen.be/data/observatie/... \n", "303 https://www.dov.vlaanderen.be/data/observatie/... \n", "304 https://www.dov.vlaanderen.be/data/observatie/... \n", "305 https://www.dov.vlaanderen.be/data/observatie/... \n", "\n", " pkey_parent fenomeentijd \\\n", "0 https://www.dov.vlaanderen.be/data/monster/196... 1967-03-20 \n", "1 https://www.dov.vlaanderen.be/data/monster/201... 2006-08-03 \n", "2 https://www.dov.vlaanderen.be/data/monster/201... 1967-03-17 \n", "3 https://www.dov.vlaanderen.be/data/monster/201... 1967-03-20 \n", "4 https://www.dov.vlaanderen.be/data/monster/201... 1967-03-21 \n", ".. ... ... \n", "301 https://www.dov.vlaanderen.be/data/monster/202... 2025-03-18 \n", "302 https://www.dov.vlaanderen.be/data/monster/202... 2025-03-20 \n", "303 https://www.dov.vlaanderen.be/data/monster/202... 2025-03-21 \n", "304 https://www.dov.vlaanderen.be/data/monster/202... 2025-08-29 \n", "305 https://www.dov.vlaanderen.be/data/monster/202... 2025-08-29 \n", "\n", " diepte_van_m diepte_tot_m parametergroep \\\n", "0 4.2 4.28 Onderkenning - proeven \n", "1 11.0 11.47 Onderkenning - proeven \n", "2 6.5 6.75 Onderkenning - proeven \n", "3 7.0 7.28 Onderkenning - proeven \n", "4 3.0 3.50 Onderkenning - proeven \n", ".. ... ... ... \n", "301 8.0 8.50 Onderkenning - proeven \n", "302 7.5 7.90 Onderkenning - proeven \n", "303 9.5 10.00 Onderkenning - proeven \n", "304 9.0 9.50 Onderkenning - proeven \n", "305 13.0 13.48 Onderkenning - proeven \n", "\n", " parameter detectieconditie \\\n", "0 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "1 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "2 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "3 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "4 Gehalte Organische stoffen (Gehalte Organische... NaN \n", ".. ... ... \n", "301 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "302 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "303 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "304 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "305 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "\n", " resultaat eenheid methode \\\n", "0 59.3 % Chemische reactie met waterstofperoxide \n", "1 92.2 % Chemische reactie met waterstofperoxide \n", "2 71.4 % Chemische reactie met waterstofperoxide \n", "3 59.3 % Chemische reactie met waterstofperoxide \n", "4 59.8 % Chemische reactie met waterstofperoxide \n", ".. ... ... ... \n", "301 76.2 % Chemische reactie met waterstofperoxide \n", "302 97.8 % Chemische reactie met waterstofperoxide \n", "303 67.4 % Chemische reactie met waterstofperoxide \n", "304 81.7 % Chemische reactie met waterstofperoxide \n", "305 78.2 % Chemische reactie met waterstofperoxide \n", "\n", " uitvoerder herkomst geom \\\n", "0 Rijksinstituut voor Grondmechanica LABO POINT (153931 176643) \n", "1 MVG - Afdeling Geotechniek LABO POINT (149350 196921) \n", "2 Rijksinstituut voor Grondmechanica LABO POINT (154018 176662) \n", "3 Rijksinstituut voor Grondmechanica LABO POINT (153931 176643) \n", "4 Rijksinstituut voor Grondmechanica LABO POINT (153802 176597) \n", ".. ... ... ... \n", "301 VO - Afdeling Geotechniek LABO POINT (140180.82 220020.08) \n", "302 VO - Afdeling Geotechniek LABO POINT (140027.49 220118.96) \n", "303 VO - Afdeling Geotechniek LABO POINT (139978.91 219818.45) \n", "304 VO - Afdeling Geotechniek LABO POINT (69751.19 225638.32) \n", "305 VO - Afdeling Geotechniek LABO POINT (69751.19 225638.32) \n", "\n", " pkey_monster \\\n", "0 https://www.dov.vlaanderen.be/data/monster/196... \n", "1 https://www.dov.vlaanderen.be/data/monster/201... \n", "2 https://www.dov.vlaanderen.be/data/monster/201... \n", "3 https://www.dov.vlaanderen.be/data/monster/201... \n", "4 https://www.dov.vlaanderen.be/data/monster/201... \n", ".. ... \n", "301 https://www.dov.vlaanderen.be/data/monster/202... \n", "302 https://www.dov.vlaanderen.be/data/monster/202... \n", "303 https://www.dov.vlaanderen.be/data/monster/202... \n", "304 https://www.dov.vlaanderen.be/data/monster/202... \n", "305 https://www.dov.vlaanderen.be/data/monster/202... \n", "\n", " pkey_parents \\\n", "0 (https://www.dov.vlaanderen.be/data/boring/196... \n", "1 (https://www.dov.vlaanderen.be/data/boring/200... \n", "2 (https://www.dov.vlaanderen.be/data/boring/196... \n", "3 (https://www.dov.vlaanderen.be/data/boring/196... \n", "4 (https://www.dov.vlaanderen.be/data/boring/196... \n", ".. ... \n", "301 (https://www.dov.vlaanderen.be/data/boring/202... \n", "302 (https://www.dov.vlaanderen.be/data/boring/202... \n", "303 (https://www.dov.vlaanderen.be/data/boring/202... \n", "304 (https://www.dov.vlaanderen.be/data/boring/202... \n", "305 (https://www.dov.vlaanderen.be/data/boring/202... \n", "\n", " pkey_boring start_boring_mtaw \n", "0 https://www.dov.vlaanderen.be/data/boring/1967... 17.83 \n", "1 https://www.dov.vlaanderen.be/data/boring/2006... 8.24 \n", "2 https://www.dov.vlaanderen.be/data/boring/1967... 18.47 \n", "3 https://www.dov.vlaanderen.be/data/boring/1967... 17.83 \n", "4 https://www.dov.vlaanderen.be/data/boring/1967... 17.62 \n", ".. ... ... \n", "301 https://www.dov.vlaanderen.be/data/boring/2025... 6.27 \n", "302 https://www.dov.vlaanderen.be/data/boring/2025... 6.38 \n", "303 https://www.dov.vlaanderen.be/data/boring/2025... 7.26 \n", "304 https://www.dov.vlaanderen.be/data/boring/2025... 7.75 \n", "305 https://www.dov.vlaanderen.be/data/boring/2025... 7.75 \n", "\n", "[306 rows x 18 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_monsters = pd.merge(df_monsters, df_boringen, 'outer', 'pkey_boring')\n", "df_observaties = pd.merge(df_observaties, df_monsters, 'outer', 'pkey_monster')\n", "\n", "df_observaties" ] }, { "cell_type": "markdown", "id": "7c7cfaad", "metadata": {}, "source": [ "From this we create a GeoPandas GeoDataFrame, to be able to use in a pydov search query and later to use in the spatial join with the CPT measurements." ] }, { "cell_type": "code", "execution_count": 8, "id": "58879aa9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "geo_df_observaties = gpd.GeoDataFrame(df_observaties, geometry='geom', crs='EPSG:31370')\n", "geo_df_observaties.explore()" ] }, { "cell_type": "markdown", "id": "9f4d6776", "metadata": {}, "source": [ "#### Nearby CPT measurements" ] }, { "cell_type": "markdown", "id": "6369a1c1", "metadata": {}, "source": [ "Initially we want to build a dataframe of all nearby CPT measurements and their location, but without the complete CPT data yet. So first we only retrieve the permanent URL and the location:" ] }, { "cell_type": "code", "execution_count": 9, "id": "bca8c29b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['pkey_sondering', ]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sondering_fields_base = [\n", " 'pkey_sondering',\n", "]\n", "\n", "sondering_fields_geom = [GeometryReturnField(f.name, 31370) for f in observatie_search.get_fields(type='geometry').values()]\n", "\n", "sondering_fields_base.extend(sondering_fields_geom)\n", "\n", "sondering_fields_base" ] }, { "cell_type": "markdown", "id": "8ccf9da6", "metadata": {}, "source": [ "Now that we have all peat samples available, we can search for all nearby CPT measurements. This can be done very easily by using the `GeopandasFilter` in pydov: with the following command we can find all CPT measurements that are located 5 meters or less from one of the previously found peat samples:" ] }, { "cell_type": "code", "execution_count": 10, "id": "612503fa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/001] .\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_sonderinggeom
0https://www.dov.vlaanderen.be/data/sondering/2...POINT (141356.2 218562.1)
1https://www.dov.vlaanderen.be/data/sondering/2...POINT (149606.6 213102.4)
2https://www.dov.vlaanderen.be/data/sondering/2...POINT (149440.5 212336.7)
3https://www.dov.vlaanderen.be/data/sondering/2...POINT (149579.8 212801.4)
4https://www.dov.vlaanderen.be/data/sondering/2...POINT (149826.6 213310.4)
.........
173https://www.dov.vlaanderen.be/data/sondering/2...POINT (68564.5 223202.2)
174https://www.dov.vlaanderen.be/data/sondering/2...POINT (122144.8 188881.2)
175https://www.dov.vlaanderen.be/data/sondering/2...POINT (46343.3 211391.8)
176https://www.dov.vlaanderen.be/data/sondering/2...POINT (46012.1 211344)
177https://www.dov.vlaanderen.be/data/sondering/2...POINT (150522.5 221639.5)
\n", "

178 rows × 2 columns

\n", "
" ], "text/plain": [ " pkey_sondering \\\n", "0 https://www.dov.vlaanderen.be/data/sondering/2... \n", "1 https://www.dov.vlaanderen.be/data/sondering/2... \n", "2 https://www.dov.vlaanderen.be/data/sondering/2... \n", "3 https://www.dov.vlaanderen.be/data/sondering/2... \n", "4 https://www.dov.vlaanderen.be/data/sondering/2... \n", ".. ... \n", "173 https://www.dov.vlaanderen.be/data/sondering/2... \n", "174 https://www.dov.vlaanderen.be/data/sondering/2... \n", "175 https://www.dov.vlaanderen.be/data/sondering/2... \n", "176 https://www.dov.vlaanderen.be/data/sondering/2... \n", "177 https://www.dov.vlaanderen.be/data/sondering/2... \n", "\n", " geom \n", "0 POINT (141356.2 218562.1) \n", "1 POINT (149606.6 213102.4) \n", "2 POINT (149440.5 212336.7) \n", "3 POINT (149579.8 212801.4) \n", "4 POINT (149826.6 213310.4) \n", ".. ... \n", "173 POINT (68564.5 223202.2) \n", "174 POINT (122144.8 188881.2) \n", "175 POINT (46343.3 211391.8) \n", "176 POINT (46012.1 211344) \n", "177 POINT (150522.5 221639.5) \n", "\n", "[178 rows x 2 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_sonderingen_base = sondering_search.search(\n", " location=GeopandasFilter(geo_df_observaties, WithinDistance, {'distance': 5}),\n", " query=PropertyIsEqualTo('sondeermethode', 'continu elektrisch'),\n", " return_fields=sondering_fields_base\n", ")\n", "df_sonderingen_base" ] }, { "cell_type": "markdown", "id": "a4e29e43", "metadata": {}, "source": [ "We also create a GeoDataFrame from this:" ] }, { "cell_type": "code", "execution_count": 11, "id": "9524813f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "geo_df_sonderingen_base = gpd.GeoDataFrame(df_sonderingen_base, geometry='geom', crs='EPSG:31370')\n", "geo_df_sonderingen_base.explore()" ] }, { "cell_type": "markdown", "id": "4271162e", "metadata": {}, "source": [ "Now we can join the two GeoDataFrames based on their location: this way we find for each observation which CPT measurement(s) are nearby, as well as their mutual distance:" ] }, { "cell_type": "code", "execution_count": 12, "id": "0a5b1025", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_observatiepkey_parentfenomeentijddiepte_van_mdiepte_tot_mparametergroepparameterdetectieconditieresultaateenheid...uitvoerderherkomstgeompkey_monsterpkey_parentspkey_boringstart_boring_mtawindex_rightpkey_sonderingdist
1https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2006-08-0311.011.47Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN92.2%...MVG - Afdeling GeotechniekLABOPOINT (149350 196921)https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2006...8.2441https://www.dov.vlaanderen.be/data/sondering/2...0.322025
10https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2006-07-068.58.96Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN62.0%...Katholieke Universiteit Leuven (KUL)LABOPOINT (141229.95 225203.22)https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2006...7.8128https://www.dov.vlaanderen.be/data/sondering/2...3.019884
11https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2007-01-297.07.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN79.4%...Katholieke Universiteit Leuven (KUL)LABOPOINT (140836.3 225113.28)https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2007...7.1066https://www.dov.vlaanderen.be/data/sondering/2...1.801139
12https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2007-04-174.54.98Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN54.8%...VO - Afdeling GeotechniekLABOPOINT (119536.32 189184.38)https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2007...4.0726https://www.dov.vlaanderen.be/data/sondering/2...2.993125
14https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2007-02-288.08.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN87.6%...VO - Afdeling GeotechniekLABOPOINT (152353 213884.55)https://www.dov.vlaanderen.be/data/monster/201...(https://www.dov.vlaanderen.be/data/boring/200...https://www.dov.vlaanderen.be/data/boring/2007...7.6625https://www.dov.vlaanderen.be/data/sondering/2...2.540709
..................................................................
301https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-03-188.08.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN76.2%...VO - Afdeling GeotechniekLABOPOINT (140180.82 220020.08)https://www.dov.vlaanderen.be/data/monster/202...(https://www.dov.vlaanderen.be/data/boring/202...https://www.dov.vlaanderen.be/data/boring/2025...6.27138https://www.dov.vlaanderen.be/data/sondering/2...0.930054
302https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-03-207.57.90Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN97.8%...VO - Afdeling GeotechniekLABOPOINT (140027.49 220118.96)https://www.dov.vlaanderen.be/data/monster/202...(https://www.dov.vlaanderen.be/data/boring/202...https://www.dov.vlaanderen.be/data/boring/2025...6.38140https://www.dov.vlaanderen.be/data/sondering/2...4.396931
303https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-03-219.510.00Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN67.4%...VO - Afdeling GeotechniekLABOPOINT (139978.91 219818.45)https://www.dov.vlaanderen.be/data/monster/202...(https://www.dov.vlaanderen.be/data/boring/202...https://www.dov.vlaanderen.be/data/boring/2025...7.26136https://www.dov.vlaanderen.be/data/sondering/2...1.478716
304https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-08-299.09.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN81.7%...VO - Afdeling GeotechniekLABOPOINT (69751.19 225638.32)https://www.dov.vlaanderen.be/data/monster/202...(https://www.dov.vlaanderen.be/data/boring/202...https://www.dov.vlaanderen.be/data/boring/2025...7.75172https://www.dov.vlaanderen.be/data/sondering/2...2.464731
305https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-08-2913.013.48Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN78.2%...VO - Afdeling GeotechniekLABOPOINT (69751.19 225638.32)https://www.dov.vlaanderen.be/data/monster/202...(https://www.dov.vlaanderen.be/data/boring/202...https://www.dov.vlaanderen.be/data/boring/2025...7.75172https://www.dov.vlaanderen.be/data/sondering/2...2.464731
\n", "

202 rows × 21 columns

\n", "
" ], "text/plain": [ " pkey_observatie \\\n", "1 https://www.dov.vlaanderen.be/data/observatie/... \n", "10 https://www.dov.vlaanderen.be/data/observatie/... \n", "11 https://www.dov.vlaanderen.be/data/observatie/... \n", "12 https://www.dov.vlaanderen.be/data/observatie/... \n", "14 https://www.dov.vlaanderen.be/data/observatie/... \n", ".. ... \n", "301 https://www.dov.vlaanderen.be/data/observatie/... \n", "302 https://www.dov.vlaanderen.be/data/observatie/... \n", "303 https://www.dov.vlaanderen.be/data/observatie/... \n", "304 https://www.dov.vlaanderen.be/data/observatie/... \n", "305 https://www.dov.vlaanderen.be/data/observatie/... \n", "\n", " pkey_parent fenomeentijd \\\n", "1 https://www.dov.vlaanderen.be/data/monster/201... 2006-08-03 \n", "10 https://www.dov.vlaanderen.be/data/monster/201... 2006-07-06 \n", "11 https://www.dov.vlaanderen.be/data/monster/201... 2007-01-29 \n", "12 https://www.dov.vlaanderen.be/data/monster/201... 2007-04-17 \n", "14 https://www.dov.vlaanderen.be/data/monster/201... 2007-02-28 \n", ".. ... ... \n", "301 https://www.dov.vlaanderen.be/data/monster/202... 2025-03-18 \n", "302 https://www.dov.vlaanderen.be/data/monster/202... 2025-03-20 \n", "303 https://www.dov.vlaanderen.be/data/monster/202... 2025-03-21 \n", "304 https://www.dov.vlaanderen.be/data/monster/202... 2025-08-29 \n", "305 https://www.dov.vlaanderen.be/data/monster/202... 2025-08-29 \n", "\n", " diepte_van_m diepte_tot_m parametergroep \\\n", "1 11.0 11.47 Onderkenning - proeven \n", "10 8.5 8.96 Onderkenning - proeven \n", "11 7.0 7.50 Onderkenning - proeven \n", "12 4.5 4.98 Onderkenning - proeven \n", "14 8.0 8.50 Onderkenning - proeven \n", ".. ... ... ... \n", "301 8.0 8.50 Onderkenning - proeven \n", "302 7.5 7.90 Onderkenning - proeven \n", "303 9.5 10.00 Onderkenning - proeven \n", "304 9.0 9.50 Onderkenning - proeven \n", "305 13.0 13.48 Onderkenning - proeven \n", "\n", " parameter detectieconditie \\\n", "1 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "10 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "11 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "12 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "14 Gehalte Organische stoffen (Gehalte Organische... NaN \n", ".. ... ... \n", "301 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "302 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "303 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "304 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "305 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "\n", " resultaat eenheid ... uitvoerder herkomst \\\n", "1 92.2 % ... MVG - Afdeling Geotechniek LABO \n", "10 62.0 % ... Katholieke Universiteit Leuven (KUL) LABO \n", "11 79.4 % ... Katholieke Universiteit Leuven (KUL) LABO \n", "12 54.8 % ... VO - Afdeling Geotechniek LABO \n", "14 87.6 % ... VO - Afdeling Geotechniek LABO \n", ".. ... ... ... ... ... \n", "301 76.2 % ... VO - Afdeling Geotechniek LABO \n", "302 97.8 % ... VO - Afdeling Geotechniek LABO \n", "303 67.4 % ... VO - Afdeling Geotechniek LABO \n", "304 81.7 % ... VO - Afdeling Geotechniek LABO \n", "305 78.2 % ... VO - Afdeling Geotechniek LABO \n", "\n", " geom \\\n", "1 POINT (149350 196921) \n", "10 POINT (141229.95 225203.22) \n", "11 POINT (140836.3 225113.28) \n", "12 POINT (119536.32 189184.38) \n", "14 POINT (152353 213884.55) \n", ".. ... \n", "301 POINT (140180.82 220020.08) \n", "302 POINT (140027.49 220118.96) \n", "303 POINT (139978.91 219818.45) \n", "304 POINT (69751.19 225638.32) \n", "305 POINT (69751.19 225638.32) \n", "\n", " pkey_monster \\\n", "1 https://www.dov.vlaanderen.be/data/monster/201... \n", "10 https://www.dov.vlaanderen.be/data/monster/201... \n", "11 https://www.dov.vlaanderen.be/data/monster/201... \n", "12 https://www.dov.vlaanderen.be/data/monster/201... \n", "14 https://www.dov.vlaanderen.be/data/monster/201... \n", ".. ... \n", "301 https://www.dov.vlaanderen.be/data/monster/202... \n", "302 https://www.dov.vlaanderen.be/data/monster/202... \n", "303 https://www.dov.vlaanderen.be/data/monster/202... \n", "304 https://www.dov.vlaanderen.be/data/monster/202... \n", "305 https://www.dov.vlaanderen.be/data/monster/202... \n", "\n", " pkey_parents \\\n", "1 (https://www.dov.vlaanderen.be/data/boring/200... \n", "10 (https://www.dov.vlaanderen.be/data/boring/200... \n", "11 (https://www.dov.vlaanderen.be/data/boring/200... \n", "12 (https://www.dov.vlaanderen.be/data/boring/200... \n", "14 (https://www.dov.vlaanderen.be/data/boring/200... \n", ".. ... \n", "301 (https://www.dov.vlaanderen.be/data/boring/202... \n", "302 (https://www.dov.vlaanderen.be/data/boring/202... \n", "303 (https://www.dov.vlaanderen.be/data/boring/202... \n", "304 (https://www.dov.vlaanderen.be/data/boring/202... \n", "305 (https://www.dov.vlaanderen.be/data/boring/202... \n", "\n", " pkey_boring start_boring_mtaw \\\n", "1 https://www.dov.vlaanderen.be/data/boring/2006... 8.24 \n", "10 https://www.dov.vlaanderen.be/data/boring/2006... 7.81 \n", "11 https://www.dov.vlaanderen.be/data/boring/2007... 7.10 \n", "12 https://www.dov.vlaanderen.be/data/boring/2007... 4.07 \n", "14 https://www.dov.vlaanderen.be/data/boring/2007... 7.66 \n", ".. ... ... \n", "301 https://www.dov.vlaanderen.be/data/boring/2025... 6.27 \n", "302 https://www.dov.vlaanderen.be/data/boring/2025... 6.38 \n", "303 https://www.dov.vlaanderen.be/data/boring/2025... 7.26 \n", "304 https://www.dov.vlaanderen.be/data/boring/2025... 7.75 \n", "305 https://www.dov.vlaanderen.be/data/boring/2025... 7.75 \n", "\n", " index_right pkey_sondering dist \n", "1 41 https://www.dov.vlaanderen.be/data/sondering/2... 0.322025 \n", "10 28 https://www.dov.vlaanderen.be/data/sondering/2... 3.019884 \n", "11 66 https://www.dov.vlaanderen.be/data/sondering/2... 1.801139 \n", "12 26 https://www.dov.vlaanderen.be/data/sondering/2... 2.993125 \n", "14 25 https://www.dov.vlaanderen.be/data/sondering/2... 2.540709 \n", ".. ... ... ... \n", "301 138 https://www.dov.vlaanderen.be/data/sondering/2... 0.930054 \n", "302 140 https://www.dov.vlaanderen.be/data/sondering/2... 4.396931 \n", "303 136 https://www.dov.vlaanderen.be/data/sondering/2... 1.478716 \n", "304 172 https://www.dov.vlaanderen.be/data/sondering/2... 2.464731 \n", "305 172 https://www.dov.vlaanderen.be/data/sondering/2... 2.464731 \n", "\n", "[202 rows x 21 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_joined = gpd.sjoin_nearest(geo_df_observaties, geo_df_sonderingen_base, max_distance=5, distance_col='dist')\n", "df_joined" ] }, { "cell_type": "markdown", "id": "58f323e0", "metadata": {}, "source": [ "Now we only need the CPT data itself: this can be requested based on the previously found CPT measurements, but now with the complete list of fields as return_fields:" ] }, { "cell_type": "code", "execution_count": 13, "id": "34187421", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['pkey_sondering',\n", " 'sondeernummer',\n", " 'x',\n", " 'y',\n", " 'mv_mtaw',\n", " 'start_sondering_mtaw',\n", " 'diepte_sondering_van',\n", " 'diepte_sondering_tot',\n", " 'datum_aanvang',\n", " 'uitvoerder',\n", " 'sondeermethode',\n", " 'apparaat',\n", " 'datum_gw_meting',\n", " 'diepte_gw_m',\n", " 'lengte',\n", " 'diepte',\n", " 'qc',\n", " 'Qt',\n", " 'fs',\n", " 'u',\n", " 'i',\n", " ]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sondering_fields = Sondering.get_field_names()\n", "sondering_fields.extend(sondering_fields_geom)\n", "\n", "sondering_fields" ] }, { "cell_type": "code", "execution_count": 14, "id": "31a56ee4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/001] .\n", "[000/178] cccccccccccccccccccccccccccccccccccccccccccccccccc\n", "[050/178] cccccccccccccccccccccccccccccccccccccccccccccccccc\n", "[100/178] cccccccccccccccccccccccccccccccccccccccccccccccccc\n", "[150/178] cccccccccccccccccccccccccccc\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_sonderingsondeernummerxymv_mtawstart_sondering_mtawdiepte_sondering_vandiepte_sondering_totdatum_aanvanguitvoerder...datum_gw_metingdiepte_gw_mlengtediepteqcQtfsuigeom
0https://www.dov.vlaanderen.be/data/sondering/2...GEO-01/153-SZS126141356.2218562.1NaN6.751.232.152002-09-06MVG - Afdeling Geotechniek...2002-09-06 00:00:001.151.251.259.96NaN110.0NaN-3.1POINT (141356.2 218562.1)
1https://www.dov.vlaanderen.be/data/sondering/2...GEO-01/153-SZS126141356.2218562.1NaN6.751.232.152002-09-06MVG - Afdeling Geotechniek...2002-09-06 00:00:001.151.301.3010.50NaN120.0NaN-3.1POINT (141356.2 218562.1)
2https://www.dov.vlaanderen.be/data/sondering/2...GEO-01/153-SZS126141356.2218562.1NaN6.751.232.152002-09-06MVG - Afdeling Geotechniek...2002-09-06 00:00:001.151.351.3517.02NaN140.0NaN-3.1POINT (141356.2 218562.1)
3https://www.dov.vlaanderen.be/data/sondering/2...GEO-01/153-SZS126141356.2218562.1NaN6.751.232.152002-09-06MVG - Afdeling Geotechniek...2002-09-06 00:00:001.151.401.4016.74NaN150.0NaN-3.1POINT (141356.2 218562.1)
4https://www.dov.vlaanderen.be/data/sondering/2...GEO-01/153-SZS126141356.2218562.1NaN6.751.232.152002-09-06MVG - Afdeling Geotechniek...2002-09-06 00:00:001.151.451.4516.13NaN160.0NaN-3.1POINT (141356.2 218562.1)
..................................................................
153411https://www.dov.vlaanderen.be/data/sondering/2...GEO-01/182-S4150522.5221639.5NaN6.701.412.352002-02-27MVG - Afdeling Geotechniek...2002-02-27 15:00:005.1012.1512.1530.65NaN260.0NaN0.1POINT (150522.5 221639.5)
153412https://www.dov.vlaanderen.be/data/sondering/2...GEO-01/182-S4150522.5221639.5NaN6.701.412.352002-02-27MVG - Afdeling Geotechniek...2002-02-27 15:00:005.1012.2012.2027.91NaN250.0NaN0.1POINT (150522.5 221639.5)
153413https://www.dov.vlaanderen.be/data/sondering/2...GEO-01/182-S4150522.5221639.5NaN6.701.412.352002-02-27MVG - Afdeling Geotechniek...2002-02-27 15:00:005.1012.2512.2528.06NaN250.0NaN0.1POINT (150522.5 221639.5)
153414https://www.dov.vlaanderen.be/data/sondering/2...GEO-01/182-S4150522.5221639.5NaN6.701.412.352002-02-27MVG - Afdeling Geotechniek...2002-02-27 15:00:005.1012.3012.3027.85NaN260.0NaN0.1POINT (150522.5 221639.5)
153415https://www.dov.vlaanderen.be/data/sondering/2...GEO-01/182-S4150522.5221639.5NaN6.701.412.352002-02-27MVG - Afdeling Geotechniek...2002-02-27 15:00:005.1012.3512.3526.88NaN260.0NaN0.1POINT (150522.5 221639.5)
\n", "

153416 rows × 22 columns

\n", "
" ], "text/plain": [ " pkey_sondering sondeernummer \\\n", "0 https://www.dov.vlaanderen.be/data/sondering/2... GEO-01/153-SZS126 \n", "1 https://www.dov.vlaanderen.be/data/sondering/2... GEO-01/153-SZS126 \n", "2 https://www.dov.vlaanderen.be/data/sondering/2... GEO-01/153-SZS126 \n", "3 https://www.dov.vlaanderen.be/data/sondering/2... GEO-01/153-SZS126 \n", "4 https://www.dov.vlaanderen.be/data/sondering/2... GEO-01/153-SZS126 \n", "... ... ... \n", "153411 https://www.dov.vlaanderen.be/data/sondering/2... GEO-01/182-S4 \n", "153412 https://www.dov.vlaanderen.be/data/sondering/2... GEO-01/182-S4 \n", "153413 https://www.dov.vlaanderen.be/data/sondering/2... GEO-01/182-S4 \n", "153414 https://www.dov.vlaanderen.be/data/sondering/2... GEO-01/182-S4 \n", "153415 https://www.dov.vlaanderen.be/data/sondering/2... GEO-01/182-S4 \n", "\n", " x y mv_mtaw start_sondering_mtaw \\\n", "0 141356.2 218562.1 NaN 6.75 \n", "1 141356.2 218562.1 NaN 6.75 \n", "2 141356.2 218562.1 NaN 6.75 \n", "3 141356.2 218562.1 NaN 6.75 \n", "4 141356.2 218562.1 NaN 6.75 \n", "... ... ... ... ... \n", "153411 150522.5 221639.5 NaN 6.70 \n", "153412 150522.5 221639.5 NaN 6.70 \n", "153413 150522.5 221639.5 NaN 6.70 \n", "153414 150522.5 221639.5 NaN 6.70 \n", "153415 150522.5 221639.5 NaN 6.70 \n", "\n", " diepte_sondering_van diepte_sondering_tot datum_aanvang \\\n", "0 1.2 32.15 2002-09-06 \n", "1 1.2 32.15 2002-09-06 \n", "2 1.2 32.15 2002-09-06 \n", "3 1.2 32.15 2002-09-06 \n", "4 1.2 32.15 2002-09-06 \n", "... ... ... ... \n", "153411 1.4 12.35 2002-02-27 \n", "153412 1.4 12.35 2002-02-27 \n", "153413 1.4 12.35 2002-02-27 \n", "153414 1.4 12.35 2002-02-27 \n", "153415 1.4 12.35 2002-02-27 \n", "\n", " uitvoerder ... datum_gw_meting diepte_gw_m \\\n", "0 MVG - Afdeling Geotechniek ... 2002-09-06 00:00:00 1.15 \n", "1 MVG - Afdeling Geotechniek ... 2002-09-06 00:00:00 1.15 \n", "2 MVG - Afdeling Geotechniek ... 2002-09-06 00:00:00 1.15 \n", "3 MVG - Afdeling Geotechniek ... 2002-09-06 00:00:00 1.15 \n", "4 MVG - Afdeling Geotechniek ... 2002-09-06 00:00:00 1.15 \n", "... ... ... ... ... \n", "153411 MVG - Afdeling Geotechniek ... 2002-02-27 15:00:00 5.10 \n", "153412 MVG - Afdeling Geotechniek ... 2002-02-27 15:00:00 5.10 \n", "153413 MVG - Afdeling Geotechniek ... 2002-02-27 15:00:00 5.10 \n", "153414 MVG - Afdeling Geotechniek ... 2002-02-27 15:00:00 5.10 \n", "153415 MVG - Afdeling Geotechniek ... 2002-02-27 15:00:00 5.10 \n", "\n", " lengte diepte qc Qt fs u i geom \n", "0 1.25 1.25 9.96 NaN 110.0 NaN -3.1 POINT (141356.2 218562.1) \n", "1 1.30 1.30 10.50 NaN 120.0 NaN -3.1 POINT (141356.2 218562.1) \n", "2 1.35 1.35 17.02 NaN 140.0 NaN -3.1 POINT (141356.2 218562.1) \n", "3 1.40 1.40 16.74 NaN 150.0 NaN -3.1 POINT (141356.2 218562.1) \n", "4 1.45 1.45 16.13 NaN 160.0 NaN -3.1 POINT (141356.2 218562.1) \n", "... ... ... ... .. ... .. ... ... \n", "153411 12.15 12.15 30.65 NaN 260.0 NaN 0.1 POINT (150522.5 221639.5) \n", "153412 12.20 12.20 27.91 NaN 250.0 NaN 0.1 POINT (150522.5 221639.5) \n", "153413 12.25 12.25 28.06 NaN 250.0 NaN 0.1 POINT (150522.5 221639.5) \n", "153414 12.30 12.30 27.85 NaN 260.0 NaN 0.1 POINT (150522.5 221639.5) \n", "153415 12.35 12.35 26.88 NaN 260.0 NaN 0.1 POINT (150522.5 221639.5) \n", "\n", "[153416 rows x 22 columns]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_sonderingen = sondering_search.search(\n", " query=Join(df_sonderingen_base, 'pkey_sondering'),\n", " return_fields=sondering_fields\n", ")\n", "df_sonderingen" ] }, { "cell_type": "markdown", "id": "893444a7", "metadata": {}, "source": [ "### Data analysis" ] }, { "cell_type": "markdown", "id": "a35d577f", "metadata": {}, "source": [ "Now that we have all the data, we can start our analysis. First we create an empty dataframe with the required columns to later save the results in:" ] }, { "cell_type": "code", "execution_count": 15, "id": "a29834bd", "metadata": {}, "outputs": [], "source": [ "new_columns = [\n", " 'pkey_observatie',\n", " \"qc_avg\",\n", " \"qc_med\",\n", " \"qc_var\",\n", " \"fs_avg\",\n", " \"fs_med\",\n", " \"fs_var\",\n", " \"rf_avg\",\n", " \"rf_med\",\n", " \"rf_var\",\n", " \"Qtn_avg\",\n", " \"Qtn_med\",\n", " \"Qtn_var\",\n", " \"F_avg\",\n", " \"F_med\",\n", " \"F_var\",\n", " \"IC_avg\",\n", " \"IC_med\",\n", " \"IC_var\",\n", "] # create the variables that you want to store\n", "sonddata_df = pd.DataFrame(\n", " columns=new_columns\n", ") # make a dataframe with the same shape as gdf but with above specified columns" ] }, { "cell_type": "markdown", "id": "e7a2c8d1", "metadata": {}, "source": [ "And we perform the actual analysis. For each observation (peat sample), the nearest CPT measurement is searched and its data is loaded. After converting both the observation and the CPT data to meter TAW, the Robertson Soil Behavior Type parameters can be calculated. These are added to the result dataframe." ] }, { "cell_type": "code", "execution_count": 16, "id": "65adc6d6", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_69852/329157286.py:99: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", " sonddata_df = pd.concat([sonddata_df, new_data], ignore_index=True)\n", "/home/roel/Work/DOV/pydov/Code/pydov/.venv/lib/python3.13/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: invalid value encountered in log10\n", " result = getattr(ufunc, method)(*inputs, **kwargs)\n", "/home/roel/Work/DOV/pydov/Code/pydov/.venv/lib/python3.13/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: invalid value encountered in log10\n", " result = getattr(ufunc, method)(*inputs, **kwargs)\n", "/home/roel/Work/DOV/pydov/Code/pydov/.venv/lib/python3.13/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: invalid value encountered in log10\n", " result = getattr(ufunc, method)(*inputs, **kwargs)\n", "/home/roel/Work/DOV/pydov/Code/pydov/.venv/lib/python3.13/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: invalid value encountered in log10\n", " result = getattr(ufunc, method)(*inputs, **kwargs)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_observatieqc_avgqc_medqc_varfs_avgfs_medfs_varrf_avgrf_medrf_varQtn_avgQtn_medQtn_varF_avgF_medF_varIC_avgIC_medIC_var
0https://www.dov.vlaanderen.be/data/observatie/...0.6302000.6200.00241249.24000049.011.7733337.8219047.8947370.0702054.7403684.6454910.2057649.7441199.8667720.1850433.562928NaN0.001710
1https://www.dov.vlaanderen.be/data/observatie/...1.2120001.2400.012442103.760000104.0312.1900008.5036958.4745760.6712228.5511318.7655230.9703699.6532969.6720400.6626253.363599NaN0.000734
2https://www.dov.vlaanderen.be/data/observatie/...1.6316671.6700.013657138.833333141.542.1666678.5238008.4765870.0950819.7304279.9840770.6424919.5169779.4316450.1746043.316316NaN0.001501
3https://www.dov.vlaanderen.be/data/observatie/...1.0200001.0700.014900111.240000118.0186.69000010.90524010.8823530.11736510.09012810.6210292.48232612.84300612.8932820.2402933.395762NaN0.003559
4https://www.dov.vlaanderen.be/data/observatie/...0.8890800.8490.02872870.64000063.5296.4391848.1162178.3726753.8409047.6855927.1963052.9409199.3586429.7940075.2738993.384799NaN0.017229
............................................................
191https://www.dov.vlaanderen.be/data/observatie/...1.0563641.0700.00574584.54545586.086.6727277.9914607.9090910.2415396.0606776.1800740.2335259.4216599.2791480.3202363.470083NaN0.000919
192https://www.dov.vlaanderen.be/data/observatie/...1.2600001.2200.03915099.000000101.068.5000007.9531418.3620690.83980019.88776419.2283929.8792018.6618259.1465271.1259093.061948NaN0.007006
193https://www.dov.vlaanderen.be/data/observatie/...0.8300000.8500.00777566.66666770.025.0000008.0627228.0459770.1932969.1136219.4877401.7273659.8003489.8971490.5229673.347741NaN0.004492
194https://www.dov.vlaanderen.be/data/observatie/...0.8922220.8800.00276973.44444476.0139.2777788.1955288.3516480.8297846.4399546.3552330.3236089.4673029.6212530.9257513.450596NaN0.000276
195https://www.dov.vlaanderen.be/data/observatie/...0.4846150.4650.00581846.42307748.029.2138469.6809749.5401691.1522867.5534007.3244861.42858411.28173311.1502531.9557883.448938NaN0.006541
\n", "

196 rows × 19 columns

\n", "
" ], "text/plain": [ " pkey_observatie qc_avg qc_med \\\n", "0 https://www.dov.vlaanderen.be/data/observatie/... 0.630200 0.620 \n", "1 https://www.dov.vlaanderen.be/data/observatie/... 1.212000 1.240 \n", "2 https://www.dov.vlaanderen.be/data/observatie/... 1.631667 1.670 \n", "3 https://www.dov.vlaanderen.be/data/observatie/... 1.020000 1.070 \n", "4 https://www.dov.vlaanderen.be/data/observatie/... 0.889080 0.849 \n", ".. ... ... ... \n", "191 https://www.dov.vlaanderen.be/data/observatie/... 1.056364 1.070 \n", "192 https://www.dov.vlaanderen.be/data/observatie/... 1.260000 1.220 \n", "193 https://www.dov.vlaanderen.be/data/observatie/... 0.830000 0.850 \n", "194 https://www.dov.vlaanderen.be/data/observatie/... 0.892222 0.880 \n", "195 https://www.dov.vlaanderen.be/data/observatie/... 0.484615 0.465 \n", "\n", " qc_var fs_avg fs_med fs_var rf_avg rf_med rf_var \\\n", "0 0.002412 49.240000 49.0 11.773333 7.821904 7.894737 0.070205 \n", "1 0.012442 103.760000 104.0 312.190000 8.503695 8.474576 0.671222 \n", "2 0.013657 138.833333 141.5 42.166667 8.523800 8.476587 0.095081 \n", "3 0.014900 111.240000 118.0 186.690000 10.905240 10.882353 0.117365 \n", "4 0.028728 70.640000 63.5 296.439184 8.116217 8.372675 3.840904 \n", ".. ... ... ... ... ... ... ... \n", "191 0.005745 84.545455 86.0 86.672727 7.991460 7.909091 0.241539 \n", "192 0.039150 99.000000 101.0 68.500000 7.953141 8.362069 0.839800 \n", "193 0.007775 66.666667 70.0 25.000000 8.062722 8.045977 0.193296 \n", "194 0.002769 73.444444 76.0 139.277778 8.195528 8.351648 0.829784 \n", "195 0.005818 46.423077 48.0 29.213846 9.680974 9.540169 1.152286 \n", "\n", " Qtn_avg Qtn_med Qtn_var F_avg F_med F_var IC_avg \\\n", "0 4.740368 4.645491 0.205764 9.744119 9.866772 0.185043 3.562928 \n", "1 8.551131 8.765523 0.970369 9.653296 9.672040 0.662625 3.363599 \n", "2 9.730427 9.984077 0.642491 9.516977 9.431645 0.174604 3.316316 \n", "3 10.090128 10.621029 2.482326 12.843006 12.893282 0.240293 3.395762 \n", "4 7.685592 7.196305 2.940919 9.358642 9.794007 5.273899 3.384799 \n", ".. ... ... ... ... ... ... ... \n", "191 6.060677 6.180074 0.233525 9.421659 9.279148 0.320236 3.470083 \n", "192 19.887764 19.228392 9.879201 8.661825 9.146527 1.125909 3.061948 \n", "193 9.113621 9.487740 1.727365 9.800348 9.897149 0.522967 3.347741 \n", "194 6.439954 6.355233 0.323608 9.467302 9.621253 0.925751 3.450596 \n", "195 7.553400 7.324486 1.428584 11.281733 11.150253 1.955788 3.448938 \n", "\n", " IC_med IC_var \n", "0 NaN 0.001710 \n", "1 NaN 0.000734 \n", "2 NaN 0.001501 \n", "3 NaN 0.003559 \n", "4 NaN 0.017229 \n", ".. ... ... \n", "191 NaN 0.000919 \n", "192 NaN 0.007006 \n", "193 NaN 0.004492 \n", "194 NaN 0.000276 \n", "195 NaN 0.006541 \n", "\n", "[196 rows x 19 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for observation in set(df_joined['pkey_observatie']):\n", " nearest_sondering = df_joined[df_joined['pkey_observatie'] == observation].sort_values(by='dist', ascending=False).iloc[0]['pkey_sondering']\n", "\n", " sondering_data = df_sonderingen[\n", " (df_sonderingen['pkey_sondering'] == nearest_sondering)\n", " & (df_sonderingen['fs'] > 0)\n", " & (df_sonderingen['qc'] > 0)\n", " ].copy()\n", "\n", " observatie_data = df_joined[df_joined['pkey_observatie'] == observation]\n", "\n", " if sondering_data.size == 0:\n", " continue\n", "\n", " sondering_data[\"rf\"] = sondering_data[\"fs\"] / sondering_data[\"qc\"] / 10 # calculate rf\n", "\n", " # convert depths to relative levels\n", " sondering_data[\"mtaw\"] = (\n", " sondering_data[\"start_sondering_mtaw\"] - sondering_data[\"diepte\"]\n", " )\n", " sondering_data[\"mtaw\"] = sondering_data[\"mtaw\"].fillna(sondering_data[\"start_sondering_mtaw\"] - sondering_data[\"lengte\"])\n", "\n", " # for the moment there will be no correction with the lag index, this is hard to do automatically, could possibly be done by looking at max curvature or by looping through the indices and finding the first maxima\n", " sondering_data[\"unitw\"] = 9.81 * (\n", " 0.27 * np.log10(sondering_data[\"rf\"]) + 0.36 * np.log10((sondering_data[\"qc\"] / 0.1)) + 1.236\n", " ) # calculate unitw\n", "\n", " # if there is no groundwaterdata then take GW equal to start of the sounding\n", " sondering_data[\"diepte_gw_m\"] = sondering_data[\"diepte_gw_m\"].fillna(sondering_data[\"start_sondering_mtaw\"])\n", "\n", " # if above the groundwater, give a value 0 for pwp\n", " sondering_data.loc[sondering_data['lengte'] < sondering_data['diepte_gw_m'], 'pwp'] = 0\n", " # if below GW, give value equal to hydrostatic pwp\n", " sondering_data.loc[sondering_data['lengte'] >= sondering_data['diepte_gw_m'], 'pwp'] = (sondering_data[\"lengte\"] - sondering_data[\"diepte_gw_m\"]) * 9.81\n", "\n", " sondering_data[\"stot\"] = 0 # make a stot column\n", " sondering_data['stot'] = (sondering_data['lengte'] - sondering_data['lengte'].shift(1).fillna(0)) * sondering_data['unitw']\n", " sondering_data['stot'] = sondering_data['stot'].cumsum()\n", "\n", " sondering_data[\"seff\"] = sondering_data[\"stot\"] - sondering_data[\"pwp\"] # calculate effective stress\n", " if sondering_data[\"seff\"].isna().any(): # check i used for detecting nan values\n", " print(f\"NaN found for 'seff' in rows {sondering_data[sondering_data['seff'].isna()].index}\")\n", " break\n", "\n", " sondering_data[\"Qtn\"] = ((sondering_data[\"qc\"] * 1000 - sondering_data[\"stot\"]) / 100) * (\n", " 100 / sondering_data[\"seff\"]\n", " ) # calculate corrected Qtn\n", " sondering_data[\"F\"] = sondering_data[\"fs\"] * 100 / (sondering_data[\"qc\"] * 1000 - sondering_data[\"stot\"])\n", " # calculate corrected F-factor\n", " sondering_data[\"IC\"] = (\n", " (3.47 - np.log10(sondering_data[\"Qtn\"])) ** 2 + (np.log10(sondering_data[\"F\"]) + 1.22) ** 2\n", " ) ** 0.5 # Ic for soil behaviour type\n", "\n", " sondering_data[\"peil\"] = (\n", " sondering_data[\"start_sondering_mtaw\"] - sondering_data[\"lengte\"]\n", " ) # absolute level\n", "\n", " bovenpeil = (observatie_data['start_boring_mtaw'] - observatie_data[\"diepte_van_m\"]).iloc[0] # extract boundaries of sample\n", " onderpeil = (observatie_data['start_boring_mtaw'] - observatie_data[\"diepte_tot_m\"]).iloc[0] # extract boundaries of sample\n", "\n", " sondering_data_subset = sondering_data[\n", " (sondering_data[\"peil\"] <= bovenpeil) & (sondering_data[\"peil\"] >= onderpeil)\n", " ] # define a subset with the CPT values at the depth of the sample\n", " if sondering_data_subset.size == 0: # if this subset is empty just restart loop\n", " continue\n", " mean_values = sondering_data_subset.mean(numeric_only=True) # find mean\n", " median_values = sondering_data_subset.median(numeric_only=True) # find median\n", "\n", " if len(sondering_data_subset) > 1:\n", " variance_values = (\n", " sondering_data_subset.var(numeric_only=True)\n", " ) # find variance if there is more than one datapoint\n", " else:\n", " variance_values = pd.Series(\n", " [0 for _ in sondering_data_subset.columns], index=sondering_data_subset.columns\n", " ) # if this in not the case put a 0 for variance\n", "\n", " new_data = pd.DataFrame(index=observatie_data.index, data={\n", " 'pkey_observatie': observatie_data['pkey_observatie'].iloc[0],\n", " \"qc_avg\": mean_values[\"qc\"],\n", " \"fs_avg\": mean_values[\"fs\"],\n", " \"rf_avg\": mean_values[\"rf\"],\n", " \"Qtn_avg\": mean_values[\"Qtn\"],\n", " \"F_avg\": mean_values[\"F\"],\n", " \"IC_avg\": mean_values[\"IC\"],\n", " \"qc_med\": median_values[\"qc\"],\n", " \"fs_med\": median_values[\"fs\"],\n", " \"rf_med\": median_values[\"rf\"],\n", " \"Qtn_med\": median_values[\"Qtn\"],\n", " \"F_med\": median_values[\"F\"] ,\n", " \"qc_var\": variance_values[\"qc\"],\n", " \"fs_var\": variance_values[\"fs\"],\n", " \"rf_var\": variance_values[\"rf\"],\n", " \"Qtn_var\": variance_values[\"Qtn\"],\n", " \"F_var\": variance_values[\"F\"],\n", " \"IC_var\": variance_values[\"IC\"],\n", " })\n", "\n", " sonddata_df = pd.concat([sonddata_df, new_data], ignore_index=True)\n", "\n", "sonddata_df\n" ] }, { "cell_type": "markdown", "id": "f13f7596", "metadata": {}, "source": [ "The results are then merged with the source data of the observations, based on the `pkey_observatie`:" ] }, { "cell_type": "code", "execution_count": 17, "id": "52d3dc0e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_observatiepkey_parentfenomeentijddiepte_van_mdiepte_tot_mparametergroepparameterdetectieconditieresultaateenheid...rf_varQtn_avgQtn_medQtn_varF_avgF_medF_varIC_avgIC_medIC_var
0https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2006-08-0311.011.47Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN92.2%...0.4458409.5016199.4335750.4280629.6106209.5138100.6259503.326070NaN0.001339
1https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2006-07-068.58.96Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN62.0%...0.49540910.1095679.7963451.4989859.97542610.4167420.7509123.317791NaN0.003992
2https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2007-01-297.07.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN79.4%...1.37671313.50521712.9921104.1105028.3583718.3899591.7207873.171420NaN0.008375
3https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2007-04-174.54.98Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN54.8%...0.23702211.51109811.1034062.30022410.36503610.6134810.4210053.288280NaN0.002691
4https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/201...2007-02-288.08.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN87.6%...0.4500518.6592618.2389141.5030244.3386504.0288410.5059883.141798NaN0.000813
..................................................................
191https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-03-146.57.00Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN95.7%...4.93110923.64659821.72653726.98682811.32913711.0342135.9550553.091688NaN0.014351
192https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-03-207.57.90Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN97.8%...0.2202488.1065008.0265610.22055711.75457611.8618870.3345353.435978NaN0.000856
193https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-03-219.510.00Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN67.4%...1.9956517.5330107.3182990.6670498.1304567.3785472.6260263.353749NaN0.001325
194https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-08-299.09.50Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN81.7%...0.3166375.5957315.7534550.60654410.66822110.5025350.7686653.532824NaN0.004671
195https://www.dov.vlaanderen.be/data/observatie/...https://www.dov.vlaanderen.be/data/monster/202...2025-08-2913.013.48Onderkenning - proevenGehalte Organische stoffen (Gehalte Organische...NaN78.2%...0.1074212.4444502.3272360.1135233.1108403.2664070.3482813.525596NaN0.007681
\n", "

196 rows × 36 columns

\n", "
" ], "text/plain": [ " pkey_observatie \\\n", "0 https://www.dov.vlaanderen.be/data/observatie/... \n", "1 https://www.dov.vlaanderen.be/data/observatie/... \n", "2 https://www.dov.vlaanderen.be/data/observatie/... \n", "3 https://www.dov.vlaanderen.be/data/observatie/... \n", "4 https://www.dov.vlaanderen.be/data/observatie/... \n", ".. ... \n", "191 https://www.dov.vlaanderen.be/data/observatie/... \n", "192 https://www.dov.vlaanderen.be/data/observatie/... \n", "193 https://www.dov.vlaanderen.be/data/observatie/... \n", "194 https://www.dov.vlaanderen.be/data/observatie/... \n", "195 https://www.dov.vlaanderen.be/data/observatie/... \n", "\n", " pkey_parent fenomeentijd \\\n", "0 https://www.dov.vlaanderen.be/data/monster/201... 2006-08-03 \n", "1 https://www.dov.vlaanderen.be/data/monster/201... 2006-07-06 \n", "2 https://www.dov.vlaanderen.be/data/monster/201... 2007-01-29 \n", "3 https://www.dov.vlaanderen.be/data/monster/201... 2007-04-17 \n", "4 https://www.dov.vlaanderen.be/data/monster/201... 2007-02-28 \n", ".. ... ... \n", "191 https://www.dov.vlaanderen.be/data/monster/202... 2025-03-14 \n", "192 https://www.dov.vlaanderen.be/data/monster/202... 2025-03-20 \n", "193 https://www.dov.vlaanderen.be/data/monster/202... 2025-03-21 \n", "194 https://www.dov.vlaanderen.be/data/monster/202... 2025-08-29 \n", "195 https://www.dov.vlaanderen.be/data/monster/202... 2025-08-29 \n", "\n", " diepte_van_m diepte_tot_m parametergroep \\\n", "0 11.0 11.47 Onderkenning - proeven \n", "1 8.5 8.96 Onderkenning - proeven \n", "2 7.0 7.50 Onderkenning - proeven \n", "3 4.5 4.98 Onderkenning - proeven \n", "4 8.0 8.50 Onderkenning - proeven \n", ".. ... ... ... \n", "191 6.5 7.00 Onderkenning - proeven \n", "192 7.5 7.90 Onderkenning - proeven \n", "193 9.5 10.00 Onderkenning - proeven \n", "194 9.0 9.50 Onderkenning - proeven \n", "195 13.0 13.48 Onderkenning - proeven \n", "\n", " parameter detectieconditie \\\n", "0 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "1 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "2 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "3 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "4 Gehalte Organische stoffen (Gehalte Organische... NaN \n", ".. ... ... \n", "191 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "192 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "193 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "194 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "195 Gehalte Organische stoffen (Gehalte Organische... NaN \n", "\n", " resultaat eenheid ... rf_var Qtn_avg Qtn_med Qtn_var \\\n", "0 92.2 % ... 0.445840 9.501619 9.433575 0.428062 \n", "1 62.0 % ... 0.495409 10.109567 9.796345 1.498985 \n", "2 79.4 % ... 1.376713 13.505217 12.992110 4.110502 \n", "3 54.8 % ... 0.237022 11.511098 11.103406 2.300224 \n", "4 87.6 % ... 0.450051 8.659261 8.238914 1.503024 \n", ".. ... ... ... ... ... ... ... \n", "191 95.7 % ... 4.931109 23.646598 21.726537 26.986828 \n", "192 97.8 % ... 0.220248 8.106500 8.026561 0.220557 \n", "193 67.4 % ... 1.995651 7.533010 7.318299 0.667049 \n", "194 81.7 % ... 0.316637 5.595731 5.753455 0.606544 \n", "195 78.2 % ... 0.107421 2.444450 2.327236 0.113523 \n", "\n", " F_avg F_med F_var IC_avg IC_med IC_var \n", "0 9.610620 9.513810 0.625950 3.326070 NaN 0.001339 \n", "1 9.975426 10.416742 0.750912 3.317791 NaN 0.003992 \n", "2 8.358371 8.389959 1.720787 3.171420 NaN 0.008375 \n", "3 10.365036 10.613481 0.421005 3.288280 NaN 0.002691 \n", "4 4.338650 4.028841 0.505988 3.141798 NaN 0.000813 \n", ".. ... ... ... ... ... ... \n", "191 11.329137 11.034213 5.955055 3.091688 NaN 0.014351 \n", "192 11.754576 11.861887 0.334535 3.435978 NaN 0.000856 \n", "193 8.130456 7.378547 2.626026 3.353749 NaN 0.001325 \n", "194 10.668221 10.502535 0.768665 3.532824 NaN 0.004671 \n", "195 3.110840 3.266407 0.348281 3.525596 NaN 0.007681 \n", "\n", "[196 rows x 36 columns]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_df = pd.merge(geo_df_observaties, sonddata_df, on='pkey_observatie') # join the two dataframes together\n", "merged_df = merged_df.dropna(\n", " subset=[\"Qtn_avg\"]\n", ") # drop all rows with nan values\n", "merged_df" ] }, { "cell_type": "markdown", "id": "ec5d30e3", "metadata": {}, "source": [ "Finally, we can display these results in a chart:" ] }, { "cell_type": "code", "execution_count": 18, "id": "efc3aa19", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjoAAAHLCAYAAADBbjLhAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAA7ZBJREFUeJzs3XdYU2f7B/BvAlmMEPZQNg5QhgvFjaIoSsU66wLraK2jvp362ira2m21w9pqFRy1WvdCi1qtinuAKIiKgAtkJhBG5vP7wzfnZ2QjkECez3VxaU6enHPnJDm580wWIYSAoiiKoiiqFWLrOgCKoiiKoqimQhMdiqIoiqJaLZroUBRFURTVatFEh6IoiqKoVosmOhRFURRFtVo00aEoiqIoqtWiiQ5FURRFUa0WTXQoiqIoimq1aKJDURRFUVSrRRMdyiBER0eDxWIhPz9f16FQL4mKioKbm5vWNhaLhejo6EY7RmxsLFgsFjIzMxttn/Whef+9SKlU4qOPPoKzszPYbDYiIiIANP5zr6uqXgd9NHDgQHTu3FnXYVAtCE10KL2j+VLS/BkbG6NNmzaIiorCkydPdB1enfzyyy+IjY3VdRgMNze3RvvyzMzMxPTp0+Hp6Qk+nw8HBwf0798fy5Yta5T91ycOFouF7777rlmPW52ysjJER0fj9OnTdSq/adMmfPvttxg7diw2b96M//znP00bIICnT58iOjoaiYmJTX6s+iouLsby5cvh7+8PMzMzCAQCdO7cGR9//DGePn2qk5j0+XxRdWes6wAoqjorVqyAu7s7KioqcPHiRcTGxuLcuXO4desW+Hy+rsOr0S+//AIbGxtERUXpOpRGdf/+ffTo0QMCgQBvvvkm3NzckJ2djevXr+Prr7/G8uXL673PDRs2QK1WN0G0zausrIx5/gMHDtS675NPPsGiRYu0tv3zzz9o06YNVq9erbW9vLwcxsZNc2l++vQpli9fDjc3NwQEBGjdp8vX4cGDBwgJCcHDhw8xbtw4zJ49G1wuFzdv3sTGjRuxb98+3L17t9njqul8US0HTXQovTV8+HB0794dADBz5kzY2Njg66+/xsGDBzF+/HgdR1e1srIymJiY6DqMJrN69WpIpVIkJibC1dVV677c3NwG7ZPD4TRGaHrN2Ni4UvKSm5sLkUhUqayuknhdvQ5KpRKvv/46nj17htOnT6Nv375a969cuRJff/11s8fUGpJv6jnadEW1GP369QMApKena23/559/0K9fP5iamkIkEmHUqFFITU2tch/5+fkYP348hEIhrK2t8e6776KioqJSuW3btqFbt24QCASwsrLCxIkT8ejRI60ymr4C165dQ//+/WFiYoL//ve/cHNzw+3bt/Hvv/8yzW+aX/gKhQLLly9Hu3btwOfzYW1tjb59++L48eP1fk6afh/3799HVFQURCIRLCwsMH36dJSVldV4Lusax8vS09PRtm3bSkkOANjZ2VXa9ssvv6BTp07g8XhwcnLC3LlzIRaLtco0dt+Q27dvY9CgQRAIBGjbti0+//zzar+0jh49ypxnc3NzjBgxArdv364Un5mZGZ48eYKIiAiYmZnB1tYWH3zwAVQqFYDnzWi2trYAgOXLlzOvu6a58MU+Opomt1OnTuH27dtMWU2TV1V9dJ48eYIZM2bAyckJPB4P7u7umDNnDuRyOQCgsLAQH3zwAXx9fWFmZgahUIjhw4cjKSmJ2cfp06fRo0cPAMD06dOZ42qaWKt6HUpLS/H+++/D2dkZPB4PHTp0wHfffQdCiFY5FouFefPmYf/+/ejcuTN4PB46deqEY8eO1fJqAXv27EFSUhKWLFlSKckBAKFQiJUrV1banpKSguDgYJiYmKBNmzb45ptvtO6Xy+VYunQpunXrBgsLC5iamqJfv344deqUVrkXm0DXrFkDT09P8Hg8/PLLLzWeL6rloDU6VIuh6UhqaWnJbDtx4gSGDx8ODw8PREdHo7y8HD/99BP69OmD69evV7pwjx8/Hm5ubvjyyy9x8eJF/PjjjygqKsKWLVuYMitXrsSnn36K8ePHY+bMmcjLy8NPP/2E/v3748aNG1q/wgsKCjB8+HBMnDgRU6ZMgb29PQYOHIj58+fDzMwMS5YsAQDY29sDeP6F9+WXX2LmzJkIDAxEcXExrl69iuvXr2PIkCENfk7u7u748ssvcf36dfz++++ws7Or8VdwXeKoiqurK06cOIF//vkHgwYNqrac5hjLly9HSEgI5syZg7S0NKxbtw5XrlxBQkJCk9Qg5OTkIDg4GEqlEosWLYKpqSnWr18PgUBQqezWrVsRGRmJ0NBQfP311ygrK8O6devQt29f3LhxQ+s8q1QqhIaGomfPnvjuu+9w4sQJrFq1Cp6enpgzZw5sbW2xbt06zJkzB6NHj8brr78OAPDz86t0XFtbW2zduhUrV66EVCrFl19+CQDw9vau8jk9ffoUgYGBEIvFmD17Njp27IgnT55g9+7dKCsrA5fLxYMHD7B//36MGzcO7u7uePbsGX777TcMGDAAKSkpcHJygre3N1asWIGlS5di9uzZzA+H3r17V3lcQghee+01nDp1CjNmzEBAQAD+/vtvfPjhh3jy5EmlJrdz585h7969eOedd2Bubo4ff/wRY8aMwcOHD2FtbV3ta3bw4EEAwNSpU6st87KioiIMGzYMr7/+OsaPH4/du3fj448/hq+vL4YPHw7geZ+f33//HW+88QZmzZqFkpISbNy4EaGhobh8+XKlpqiYmBhUVFRg9uzZ4PF4GD16NEpKSup8vig9RihKz8TExBAA5MSJEyQvL488evSI7N69m9ja2hIej0cePXrElA0ICCB2dnakoKCA2ZaUlETYbDaZNm0as23ZsmUEAHnttde0jvXOO+8QACQpKYkQQkhmZiYxMjIiK1eu1CqXnJxMjI2NtbYPGDCAACC//vprpefQqVMnMmDAgErb/f39yYgRI2p8/vV9Tm+++abW40ePHk2sra1rPEZd4qjKrVu3iEAgIABIQEAAeffdd8n+/ftJaWmpVrnc3FzC5XLJ0KFDiUqlYrb//PPPBADZtGkTsy0yMpK4urpqPR4AWbZsWY2xZGRkEADk22+/ZbYtXLiQACCXLl3SisXCwoIAIBkZGYQQQkpKSohIJCKzZs3S2mdOTg6xsLDQ2h4ZGUkAkBUrVmiV7dKlC+nWrRtzOy8vr9q4Na/ViwYMGEA6depUqezL+5g2bRphs9nkypUrlcqq1WpCCCEVFRVa55mQ5+eHx+NpxX3lyhUCgMTExFTa18uvw/79+wkA8vnnn2uVGzt2LGGxWOT+/ftaMXO5XK1tSUlJBAD56aefKh3rRV26dCEWFhY1lnmR5nO3ZcsWZptMJiMODg5kzJgxzDalUklkMpnWY4uKioi9vb3WZ0bzPhIKhSQ3N1erfE3ni2o5aNMVpbdCQkJga2sLZ2dnjB07Fqampjh48CDatm0LAMjOzkZiYiKioqJgZWXFPM7Pzw9DhgxBXFxcpX3OnTtX6/b8+fMBgCm7d+9eqNVqjB8/Hvn5+cyfg4MD2rVrV6nam8fjYfr06XV+TiKRCLdv38a9e/eqvL8hz+ntt9/Wut2vXz8UFBSguLi4wXFUp1OnTkhMTMSUKVOQmZmJH374AREREbC3t8eGDRuYcidOnIBcLsfChQvBZv//ZWbWrFkQCoU4cuRIvY5bV3FxcejVqxcCAwOZbba2tpg8ebJWuePHj0MsFuONN97Qep2NjIzQs2fPSq8zUPV5fvDgQZM8Dw21Wo39+/cjPDyc6a/2Ik1zGI/HY86zSqVCQUEBzMzM0KFDB1y/fr1Bx46Li4ORkREWLFigtf39998HIQRHjx7V2h4SEgJPT0/mtp+fH4RCYa3nqLi4GObm5vWKzczMDFOmTGFuc7lcBAYGah3LyMgIXC4XwPPzWFhYCKVSie7du1d5TsaMGcM0P1KtC010KL21du1aHD9+HLt370ZYWBjy8/PB4/GY+7OysgAAHTp0qPRYb29v5Ofno7S0VGt7u3bttG57enqCzWYzzWL37t0DIQTt2rWDra2t1l9qamqlDrdt2rRhLqZ1sWLFCojFYrRv3x6+vr748MMPcfPmzVd6Ti4uLlq3NU17RUVFDY6jJu3bt8fWrVuRn5+Pmzdv4osvvoCxsTFmz56NEydO1Pg8uFwuPDw8mPsbW1ZWVqXXuKo4NAneoEGDKr3O8fHxlV5nPp9f6UvQ0tKyxnPcGPLy8lBcXFzrvDFqtRqrV69Gu3btwOPxYGNjA1tbW9y8eRMSiaRBx87KyoKTk1OlJETTxPbya/jy+xCo2zkSCoUoKSmpV2xt27atNC9RVcfavHkz/Pz8mH5otra2OHLkSJXnxN3dvV4xUC0H7aND6a3AwEDmV2xERAT69u2LSZMmIS0tDWZmZo1yjJcvlmq1GiwWC0ePHoWRkVGl8i8ft6q+HzXp378/0tPTceDAAcTHx+P333/H6tWr8euvv2LmzJn1fwJAlXECqNRhtLHjMDIygq+vL3x9fREUFITg4GD88ccfCAkJadDzaE6azslbt26Fg4NDpftfHiFV3TnWF1988QU+/fRTvPnmm/jss89gZWUFNpuNhQsXNtvooYa8DwGgY8eOuHHjBh49egRnZ+dGO9a2bdsQFRWFiIgIfPjhh7Czs4ORkRG+/PLLSgMagPp/lqmWgyY6VIuguUAFBwfj559/xqJFi5iRP2lpaZXK37lzBzY2NjA1NdXafu/ePa1fbvfv34darWY6nnp6eoIQAnd3d7Rv377B8b6cQL3IysoK06dPx/Tp0yGVStG/f39ER0dj5syZDXpODVVTHPWlSUizs7MBQOt5eHh4MOXkcjkyMjKaLBlydXWtsjnu5fOpaWKxs7NrtFhqes0bytbWFkKhELdu3aqx3O7duxEcHIyNGzdqbReLxbCxsWlQjJqO5yUlJVq1Onfu3GHubwzh4eH4888/sW3bNixevLhR9gk8PyceHh7Yu3ev1vOuz8SWTfGaUs2PNl1RLcbAgQMRGBiINWvWoKKiAo6OjggICMDmzZu1hizfunUL8fHxCAsLq7SPtWvXat3+6aefAIAZqfH666/DyMgIy5cvr/RLlBCCgoKCOsVqampaaRg1gEqPNzMzg5eXF2QyGQA06Dk1RG1xVOfs2bNQKBSVtmv6DmmaiEJCQsDlcvHjjz9qnceNGzdCIpFgxIgRr/oUqhQWFoaLFy/i8uXLzLa8vDz88ccfWuVCQ0MhFArxxRdfVPl88vLy6n1szfxJVb3uDaVZGuLQoUO4evVqpfs159bIyKjS+3XXrl2VZhLXJMl1iTEsLAwqlQo///yz1vbVq1eDxWIxn5lXNXbsWPj6+mLlypW4cOFCpftLSkqY0Yv1oan1efG8XLp0qcpjVKc+54vSX7RGh2pRPvzwQ4wbNw6xsbF4++238e2332L48OEICgrCjBkzmKHYFhYWVS55kJGRgddeew3Dhg3DhQsXsG3bNkyaNAn+/v4Anv/S//zzz7F48WJkZmYiIiIC5ubmyMjIwL59+zB79mx88MEHtcbZrVs3rFu3Dp9//jm8vLxgZ2eHQYMGwcfHBwMHDkS3bt1gZWWFq1evYvfu3Zg3bx7z2Po+p4aoSxxV+frrr3Ht2jW8/vrrzNDp69evY8uWLbCyssLChQsBPK+JWLx4MZYvX45hw4bhtddeQ1paGjM3yYsdSRvTRx99hK1bt2LYsGF49913meHlrq6uWn2QhEIh1q1bh6lTp6Jr166YOHEibG1t8fDhQxw5cgR9+vSp9AVfG4FAAB8fH+zcuRPt27eHlZUVOnfu/MrrMn3xxReIj4/HgAEDMHv2bHh7eyM7Oxu7du3CuXPnIBKJMHLkSKxYsQLTp09H7969kZycjD/++EOrNg14/v4WiUT49ddfYW5uDlNTU/Ts2bPK/inh4eEIDg7GkiVLkJmZCX9/f8THx+PAgQNYuHChVsfjV8HhcLB3716EhISgf//+GD9+PPr06QMOh4Pbt29j+/btsLS0rHIunZqMHDkSe/fuxejRozFixAhkZGTg119/hY+PD6RSaZ32UZ/zRekx3Qz2oqjqaYaXVzWcVqVSEU9PT+Lp6UmUSiUhhJATJ06QPn36EIFAQIRCIQkPDycpKSlaj9MM701JSSFjx44l5ubmxNLSksybN4+Ul5dXOs6ePXtI3759iampKTE1NSUdO3Ykc+fOJWlpaUyZ6oYHE/J8mPKIESOIubk5AcAMNf/8889JYGAgEYlERCAQkI4dO5KVK1cSuVyu9fj6PKe8vLwqz59mKHVV6hrHyxISEsjcuXNJ586diYWFBeFwOMTFxYVERUWR9PT0SuV//vln0rFjR8LhcIi9vT2ZM2cOKSoq0irTmMPLCSHk5s2bZMCAAYTP55M2bdqQzz77jGzcuLHKc3Lq1CkSGhpKLCwsCJ/PJ56eniQqKopcvXpVKz5TU9NKx69qyPj58+dJt27dCJfL1XoOrzK8nBBCsrKyyLRp05gpFjw8PMjcuXOZ4dMVFRXk/fffJ46OjkQgEJA+ffqQCxcukAEDBlSa5uDAgQPEx8eHGBsbaw2drup1KCkpIf/5z3+Ik5MT4XA4pF27duTbb79lhrW/GPPcuXMrPRdXV1cSGRlZaXtVioqKyNKlS4mvry8xMTEhfD6fdO7cmSxevJhkZ2fXet5ejl+tVpMvvviCuLq6Eh6PR7p06UIOHz5cqVx17yON6s4X1XKwCKmlpxhFURRFUVQLRfvoUBRFURTVarX4REcsFqN79+4ICAhA586dtSYtoyiKoijKsLX4piuVSgWZTAYTExOUlpaic+fOuHr1ao1rq1AURVEUZRhafI2OkZERM6xTJpOBEFLrBFUURVEURRkGnSc6Z86cQXh4OJycnMBisbB///5KZdauXQs3Nzfw+Xz07NlTa44M4Hnzlb+/P9q2bYsPP/xQa4IsiqIoiqIMl84TndLSUvj7+1eayE1j586deO+997Bs2TJcv34d/v7+CA0N1VqLRiQSISkpCRkZGdi+fTuePXvWXOFTFEVRFKXH9KqPDovFwr59+xAREcFs69mzJ3r06MFM3qVWq+Hs7Iz58+dj0aJFlfbxzjvvYNCgQRg7dmyVx5DJZFqzv2pWtbW2tqbTfVMURVFUC0EIQUlJCZycnMBmV19vo9czI8vlcly7dk1r/RM2m42QkBBmGu9nz57BxMQE5ubmkEgkOHPmDObMmVPtPr/88kssX768yWOnKIqiKKrpPXr0CG3btq32fr1OdPLz86FSqWBvb6+13d7enllYLisrC7Nnz2Y6Ic+fPx++vr7V7nPx4sV47733mNsSiQQuLi64e/curKysmuaJUFQVFAoFTp06heDgYHA4HF2HoxcUCgVOnjyJvLw8yOVyTJkyBTwer1ljOH36NG7cuIHIyEh6TWilHj16hJ07d+LNN99kXmP6edTWEs5HSUkJ3N3dtRadrYpeJzp1ERgYiMTExDqX5/F4VV44rays6JB0qlkpFAqYmJjA2tpaby8kzU2hUEAikaCkpAQzZsyAk5NTs8fw2muv4cmTJ0hISEBkZCRt0m6FioqKwOfzYW9vD6FQCIB+Hl/WEs6HJq7aPqM674xcExsbGxgZGVXqXPzs2TM4ODjoKCqKoprKhQsXkJeXh8GDB+skyQGeXzzDw8ORlZWFa9eu6SQGqmlpVqzX1y9wqnHpdaLD5XLRrVs3nDx5ktmmVqtx8uRJBAUF6TAyiqIa25UrV3Dq1CnY29ujR48eOo3F3d0dXbp0wfHjx1FcXKzTWKjGRxMdw6LzpiupVIr79+8ztzMyMpCYmAgrKyu4uLjgvffeQ2RkJLp3747AwECsWbMGpaWlmD59+isdd+3atVi7di1UKlWtZdVqNeRy+Ssdj6JeplAoYGxsjIqKijq9D1uzO3fu4N9//0WvXr2gUCj04pwMGDAAT548QXx8PEaMGEGbsBqAw+HAyMhI12FUokl09DE2qvHpPNG5evUqgoODmduajsKRkZGIjY3FhAkTkJeXh6VLlyInJwcBAQE4duxYpQ7K9TV37lzMnTsXxcXFsLCwqLacXC5HRkYG1Gr1Kx2Pol5GCIGDgwMePXpk0F+iCoUC5eXlCA4OhkAgQHl5ud6ckz59+qC0tBR3794Fl8vVdTgtkkgkgoODg168nhoKhQIcDkevYqKajs4TnYEDB9a6ZMO8efMwb968Zoro/xFCkJ2dDSMjIzg7O9c4Tp+i6kutVkMqlcLMzMxg31symQwSiQR2dnawsLAAIUTvzolYLIZCoYCVlRWtAagHQgjKysqYyV0dHR11HNH/0yQ6lGHQeaKjz5RKJcrKyuDk5MSsp0VRjUXTJMrn8/XmS705yWQylJWVwdTUFFZWVmCxWHp5TmxtbZGbmwu5XA5LS0tdh9OiCAQCAEBubi7s7Oz0JlFUKpU00TEg+nEl0VOaPgK0ypqiGpdcLkdhYSE4HA4sLS31ugnByMgIFhYWKC8vR0VFha7DaXE0PxI1/WL0gaZ/HGUYaKJTB/p8EaaolkahUKCwsBDGxsawsrLSm5qbmggEAvB4PEgkEtpfr5708fpJm64Mi/5fYZrI2rVr4ePjo/NhrBRlSJRKJQoKCsBms2Ftbd0ikhzg+Ze1hYUF1Go1SkpKdB0O9YpoomNYWsZVpgnMnTsXKSkpuHLliq5DoSiDoFKpWmSSo2FsbAxzc3OUlpbS6SZaONpHx7C0rCsN1WxOnz4NFosFsVis61CoVkCT5ABo0aOXTE1NweFwIBaLaRNWC0ZrdAwLTXRaoaioKLBYLLBYLHA4HLi7u+Ojjz7Sm46UmZmZYLFY9VqjrDGPSzUvtVqNwsJCqNVqWFtbt+hOoCwWCyKRCCqVis6Y3ILRRMewtNwrDlWjYcOGISYmBgqFAteuXWMWJ/z66691Ghet8jcsarUaBQUFUKlULT7J0eBwOLCwsIBYLAaXy6VTT7RAdNSVYaE1Oq0Uj8eDg4MDnJ2dERERgZCQEBw/fpy5XyaTYcGCBbCzswOfz0ffvn2r7K+UkJAAPz8/8Pl89OrVC7du3dK6/9y5c+jXrx8EAgGcnZ2xYMEClJaWMve7ubnhs88+w7Rp0yAUCjF79my4u7sDALp06QIWi4WBAwcCeN5cFhgYCFNTU4hEIvTp0wdZWVnMvtatWwdPT09wuVx06NABW7du1YqFxWLh999/x+jRo2FiYoJ27drh4MGD1Z6jrKwshIeHw9LSEqampujUqRPi4uKqLKtpynv5LyoqqsHxdejQodLxbt26heHDh8PMzAz29vaYOnUq8vPzmft3794NX19fCAQCWFtbIyQkROt86xNCCAoLC6FUKmFlZdWqfkELBAIIBAJIJBIolUpdh0PVE63RMSw00aknhUKB7OzsZv97lTkobt26hfPnz2vNB/TRRx9hz5492Lx5M65fvw4vLy+EhoaisLBQ67EffvghVq1ahStXrsDW1hbh4eFMLOnp6Rg2bBjGjBmDmzdvYufOnTh37lylWay/++47+Pv748aNG/j0009x+fJlAMCJEyeQnZ2NvXv3QqlUIiIiAgMGDMDNmzdx4cIFzJ49m2lq2rdvH9599128//77uHXrFt566y1Mnz4dp06d0jrW8uXLMX78eNy8eRNhYWGYPHlypeekMXfuXMhkMpw5cwbJycn4+uuvYWZmVmXZ3r17a70e//zzD/h8Pvr379/g+IYPH4633nqLiU8sFmPQoEHo0qULrl69imPHjuHZs2cYP348ACA7OxtvvPEG3nzzTaSmpuL06dN4/fXXa51ZXBcIISgqKmJmFG5tc1FpRmGx2WwUFRXp5WtAVY8mOoaFRQz8E6pZ6yo/Px/W1tZa91VUVCAjIwPu7u7g8/kAnn/ZrF+/vtnjnD17dp2nUI+KisK2bdvA5/OhVCohk8nAZrPx119/YcyYMSgtLYWlpSViY2MxadIkAM8/+G5ubli4cCE+/PBDnD59GsHBwdixYwcmTJgAACgsLETbtm0RGxuL8ePHY+bMmTAyMsJvv/3GHPvcuXMYMGAASktLwefz4ebmhi5dumDfvn1MmczMTLi7u+PGjRsICAhg9m1tbY3Tp09jwIABlZ5Tnz590KlTJ61zP378eJSWluLIkSMAnn/5fPLJJ/jss88AAKWlpTAzM8PRo0cxbNiwSvv08/PDmDFjsGzZsjqdV42CggIEBgZi2LBhWLt2bYPjKykpgVAoxJEjRxAWFobPP/8cZ8+exd9//83s4/Hjx3B2dkZaWhqkUim6deuGzMxMuLq61ivm5kQIgVgsRnl5OaysrJjPTl2o1WoUFxdDKBS2iFFZcrkc+fn5MDU1rXHNPENW1XVU177//nt07dqVqU0Gnl8D4+LiEBYWRpMgtIzzofn+lkgkEAqF1ZYz2EbK+qxe/iIbGxvMnj27iaKq+bj1ERwcjHXr1qG0tBSrV6+GsbExxowZA+B5TYxCoUCfPn2Y8hwOB4GBgUhNTdXaT1BQEPN/KysrdOjQgSmTlJSEmzdv4o8//mDKEEKgVquRkZEBb29vAED37t1rjdfKygpRUVEIDQ3FkCFDEBISgvHjxzPJXWpqaqXz3qdPH/zwww9a2/z8/Jj/m5qaQigUMmvtvGzBggWYM2cO4uPjERISgjFjxmg9vioKhQJjxoyBq6ur1rEbGp+5uTkTX1JSEk6dOlVlrVJ6ejqGDh2KwYMHw9fXF6GhoRg6dCjGjh2rV8sSEEIgkUhQXl4OS0tLvfliaypcLhdCoRDFxcXg8Xit/vm2FkqlkvbRMSAG+0rXdfXyl3E4HL1anK46pqam8PLyAgBs2rQJ/v7+2LhxI2bMmNFox5BKpXjrrbewYMGCSve5uLhoxVIXMTExWLBgAY4dO4adO3fik08+wfHjx9GrV686x/TyLw/N+klVmTlzJkJDQ3HkyBHEx8fjyy+/xKpVqzB//vxq9z9nzhw8evQIly9fbtCFsqb4pFIpwsPDq+ww7ujoCCMjIxw/fhznz59HfHw8fvrpJyxZsgSXLl1i+j3pEiEExcXFKCsrg0gkYtY5au1MTU0hk8kgFotha2vbYofOGxLadGVY9L9umHplbDYb//3vf/HJJ5+gvLyc6TCbkJDAlFEoFLhy5Qp8fHy0Hnvx4kXm/0VFRbh79y5TU9O1a1ekpKTAy8ur0l9NfTI091VVm9alSxcsXrwY58+fR+fOnbF9+3YAgLe3t1a8wPOO0i/HW1/Ozs54++23sXfvXrz//vvYsGFDtWW///57/PXXXzhw4EClZs7GiK9r1664ffs23NzcKp1PTbLIYrHQp08fLF++HDdu3ACXy9VqFtQlqVSK0tJSWFhYGNRIJM2QcwC0v04LQAihEwYaGJroGIhx48bByMgIa9euhampKebMmYMPP/wQx44dQ0pKCmbNmoWysrJKNT4rVqzAyZMncevWLURFRcHGxgYREREAgI8//hjnz5/HvHnzkJiYiHv37uHAgQOVOiO/zM7ODgKBgOlsK5FIkJGRgcWLF+PChQvIyspCfHw87t27xyRVH374IWJjY7Fu3Trcu3cP33//Pfbu3YsPPvigwedk4cKF+Pvvv5GRkYHr16/j1KlTzPFeduLECXz00Uf49ttvYWNjg5ycHOTk5EAikTRafHPnzkVhYSHeeOMNXLlyBenp6fj7778xffp0qFQqXLp0CV988QWuXr2Khw8fYu/evcjLy6s25uaiqckpKSmBubl5nWvwWhMjIyNYWlpCLpdDKpXqOhyqBprBFDTRMSDEwEkkEgKA5OfnV7qvvLycpKSkkPLych1E1nCRkZFk1KhRlbZ/+eWXxNbWlkilUlJeXk7mz59PbGxsCI/HI3369CGXL19myp46dYoAIIcOHSKdOnUiXC6XBAYGkqSkJK19Xr58mQwZMoSYmZkRU1NT4ufnR1auXMnc7+rqSlavXl0plg0bNhBnZ2fCZrPJgAEDSE5ODomIiCCOjo6Ey+USV1dXsnTpUqJSqZjH/PLLL8TDw4NwOBzSvn17smXLFq19AiD79u3T2mZhYUFiYmKqPE/z5s0jnp6ehMfjEVtbWzJ16tQq3weEELJs2TICoNJfZGRkg+NTqVREKBSSjRs3Mtvu3r1LRo8eTUQiEREIBKRjx45k4cKFRK1Wk5SUFBIaGkpsbW0Jj8cj7du3Jz/99FOV8TYXpVJJ8vLyyJMnT0hxcfEr70+lUpGioiKt170lKS4uJk+ePCEVFRW6DkVv6Nt1tLS0lERHR5PU1FSt7XK5nOzfv5/I5XIdRaZfWsL50Hx/SySSGsvRUVf1HHVFUY2lpY0wellFRQWzRIilpSV4PN4r77OlnxNCCAoKCqBUKml/nf/Rt+uoRCLBmjVrMGXKFHh6ejLbW8Ioo+bUEs5HXUddtbwrCUVROkX+N7KqsLAQHA4Htra2jZLktAYsFosZBScWi2l/HT1Em64MD010KIqqM4VCgfz8fJSWlkIoFLboBTqbipGREUQiEWQymd7OWm3INIkOHV5uOAw20Vm7di18fHzQo0cPXYdCUXqPEIKysjLk5+eDEAJbW1uYmZnRRVKrwefzYWpqiuLiYrq+m56hNTqGx2ATnblz5yIlJaXK9Z0oivp/arUaYrEYYrEYAoEANjY29EuiDoRCITgcDoqKiqqdy4lqfjTRMTwGm+hQFFU7uVyOvLw8VFRUQCQSQSQStchOwrqg6a+jVqshkUhofx09QRMdw0OvWBRFVUIIgVQqRX5+PthsNmxtbQ1qEsDGYmxsDJFIhPLycpSXl+s6HAo00TFEtDcWRVFaVCoVxGIxZDIZs14Y7YvTcAKBADKZDBKJBBwOh37B6phSqQRAOyMbElqjQ1EUQyaTIS8vDwqFAlZWVrCwsKBJTiMQCoUwMjKi/XX0gEKhgJGREW2CNSD0laYoilnGoaCgAMbGxrC1tdWLyd1aCzabDUtLS6hUKhQXF+s6HINGF/Q0PDTRoRpNZmYmWCwWEhMTAQCnT58Gi8ViZs+tSmxsLLMgItX0Xj7f0dHR8Pf3R0FBAaRSKczNzWFtba01N05UVBSzvllTiI6ORkBAQJPtX19wOBwIhUKUlZXR/jo6RBMdw0MTnVYoKioKLBYLLBYLXC4XXl5eWLFiBdM23VScnZ2RnZ2Nzp07N+lxdMXNzQ1r1qypc3l3d3ecOHGi2n1pFoI0NzdH165dsWvXrkaKtHoTJkzA3bt3mdsKhQJKpRIqlQo2NjYwNzenTVVNyMTEBHw+H2KxuMk/j1TVaKJjeAyuN5ZMJoNMJmNua6qRFQoF0xtfQ6FQgBACtVrdotrVCSEIDQ3Fpk2bIJPJEBcXh/nz58PY2BiLFi1qsuOyWCzY2dkBgNY5q+n8vVimJdC8H2pz8+ZNFBUVoV+/ftWWj46OxsSJE6FWq7F69WpMmDABjo6O6N27d2OHzeDxeODxeFCpVCgpKUFFRQXYbDZsbGzAYrGqjJUQUufn3RCaYddqtZr5f1MeT9c0a+sVFRVVWl+vNdK8rpq+Mbomk8lgbGxc5fX+xX8NXUs4H3WNzeASnS+//BLLly+vtP3UqVOVhs8aGxvDwcEBUqm0Rc1uqrmgmJiYwMTEBJMnT8aePXuwf/9+vPPOOxCLxVi0aBGOHTsGuVyO3r174+uvv2YWuHv48CE++ugjXLx4EQqFAi4uLli+fDmGDh0KsViMDz/8EKdOnUJpaSmcnJzw3nvvYfLkyXj48CH8/f1x5swZ+Pr6oqysDABw/PhxrFixAunp6fD19cUPP/wAHx8fAM8X/NP0D3n48CECAgJw8uRJdOnShXk+69atwy+//IKkpKQqOxD6+flh6tSpuHPnDo4dOwYLCwv85z//waxZs5gyEokEn376KeLi4iCXyxEQEICVK1fC19cXAJCRkYElS5bg6tWrKCsrQ/v27bF06VIMHDgQADBy5EhkZWXhvffew3vvvQcAKCoqqvY12LVrFwYNGlTtsGK1Wg0ulwt7e3sAwBdffIE//vgDe/bsQefOnXH79m0sXrwYV65cgUAgwGuvvYbPP/8cZmZmAIBz585h2bJluHPnDoyNjdGxY0ds2LABLi4uSE5Oxn//+18kJiaCxWLBw8MDq1evRpcuXbB9+3YsXrwYd+7cASGEOZ8//vgjvvvuOxQVFSE0NBRr1qyBhYUF835SKpUoLi7Gjh078N///hepqala61tNnjwZZmZm+O2336o8H0+ePMHSpUvxzz//QC6Xo3379vj222/RvXt3yGQyrb4r169fx2effYabN29CoVDA19cXX3zxBfz9/QEA8+bNQ15eHnbu3MnsX6FQwMfHB0uXLsXUqVOrfV30hbGxMWQyGfLz88HlcnUdTpOSy+UoLy/HmTNn9KIW6+HDh6ioqEBcXFyV9x8/fryZI9Jv+nw+NN8xtTG4RGfx4sXMFxXwvEbH2dkZwcHBVa5e/ujRI5iZmf1/x8yyMuDOneYM+bmOHYE6zmPC4XBgbGystZqrmZkZs8LrtGnTcP/+fRw4cABCoRCLFi3CxIkTcevWLXA4HCxevBgqlQr//vsvTE1NkZKSAqFQCKFQiCVLluD+/fuIi4uDjY0N7t+/j/LycgiFQuZLWDMkWZM4Ll++HKtXr4aDgwOWLFmCyZMn486dO+BwOODz+WCxWBAKhejcuTMGDx6MXbt2YcCAAUzsO3bswPTp06vty8Nms/HTTz9h8eLFWLlyJeLj4/Hee+/Bz88PQ4YMAQCMHTsWAoEAcXFxsLCwwPr16zF69GjcuXMHVlZWAIDw8HB89dVX4PF42Lp1K9544w2kpqbCxcUF+/fvR5cuXTBr1izMnDkTAGpcLTc+Ph4LFy6stgybzWYSBU1zEYfDAYvFgpGREcaNG4devXrh0qVLyM3NxezZs7FkyRLExMRAqVRiypQpmDlzJnbs2AG5XI7Lly8zr9GcOXMQEBCA3377DUZGRkhMTIRIJGJG/gD/vx6TiYkJMjIycPjwYRw6dAjFxcWYNWsWFi9ejG3btlV6P02dOhWLFi3C6dOnMW7cOABAbm4u4uPjcezYsSqfr1QqxWuvvYY2bdrgwIEDcHBwwPXr1yEQCCAUCsHj8WBkZAShUMjM3zN9+nR0794dhBB8//33mDBhAtLS0mBubo63334bAwcORGlpKRwdHQEA+/btQ3l5OSIjI5n3ob4rLS1FSUkJhEJhq052KioqIBAI0L9/f73o4P7nn3/CxsYGYWFhWtsVCgWOHz+OIUOG0KYttIzzUeeO/cTASSQSAoDk5+dXuq+8vJykpKSQ8vLy/9947RohQPP/XbtW5+cUGRlJRo0aRQghRK1Wk+PHjxMej0c++OADcvfuXQKAJCQkMOXz8/OJQCAgf/31FyGEEF9fXxIdHV3lvsPDw8n06dOrvC8jI4MAIDdu3CCEEHLq1CkCgOzYsYMpU1BQQAQCAdm5cychhJCYmBhiYWHB3L9z505iaWlJKioq/ne6rxEWi0UyMjKqfb6urq5k2LBhWtsmTJhAhg8fTggh5OzZs0QoFDL71PD09CS//fZbtfvt1KkT+emnn7SOs3r16mrLazx+/JhwuVxSVFRUY8zff/89KSoqIuXl5eSLL74gAMjhw4fJ+vXriaWlJZFKpUz5I0eOEDabTXJyckhBQQEBQE6fPl3lvs3NzUlsbKzWNpVKRQoKCsj3339PhEIhUalUhBBCli1bRoyMjMjjx4+ZskePHiVsNptkZ2cTQrTfT4QQMmfOHObcEkLIqlWriIeHB1Gr1VXG89tvvxFzc3NSUFBQ5f3Lli0j/v7+TJxFRUVMfJpt5ubm5NChQ8w2Hx8f8vXXXzO3w8PDSVRUVJX711dqtZrk5+eT7OxsolQqdR1Ok6nyOqpDP//8Mzl69Gil7XK5nOzfv5/I5XIdRKV/WsL50Hx/SySSGssZXI3OK+vYEbh2TTfHrYfDhw/DzMwMCoUCarUakyZNQnR0NE6ePAljY2P07NmTKWttbY0OHTogNTUVALBgwQLMmTMH8fHxCAkJwZgxY+Dn5wcAmDNnDsaMGYPr169j6NChiIiIqLVPSVBQEPN/KysrrWO9LCIiAnPnzsW+ffswceJExMbGIjg4GG5ubnU+hua2puNwUlISpFJppRq78vJypKenA3he6xAdHY0jR44gOzsbSqUS5eXlePjwYY3HrcrBgwfRt2/fWkeTLVq0CJ9++ikqKipgZmaGr776CiNGjMB7770Hf39/mJqaMmX79OkDtVqNtLQ09O/fH1FRUQgNDcWQIUMQEhKC8ePHM7Ub7733HmbOnImtW7ciJCQEo0aNgpWVFdRqNUxNTcFisbSaAF1cXNCmTRutc6c5loODQ6W4Z82ahR49euDJkydo06YNYmNjmQ7wVUlMTESXLl2YmrPa5Obm4oMPPsC///6L3NxcqFQqlJWVab0WM2fOxPr16/HRRx/h2bNnOHr0KP7555867V9fsFgsiEQi5OXlQSwWw8rKinYEb2KEEEgkEqZZljIMNNGpLxMToGtXXUdRq+DgYKxbtw5cLhdOTk71mgV05syZCA0NxZEjRxAfH48vv/wSq1atwvz58zF8+HBkZWUhLi4Ox48fx+DBgzF37lx89913jRI3l8vFtGnTEBMTg9dffx3bt2/HDz/88Er7lEqlcHR0xOnTpyvdp0lGPvjgAxw/fhzfffcdvLy8IBAIMHbs2Ab1zTp48CBee+21Wst98MEHGDNmDBwcHODo6FivL7mYmBgsWLAAx44dw86dO/HJJ5/g+PHj6NWrF6KjozFp0iQcPnwYhw8fxrJly/Dbb79hypQpjdJE0qVLF/j7+2PLli0YOnQobt++jSNHjlRbXiAQ1Gv/77zzDiQSCX744Qe4urqCx+MhKChI67WYNm0aFi1ahAsXLuD8+fNwd3dHv379GvycdEXThFhYWIjS0tIW0+zWUpWXl0OhUNBEx8DQ4eWtlKmpKby8vODi4qKV5Hh7e0OpVOLSpUvMtoKCAqSlpTEdhIHnQ8Xffvtt7N27F++//z42bNjA3Gdra4vIyEhs27YNa9aswfr162uM5eLFi8z/i4qKcPfuXXh7e1dbfubMmThx4gR++eUXKJVKvP7667U+3xePobmtOUbXrl2Rk5MDY2NjeHl5af3Z2NgAABISEhAVFYXRo0fD19cXDg4OyMzM1Nonl8uFSqWqMQ6pVIpTp05h1KhRtcZsY2MDDw8PODg4aCU53t7eSEpKQmlpKbMtISEBbDYbHTp0YLZ16dIFixcvxvnz59G5c2ds376duc/T0xPTpk3Dtm3bEB4ejr1791ab7D58+BBPnz5lbl+8eLHSsV42c+ZMxMbGIiYmBiEhIXB2dq62rJ+fHxITE1FYWFjzCfmfS5cuYd68eQgLC0OnTp3A4/GQn5+vVcba2hoRERGIiYlBbGwspk+fXqd96yM+nw9TU1MUFxe3qEEPLZFEIgEAmugYGJroGJh27dph1KhRmDVrFs6dO4ekpCRMmTIFbdq0Yb6cFy5ciL///hsZGRm4fv06Tp06xSQNS5cuxYEDB3D//n3cvn0bhw8frjFpAYAVK1bg5MmTuHXrFqKiomBjY1PjBHTe3t7o1asXPv74Y7zxxht1qhFISEjAN998g7t372Lt2rXYtWsX3n33XQBASEgIgoKCEBERgfj4eGRmZuL8+fPMKCvNedm7dy8SExORlJSESZMmVRre7ObmhjNnzuDJkyeVvng1jh07hvbt29fa1FaTyZMng8/nIzIyErdu3cKpU6cwf/58TJ06Ffb29sjIyMDixYtx4cIFZGVlIT4+Hvfu3YO3tzfKy8vx9ttv48CBA8jIyEBaWhoSExNrfI00x0pKSsLZs2exYMECjB8/vspmK41Jkybh8ePH2LBhA958880an88bb7wBBwcHREREICEhAQ8ePMCePXtw4cKFKst7eHhg27ZtSE1NxaVLlzB58uQq3wMzZ87E5s2bkZqaisjIyBpj0HdCoRAcDocuEdHEaKJjmGiiY4BiYmLQrVs3jBw5EkFBQSCEIC4ujulZr1KpMHfuXHh7e2PYsGFo3749fvnlFwDPazUWL14MPz8/9O/fH0ZGRtixY0eNx/vqq6/w7rvvolu3bsjJycGhQ4dqbUKZMWMG5HJ5rV+iGu+//z6uXr2KLl264PPPP8f333+P0NBQAM/7QsTFxaF///6YPn062rdvj4kTJyIrK4sZ3v3999/D0tISvXv3Rnh4OEJDQ9H1pSbKFStWIDMzE56enrC1ta0yjgMHDtSp2aomJiYm+Pvvv1FYWIgePXpg7NixGDx4MH7++Wfm/jt37mDMmDFo3749Zs+ejblz52L27NmQSqXIycnBggUL0LdvX0yZMgXDhw+vckoFDS8vL7z++usICwvD0KFD4efnx7ze1bGwsMCYMWNgZmZW66zJXC4X8fHxsLOzQ1hYGHx9ffHVV19VO6fKTz/9BLFYjK5du2Lq1KlYsGABMz/Ti0JCQuDo6IjQ0FA4OTnVGIO+Y7FYsLS0hFqthkQiYeYTohqXRCKBkZGRVv83qvVjEQP/RBUXFzMTeFU1vDwjIwPu7u56MSzSkHz22WfYtWsXbt68WWtZNzc3LFy4EAsXLmz6wGqgVCphb2+Po0ePIjAwsNbyarUaxcXFEAqFr7zAoFKpRFFRERQKBYRCIdPpuCkNHjwYnTp1wo8//tho+6zPOZFKpWjTpg3Tn6s1KCsrg1gsZob+twb6dB2Nj49HWloa5s+fX+k+hUKBuLg4hIWF6e1w6ubUEs6H5vtbM3VKdWhnZEqvSKVSZGZm4ueff8bnn3+u63DqpbCwEP/5z3/Qo0ePZjumWq1GaWkppFIpM8NxU8/JUlRUhNOnT+P06dO11vw0BbVajfz8fKxatQoikeiVa9D0iYmJCeRyOSQSCTgcjt5+wbRUdMSVYaKJDqVX5s2bhz///BMRERF1brbSF3Z2dvjkk0+a5VhqtRplZWWQSqXMsHFzc/NXrhmqiy5duqCoqAhff/11jR2Wm8rDhw/h7u6Otm3bIjY2tl4jClsCoVAIuVyOoqIi2Nra0iHnjUgikVTb7Ey1Xq3rCkG1eLGxsYiNja3XY14eHdWaEUKYGhy1Wg0TExOYmZk165e9rs+3m5tbq+7DwmazYWlpiby8PKZqnmocEokEXl5eug6DamYGm+isXbsWa9eurXW4MEXpA0IIU4OjUql0kuBQzYfD4TB9D7hcbr3nIqIqUyqVkEqlNHE0QAY76mru3LlISUnBlStXdB0KRVVLk+Dk5uYyX3q2trYQiUQ0yWnlTExMwOfzIRaL9WIxzJZOsy4STXQMj8EmOhSlzzQJjmZ5AA6HA1tbW1haWtIOqgZCs0QEm81GUVFRq26uaw50Dh3DRX8SUpQeIYSgoqICJSUlUCqV4PF4EIlErXp1a6p6mv46+fn5zErnVMNoEh16Dg0PTXQoSg8QQiCTyVBSUgKFQkETHIrB5XJhbm6OkpIScLlcnc9F01JJJBKYmprSGlEDRBMditIhQgjkcjmT4HC5XFhbW4PH4+k6NEqPmJmZQS6XQywWw9bWttpZpanq0Tl0DBfto0M1mszMTLBYLCQmJgIATp8+DRaLBbFYXO1jYmNjmRXEm8LAgQO1Zkx2c3PDmjVr6vz4l59TfdR2LLlcDplMxix2aWVl1aqTnKioqFqXi2jtXn5PsFgs7N+/v9rymvdfUlIS8zkRi8WN2l+nthhaC5roGC6a6LRCUVFRYLFYYLFY4HK58PLywooVK5p85IazszOys7PRuXPnJj3Oq7hy5Qpmz57dqPusb7Iml8tRUFDAJDiWlpawsbEBn8/XyeRwTZ1s6sLmzZvRt2/fKu+LjY1lPh9sNhtt27bF9OnTkZub2+Rxvcr7z8jICJaWlpDJZJBKpY0cWetX2zIBVOtFm65aqWHDhiEmJgYymQxxcXGYO3cuOBwOFi9e3GTHNDIyqnHFa32gy1lRNU1UMpkMxsbGEIlEkMlk4PF4dPbbRlbb4qpCoRBpaWlQq9VISkrC9OnT8fTpU/z9999NGtervv94PB7MzMxQUlICHo9H+3DVESGE1ugYMFqj00rxeDw4ODjA1dUVc+bMQUhICA4ePAjg+VpF06ZNg6WlJUxMTDB8+HDcu3ePeWxWVhbCw8NhaWkJU1NTdOrUCXFxccxjJ0+eDFtbWwgEArRr1w4xMTEAqm/mSUhIgJ+fH/h8Pnr16oVbt25VGXNmZibYbDauXr2qtX3NmjVwdXWFWq2u8nG//PIL2rVrBz6fD3t7e4wdO7ba8/Jy08GdO3fQt29f8Pl8+Pj44MSJE1VW5T948ADBwcEwMTGBv78/Lly4AOB589z06dMhkUiYWoLo6GitxyoUCkyePBlhYWFQKpUQiURMP4v27dtj48aNVcaqqWnZv38/8/xCQ0Px6NEjrXIHDhxA165dwefz4eHhgeXLl2vV3n3//ffw9fWFqakpnJ2d8c477zA1AtXFv2LFiipr5gICAvDpp59We35v376NkSNHQigUwtzcHP369UN6enqVZY8dO4a+fftCJBLB2toaI0eO1Co7aNAgzJs3T+sxeXl54HK5OHnyZLUxVFRUID4+vsZEh8ViwcHBAU5OThg+fDgWLFiAEydOoLy8HGq1GitWrEDbtm3B4/EQEBCAY8eOMY+Vy+WYN28eHB0dwefz4erqii+//BLA8y/U6OhouLi4gMfjwcnJCQsWLGAeW1VzZnZ2NoYPHw6BQAAPDw/s3r27ypgJIfDy8sJvv/0GLpeLoqIiqNVqJCYmgsVi4f79+9U+302bNqFTp07g8XhwdHSsdF5f9PHHH6N9+/YwMTGBh4cHPv30UygUCgAN/4zqWnl5OfPZowwPrdGpJ0WZAvl38pv9uDYdbcAxafhoAYFAgIKCAgDPm7bu3buHgwcPQigU4uOPP0ZYWBhSUlLA4XAwd+5cyOVynDlzBqampkhJSYGZmRkA4NNPP0VKSgqOHj0KGxsb3L9/H+Xl5TUe+8MPP8QPP/wABwcH/Pe//0V4eDju3r1bafSDm5sbQkJCEBMTg+7duzPbY2JiEBUVVeU6TlevXsWCBQuwdetW9O7dG4WFhTh79mydzolKpUJERARcXFxw6dIllJSU4P3336+y7JIlS/Ddd9+hXbt2WLJkCd544w3cv38fvXv3xpo1a7B06VKkpaUBAHOuADBz4bzxxhuIiIhgZjUGgMOHD6O8vBwTJkyoNsaysjKsXLkSW7ZsAZfLxTvvvIOJEyciISEBAHD27FlMmzYNP/74I5NUaJpGli1bBuD5EOUff/wR7u7uePDgAd555x189NFH+OWXX6qNXywWY/ny5bhy5QqzSOmNGzdw8+ZN7N27t8pYnzx5gv79+2PgwIH4559/IBQKkZCQUG2TaWlpKd577z34+flBKpVi6dKlGDNmDE6fPg0AmDlzJubNm4dVq1Yx/Za2bduGNm3aYNCgQdWes5MnT6JNmzbo2LFjtWVeJhAIoFaroVQq8euvv2LVqlX47bff0KVLF2zatAmvvfYabt++jXbt2uHHH3/EwYMH8ddff8HFxQWPHj1iks89e/Zg9erV2LFjBzp16oScnBwkJSXVeOxPP/0UX331FX744Qds3boVEydORHJyMry9vbXKsVgsvPnmm4iNjcV//vMfZo6lTZs2oX///tUubbBu3Tq89957+OqrrzB8+HBIJBLm/VMVc3NzxMbGwsnJCcnJyZg1axbMzc3x0UcfNegzqg/oHDoGjhg4iURCAJD8/PxK95WXl5OUlBRSXl7ObHt67SmJRnSz/z299rTOzykyMpKMGjWKEEKIWq0mx48fJzwej3zwwQfk7t27BABJSEhgyufn5xOBQED++usvQgghvr6+JDo6usp9h4eHk+nTp1d5X0ZGBgFAbty4QQgh5NSpUwQA2bFjB1OmoKCACAQCsnPnTkIIITExMcTCwoK5f+fOncTS0pJUVFQQQgi5du0aYbFYJCMjo8pj7tmzhwiFQlJcXFzl/QMGDCDvvvsuc9vV1ZWsXr2aEELI0aNHibGxMcnOzmbuP378OAFA9u3bp/Wcfv/9d6bM7du3CQCSmppa5XNQKBSkqKiItG3blixfvpxIpVKiVquJj48P+frrr5lyI0eOJJMmTSIqlarK2GNiYggAcvHiRWZbamoqAUAuXbpECCFk8ODB5IsvvtB63NatW4mjo2OV+ySEkF27dhFra2ut47wYv8bw4cPJnDlzmNvz588nAwcOrHa/ixcvJu7u7kQul1d5/4vvy6rk5eUx702VSkXKy8uJpaUl814hhBA/P79q35sas2bNIh988EG197/8fO/evUvat29PunfvTgghxMnJiaxcuVLrMT169CDvvPMOIeT5eRg0aBBRq9WV9r1q1SrSvn37as/Bi+8/QggBQN5++22tMj179mTO+8ufqSdPnhAjIyNy6dIlUlZWRjIzM4m1tTWJjY2t9vk6OTmRJUuWVHv/i+/3qnz77bekW7duzO36fkaruo42t5SUFBIdHU2kUmm1ZeRyOdm/f3+1r52haQnnQ/P9LZFIaixHa3TqyaajDWZfa9zOrHU9bn0cPnwYZmZmUCgUUKvVmDRpEqKjo3Hy5EkYGxujZ8+eTFlra2t06NABqampAIAFCxZgzpw5iI+PR0hICMaMGQM/Pz8AwJw5czBmzBhcv34dQ4cORUREBHr37l1jLEFBQcz/raystI71soiICMydOxf79u3DxIkTERsbi+DgYLi5uVVZfsiQIXB1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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# define boundaries for Roberson's graph and plot them\n", "X1 = np.array(\n", " [\n", " -3,\n", " -1,\n", " -0.890243902439026,\n", " -0.774390243902441,\n", " -0.66158536585366,\n", " -0.548780487804878,\n", " -0.439024390243903,\n", " -0.326219512195123,\n", " -0.210365853658537,\n", " -0.112804878048781,\n", " -0.00609756097560987,\n", " 0.082317073170729,\n", " 0.161585365853658,\n", " 0.204268292682926,\n", " 0.225609756097559,\n", " 0.397940008672038,\n", " 0.52244423350632,\n", " 3,\n", " ]\n", ")\n", "Y1 = np.array(\n", " [\n", " 1,\n", " 1,\n", " 0.998624484181568,\n", " 0.98624484181568,\n", " 0.961485557083906,\n", " 0.92847317744154,\n", " 0.878954607977991,\n", " 0.812929848693259,\n", " 0.726272352132049,\n", " 0.631361760660247,\n", " 0.50343878954608,\n", " 0.359009628610727,\n", " 0.189821182943603,\n", " 0.0784044016506188,\n", " 0,\n", " -0.476892499139314,\n", " -1,\n", " -1,\n", " ]\n", ")\n", "X2 = np.array(\n", " [\n", " -3,\n", " 0.079181246,\n", " 0.131097560975609,\n", " 0.182926829268291,\n", " 0.246951219512193,\n", " 0.292682926829266,\n", " 0.335365853658536,\n", " 0.38109756097561,\n", " 0.445121951219511,\n", " 0.493902439024389,\n", " 0.551829268292683,\n", " 0.631097560975609,\n", " 0.740853658536585,\n", " 0.838414634146341,\n", " 0.984756097560975,\n", " 1.04878048780488,\n", " 1.17609125905568,\n", " 3,\n", " ]\n", ")\n", "Y2 = np.array(\n", " [\n", " 4,\n", " 4,\n", " 3.03301237964236,\n", " 2.88445667125172,\n", " 2.72352132049518,\n", " 2.6079779917469,\n", " 2.50068775790921,\n", " 2.40165061898212,\n", " 2.26134800550206,\n", " 2.15405777166437,\n", " 2.04264099037139,\n", " 1.91884456671252,\n", " 1.82806052269601,\n", " 1.78266850068776,\n", " 1.75378266850069,\n", " 1.7455295735901,\n", " 1.74036268949424,\n", " 1.73639650227664,\n", " ]\n", ")\n", "X3 = np.array(\n", " [\n", " -3,\n", " -2,\n", " -1.04575749056068,\n", " -0.522878745280338,\n", " -0.0457574905606751,\n", " 0.216463414634144,\n", " 0.420731707317072,\n", " 0.594512195121951,\n", " 0.771341463414634,\n", " 0.887195121951219,\n", " 0.963414634146341,\n", " 0.996951219512195,\n", " 1.04139268515823,\n", " 1.11394335230684,\n", " 1.20411998265592,\n", " 1.252574989,\n", " 1.30102999566398,\n", " 1.47712125471966,\n", " 1.61172330800734,\n", " 3,\n", " ]\n", ")\n", "Y3 = np.array(\n", " [\n", " -0.107504662868674,\n", " -0.107504662868674,\n", " -0.099484807248056,\n", " -0.0784326862439331,\n", " -0.0182837690892966,\n", " 0.045392022008251,\n", " 0.15268225584594,\n", " 0.292984869325996,\n", " 0.491059147180191,\n", " 0.664374140302613,\n", " 0.808803301237964,\n", " 0.878954607977991,\n", " 0.994223003013752,\n", " 1.19471939352921,\n", " 1.49546397930239,\n", " 1.6959604,\n", " 1.8964567603333,\n", " 2.89893871291058,\n", " 4,\n", " 4,\n", " ]\n", ")\n", "\n", "X4 = np.array(\n", " [\n", " -3,\n", " -2,\n", " -1,\n", " -0.522878745280338,\n", " -0.301029995663981,\n", " -0.140243902439025,\n", " -0.0213414634146342,\n", " 0.128048780487803,\n", " 0.277439024390242,\n", " 0.378048780487804,\n", " 0.47560975609756,\n", " 0.570121951219511,\n", " 0.655487804878049,\n", " 0.71951219512195,\n", " 0.774390243902439,\n", " 0.845098040014257,\n", " 0.954242509439325,\n", " 1.07918124604762,\n", " 1.21218760440396,\n", " 3,\n", " ]\n", ")\n", "Y4 = np.array(\n", " [\n", " 0.548714105446867,\n", " 0.548714105446867,\n", " 0.567812943589182,\n", " 0.610254806127659,\n", " 0.652696668666137,\n", " 0.664374140302613,\n", " 0.734525447042641,\n", " 0.837689133425034,\n", " 0.969738651994498,\n", " 1.08115543328748,\n", " 1.20082530949106,\n", " 1.34112792297111,\n", " 1.49793672627235,\n", " 1.63823933975241,\n", " 1.80742778541953,\n", " 2.03205720116665,\n", " 2.45647582655142,\n", " 3.09310376462857,\n", " 4,\n", " 4,\n", " ]\n", ")\n", "\n", "X5 = np.array(\n", " [\n", " -3,\n", " -2,\n", " -1.39794000867204,\n", " -0.823908740944319,\n", " -0.503048780487805,\n", " -0.332317073170732,\n", " -0.128048780487805,\n", " 0.0579268292682913,\n", " 0.222560975609754,\n", " 0.390243902439023,\n", " 0.506097560975609,\n", " 0.582317073170732,\n", " 0.643292682926829,\n", " 0.658536585365853,\n", " 0.673780487804877,\n", " 0.679878048780487,\n", " 0.700578048780487,\n", " 3,\n", " ]\n", ")\n", "Y5 = np.array(\n", " [\n", " 0.793022628459515,\n", " 0.793022628459515,\n", " 0.803892063893693,\n", " 0.84374666048568,\n", " 0.907840440165061,\n", " 0.994497936726272,\n", " 1.11416781292985,\n", " 1.25034387895461,\n", " 1.40302613480055,\n", " 1.60522696011004,\n", " 1.79917469050894,\n", " 1.98899587345254,\n", " 2.30674002751032,\n", " 2.45116918844567,\n", " 2.69050894085282,\n", " 2.98762035763411,\n", " 4,\n", " 4,\n", " ]\n", ")\n", "\n", "X6 = np.array(\n", " [\n", " -3,\n", " -2,\n", " -1.39794000867204,\n", " -1,\n", " -0.771341463414636,\n", " -0.533536585365855,\n", " -0.283536585365854,\n", " -0.0487804878048781,\n", " 0.164634146341461,\n", " 0.314024390243902,\n", " 0.393292682926828,\n", " 0.423780487804877,\n", " 0.544068044350276,\n", " 0.698970004336019,\n", " 0.807589142389764,\n", " 3,\n", " ]\n", ")\n", "Y6 = np.array(\n", " [\n", " 1.39511433919444,\n", " 1.39511433919444,\n", " 1.4073041167125,\n", " 1.41953232462173,\n", " 1.4484181568088,\n", " 1.50206327372765,\n", " 1.62173314993122,\n", " 1.76342799356294,\n", " 1.97661623108666,\n", " 2.20357634112792,\n", " 2.36863823933975,\n", " 2.45942228335626,\n", " 2.81319179046214,\n", " 3.42268066636517,\n", " 4,\n", " 4,\n", " ]\n", ")\n", "\n", "X7 = np.array(\n", " [\n", " -3,\n", " -2,\n", " -1.52287874528034,\n", " -1.15490195998574,\n", " -1,\n", " -0.786585365853661,\n", " -0.588414634146342,\n", " -0.39329268292683,\n", " -0.219512195121951,\n", " -0.076219512195122,\n", " 0.00609756097560594,\n", " 0.0304878048780472,\n", " 0.113943352306837,\n", " 0.204119982655925,\n", " 0.34409740359441,\n", " 3,\n", " ]\n", ")\n", "Y7 = np.array(\n", " [\n", " 2.10124566205107,\n", " 2.10124566205107,\n", " 2.11851911705649,\n", " 2.15306602706735,\n", " 2.17881705639615,\n", " 2.22833562585969,\n", " 2.3191196698762,\n", " 2.45116918844567,\n", " 2.6162310866575,\n", " 2.8101788170564,\n", " 2.97111416781293,\n", " 3.03301237964236,\n", " 3.21538350990112,\n", " 3.47448533498253,\n", " 4,\n", " 4,\n", " ]\n", ")\n", "\n", "Y8 = np.array(\n", " [\n", " 1,\n", " 1.236584507,\n", " 1.467593452,\n", " 1.641390069,\n", " 2.00087167,\n", " 2.561283296,\n", " 3.04027751,\n", " 3.864751926,\n", " 4.513435735,\n", " 5.329418952,\n", " 5.737406993,\n", " 6.934489818,\n", " 7.871627474,\n", " 9.405725877,\n", " 10.71461614,\n", " 13.26504071,\n", " 14.33512247,\n", " 16.67039577,\n", " 17.48101531,\n", " 20.73321573,\n", " 25.76980375,\n", " 30.8239924,\n", " ]\n", ")\n", "X8 = np.array(\n", " [\n", " 5.218732546,\n", " 5.224237832,\n", " 5.235265833,\n", " 5.251851499,\n", " 5.290756014,\n", " 5.324332041,\n", " 5.358121147,\n", " 5.420625748,\n", " 5.45502595,\n", " 5.559541963,\n", " 5.61254852,\n", " 5.885259102,\n", " 6.145248773,\n", " 6.512143221,\n", " 6.934981111,\n", " 7.811089495,\n", " 8.281805716,\n", " 9.300236388,\n", " 9.731586954,\n", " 11.63135731,\n", " 15.24313395,\n", " 19.81818615,\n", " ]\n", ")\n", "\n", "Y9 = np.array(\n", " [\n", " 1,\n", " 1.24570471,\n", " 1.457672448,\n", " 1.734757,\n", " 2.022753999,\n", " 2.244335431,\n", " 2.546558574,\n", " 2.887030331,\n", " 3.29529913,\n", " 4.377751156,\n", " 5.390771626,\n", " 5.982484067,\n", " 7.152449831,\n", " 7.972379175,\n", " 9.518039505,\n", " 10.38663667,\n", " 11.63636757,\n", " 12.44098606,\n", " 13.1809551,\n", " 14.21891386,\n", " 15.08325454,\n", " 16.11449903,\n", " 16.95549455,\n", " 19.15734093,\n", " 20.67643722,\n", " 22.67543126,\n", " 25.76980375,\n", " 31.22082999,\n", " ]\n", ")\n", "X9 = np.array(\n", " [\n", " 2.359210475,\n", " 2.381703987,\n", " 2.412029295,\n", " 2.450479487,\n", " 2.481680486,\n", " 2.521240988,\n", " 2.572257547,\n", " 2.660524333,\n", " 2.751819986,\n", " 3.00507027,\n", " 3.314662302,\n", " 3.499621817,\n", " 3.91963219,\n", " 4.195462425,\n", " 4.867922672,\n", " 5.240788561,\n", " 5.866673096,\n", " 6.2441507,\n", " 6.626424983,\n", " 7.192139126,\n", " 7.700695838,\n", " 8.334363447,\n", " 8.93498453,\n", " 10.23676764,\n", " 11.22018726,\n", " 12.69483156,\n", " 15.00257488,\n", " 19.66118419,\n", " ]\n", ")\n", "\n", "Y10 = np.array(\n", " [\n", " 1,\n", " 1.490163293,\n", " 1.722664767,\n", " 1.902319213,\n", " 2.331621252,\n", " 2.669482766,\n", " 2.950129966,\n", " 3.29529913,\n", " 3.574741878,\n", " 3.924187211,\n", " 4.578962969,\n", " 4.912810557,\n", " 5.593309253,\n", " 6.119288823,\n", " 6.644642623,\n", " 7.023246768,\n", " 7.361639679,\n", " 8.081269437,\n", " 8.575422275,\n", " 10.30942724,\n", " 11.15336857,\n", " 12.18152662,\n", " 12.75222616,\n", " 13.7914596,\n", " 14.48171973,\n", " 15.39332793,\n", " 16.55068513,\n", " 17.67101739,\n", " 18.40892945,\n", " 20.02936469,\n", " 21.64511984,\n", " 22.72845428,\n", " 23.96333726,\n", " 25.50421875,\n", " 27.14418142,\n", " 28.48824655,\n", " 30.28155009,\n", " ]\n", ")\n", "X10 = np.array(\n", " [\n", " 0.695855433,\n", " 0.743646766,\n", " 0.788045272,\n", " 0.821991165,\n", " 0.916285475,\n", " 0.991683911,\n", " 1.058117967,\n", " 1.143377667,\n", " 1.221904814,\n", " 1.336468837,\n", " 1.518324783,\n", " 1.624314987,\n", " 1.896625055,\n", " 2.063542636,\n", " 2.279566394,\n", " 2.419670763,\n", " 2.561432124,\n", " 2.846248441,\n", " 3.057806323,\n", " 3.908489836,\n", " 4.312064256,\n", " 4.914335096,\n", " 5.169445303,\n", " 5.837057497,\n", " 6.223493829,\n", " 6.785502665,\n", " 7.532065355,\n", " 8.288357264,\n", " 8.822649179,\n", " 9.933738163,\n", " 11.18475323,\n", " 12.03638898,\n", " 13.01858971,\n", " 14.26925174,\n", " 15.81417007,\n", " 16.90919862,\n", " 18.5825382,\n", " ]\n", ")\n", "\n", "plt.plot(\n", " 10**X1, 10**Y1, color=\"grey\", linestyle=\"-\", linewidth=1, label=\"Robertson's zones\"\n", ")\n", "plt.plot(10**X2, 10**Y2, color=\"grey\", linestyle=\"-\", linewidth=1)\n", "plt.plot(10 ** X3[5:16], 10 ** Y3[5:16], color=\"grey\", linestyle=\"-\", linewidth=1)\n", "plt.plot(10 ** X4[5:15], 10 ** Y4[5:15], color=\"grey\", linestyle=\"-\", linewidth=1)\n", "plt.plot(10 ** X5[4:17], 10 ** Y5[4:17], color=\"grey\", linestyle=\"-\", linewidth=1)\n", "plt.plot(10 ** X6[0:11], 10 ** Y6[0:11], color=\"grey\", linestyle=\"-\", linewidth=1)\n", "plt.plot(10 ** X7[0:13], 10 ** Y7[0:13], color=\"grey\", linestyle=\"-\", linewidth=1)\n", "plt.plot(\n", " X8,\n", " Y8,\n", " color=\"red\",\n", " linestyle=\"-\",\n", " linewidth=1,\n", " label=\"Possibly peat / Possibly clay\",\n", ")\n", "# plt.plot(X9,Y9, color='black',linestyle='-', linewidth=1, label=\"Lengkeek & Brinkgreve zone 2B\")\n", "plt.plot(\n", " X10,\n", " Y10,\n", " color=\"purple\",\n", " linestyle=\"-\",\n", " linewidth=1,\n", " label=\"Possibly slightly peaty clay / Possibly clay\",\n", ")\n", "\n", "\n", "# Customize the plot\n", "plt.title(\"Robertson's Soil Identification Chart\")\n", "plt.xlabel(\"F\")\n", "plt.ylabel(\"Qtn\")\n", "plt.grid(True)\n", "plt.xscale(\"log\")\n", "plt.yscale(\"log\")\n", "\n", "# Set custom x and y axis labels\n", "x_labels = [0.1, 0.5, 1, 5, 10, 50, 100, 500, 1000]\n", "y_labels = [0.1, 0.5, 1, 5, 10, 50, 100, 500, 1000]\n", "plt.xticks(x_labels)\n", "plt.yticks(y_labels)\n", "plt.xlim([0.1, 15])\n", "plt.ylim([1, 1000])\n", "\n", "# Average values from your DataFrame (replace with your actual values)\n", "avg_Qtn = merged_df[\"Qtn_avg\"]\n", "avg_F = merged_df[\"F_avg\"]\n", "\n", "# just plot the dots\n", "plt.scatter(avg_F, avg_Qtn, label=\"Pydov_data\")\n", "plt.legend()" ] } ], "metadata": { "kernelspec": { "display_name": ".venv (3.13.5)", "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.13.5" } }, "nbformat": 4, "nbformat_minor": 5 }