{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Example of DOV search methods for samples (monsters)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/DOV-Vlaanderen/pydov/master?filepath=docs%2Fnotebooks%2Fsearch_grondmonsters.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Use cases explained below\n", "* Get samples in a bounding box\n", "* Get samples in a bounding box based on specific properties\n", "* Get sample based on fields not available in the standard output dataframe\n", "* Get a boxplot with the depth distribution of samples with sampling instrument 'steekbuis'\n", "* Finding the boreholes associated with the monsters and visualize results\n", "* Adding the sampled object to the monster dataframe" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import inspect, sys" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "# check pydov path\n", "import pydov" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Get information about the datatype 'Monster'" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "from pydov.search.monster import MonsterSearch\n", "monster = MonsterSearch()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A description is provided for the 'Monster' datatype:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Deze kaartlaag bevat monsters die gekoppeld zijn aan een of meerdere boringen of aan een of meerdere monsters. Deze monsters zijn gekenmerkt door een diepte ten opzichte van het maaiveld, door de manier van staalname en de materiaalklasse. De geografische ligging (X en Y (mL72) en Z (mTAW)) nemen ze over van de gekoppelde boring(en). Het type bemonsterd materiaal wordt beschreven in de 'Materiaalklasse'. Aan deze monsters kunnen er observaties gekoppeld zijn, zoals waarnemingen en resultaten van kwaliteitsanalyses in het laboratorium of in het veld en/of referenties naar bepaalde analyses. De gegevens van de monsters en bepaalde observaties kunnen worden geƫxporteerd in een rapport.\n" ] } ], "source": [ "print(monster.get_description())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The different fields that are available for objects of the 'Monster' datatype can be requested with the get_fields() method:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "id\n", "naam\n", "pkey_monster\n", "gekoppeld_aan\n", "pkey_parents\n", "materiaalklasse\n", "diepte_van_m\n", "diepte_tot_m\n", "aantal_observaties\n", "datum_monstername\n", "monstersamenstelling\n", "monstertype\n", "bemonsteringsprocedure\n", "bemonsteringsinstrument\n", "bemonstering_door\n", "opmerkingen\n", "actuele_opslaglocatie\n", "opdracht\n", "permkey_monster\n", "geom\n" ] } ], "source": [ "fields = monster.get_fields()\n", "\n", "# print available fields\n", "for f in fields.values():\n", " print(f['name'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can get more information of a field by requesting it from the fields dictionary:\n", "* *name*: name of the field\n", "* *definition*: definition of this field\n", "* *cost*: currently this is either 1 or 10, depending on the datasource of the field. It is an indication of the expected time it will take to retrieve this field in the output dataframe.\n", "* *notnull*: whether the field is mandatory or not\n", "* *type*: datatype of the values of this field\n", "\n", "Alternatively, you can list all the fields and their details by inspecting the `get_fields()` output or the search instance itself in a notebook:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", "
\n", " \n", "
\n", " pydov.search.monster.MonsterSearch\n", "
\n", "

Deze kaartlaag bevat monsters die gekoppeld zijn aan een of meerdere boringen of aan een of meerdere monsters. Deze monsters zijn gekenmerkt door een diepte ten opzichte van het maaiveld, door de manier van staalname en de materiaalklasse. De geografische ligging (X en Y (mL72) en Z (mTAW)) nemen ze over van de gekoppelde boring(en). Het type bemonsterd materiaal wordt beschreven in de 'Materiaalklasse'. Aan deze monsters kunnen er observaties gekoppeld zijn, zoals waarnemingen en resultaten van kwaliteitsanalyses in het laboratorium of in het veld en/of referenties naar bepaalde analyses. De gegevens van de monsters en bepaalde observaties kunnen worden geƫxporteerd in een rapport.

\n", " \n", "
\n", "

id - Uniek referentienummer in de databank.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

naam - Naam van het monster.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

pkey_monster - Permanente URL die verwijst naar de gegevens van het monster op de website.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

gekoppeld_aan - Het ouder-object (parent) waaraan een monster gekoppeld is. Bijvoorbeeld een boring, een ander monster, ...

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

pkey_parents - Permanente URL die verwijst naar de gegevens van het gekoppeld ouder-object (parent) op de website.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: True
\n", "
\n", " \n", " \n", "
\n", "

materiaalklasse - Aard van het materiaal waaruit het monster bestaat, ingedeeld volgens een classificatie bijvoorbeeld sediment, hard gesteente.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

diepte_van_m - Minimum diepte van het monster ten opzichte van het aanvangspeil van het gekoppeld ouder-object, in meter.

  • type: float
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

diepte_tot_m - Maximum diepte van het monster ten opzichte van het aanvangspeil van het gekoppeld ouder-object, in meter.

  • type: float
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

aantal_observaties - Aantal observaties die beschikbaar zijn bij het monster.

  • type: integer
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

datum_monstername - Datum van monstername.

  • type: date
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

monstersamenstelling - Samenstelling van het monster: enkelvoudig monster of mengmonster.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

monstertype - Type monster of bemonstering: geroerd, ongeroerd, vloeistof.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
  • codelist:
  • \n", " \n", "
    \n", " \n", "
    \n", " pydov.util.codelists.OsloCodeList\n", "
    \n", " \n", " \n", "
    \n", "

    geroerd - Geroerd - Monstername waarbij de oorspronkelijke structuur en gelaagdheid van het materiaal niet bewaard wordt. Het resulterende monster laat het niet toe een gedetailleerde beschrijving of bepaalde analyses met betrekking tot de structuur of gelaagdheid (bv. Bulkdensiteit, volumemassa, grondmechanische proeven, ....) uit te voeren.

    \n", "
    \n", " \n", " \n", "
    \n", "

    ongeroerd - Ongeroerd - Monstername waarbij de oorspronkelijke structuur en gelaagdheid van het materiaal maximaal bewaard wordt.

    \n", "
    \n", " \n", " \n", "
    \n", "

    vloeistof - Vloeistof - Het monster bestaat uit een van nature vloeibare stof (een stof die gemakkelijk vormveranderingen ondergaat, samendrukbaar is, maar zich verzet tegen deze volumeverandering). Het begrip gelaagdheid is niet relevant voor het karakteriseren van het materiaal waaruit het monster is genomen.

    \n", "
    \n", " \n", "
    \n", "
\n", "
\n", " \n", " \n", "
\n", "

bemonsteringsprocedure - Een workflow, protocol, plan, algoritme of berekeningswijze waarin wordt gespecifieerd hoe de bemonstering moet worden uitgevoerd.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

bemonsteringsinstrument - Het instrument waarmee de bemonstering is uitgevoerd.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: True
\n", "
\n", " \n", " \n", "
\n", "

bemonstering_door - De agent (persoon of organisatie) die de bemonstering heeft uitgevoerd.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

opmerkingen - Aantal opmerkingen bij het monster.

  • type: integer
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

actuele_opslaglocatie - De plaats waar het monster is bewaard.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

opdracht - Opdracht waaraan een monster gekoppeld is.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

permkey_monster - Permkey van het monster als deel van de permanente URL.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
\n", "
\n", " \n", " \n", "
\n", "

geom - None

  • type: geometry
  • notnull: False
  • query: False
  • cost: 1
  • multivalue: False
\n", "
\n", "

\n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "monster" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example use cases" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get samples in a bounding box" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Get data for all the samples that are geographically located within the bounds of the specified box.\n", "\n", "The coordinates are in the Belgian Lambert72 (EPSG:31370) coordinate system and are given in the order of lower left x, lower left y, upper right x, upper right y." ] }, { "cell_type": "code", "execution_count": 7, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_monsternaampkey_parentsmateriaalklassedatum_monsternamediepte_van_mdiepte_tot_mmonstertypemonstersamenstellingbemonsteringsprocedurebemonsteringsinstrumentbemonstering_door
0https://www.dov.vlaanderen.be/data/monster/201...12(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-045.506.00ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling Geotechniek
1https://www.dov.vlaanderen.be/data/monster/201...16A(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-047.007.12ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling Geotechniek
2https://www.dov.vlaanderen.be/data/monster/201...16B(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-047.127.27ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling Geotechniek
3https://www.dov.vlaanderen.be/data/monster/201...16C(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-047.277.43ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling Geotechniek
4https://www.dov.vlaanderen.be/data/monster/201...16D(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-047.437.50ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling Geotechniek
\n", "
" ], "text/plain": [ " pkey_monster naam \\\n", "0 https://www.dov.vlaanderen.be/data/monster/201... 12 \n", "1 https://www.dov.vlaanderen.be/data/monster/201... 16A \n", "2 https://www.dov.vlaanderen.be/data/monster/201... 16B \n", "3 https://www.dov.vlaanderen.be/data/monster/201... 16C \n", "4 https://www.dov.vlaanderen.be/data/monster/201... 16D \n", "\n", " pkey_parents materiaalklasse \\\n", "0 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "1 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "2 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "3 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "4 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "\n", " datum_monstername diepte_van_m diepte_tot_m monstertype \\\n", "0 2002-03-04 5.50 6.00 ongeroerd \n", "1 2002-03-04 7.00 7.12 ongeroerd \n", "2 2002-03-04 7.12 7.27 ongeroerd \n", "3 2002-03-04 7.27 7.43 ongeroerd \n", "4 2002-03-04 7.43 7.50 ongeroerd \n", "\n", " monstersamenstelling bemonsteringsprocedure bemonsteringsinstrument \\\n", "0 Enkelvoudig monster NaN (steekbus,) \n", "1 Enkelvoudig monster NaN (steekbus,) \n", "2 Enkelvoudig monster NaN (steekbus,) \n", "3 Enkelvoudig monster NaN (steekbus,) \n", "4 Enkelvoudig monster NaN (steekbus,) \n", "\n", " bemonstering_door \n", "0 MVG - Afdeling Geotechniek \n", "1 MVG - Afdeling Geotechniek \n", "2 MVG - Afdeling Geotechniek \n", "3 MVG - Afdeling Geotechniek \n", "4 MVG - Afdeling Geotechniek " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pydov.util.location import Within, Box\n", "\n", "df = monster.search(location=Within(Box(122000, 187000, 124000, 189000, epsg=31370)))\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The dataframe contains samples. The available data are flattened to represent unique attributes per row of the dataframe.\n", "\n", "Using the *pkey_monster* field one can request the details of this sample in a webbrowser:\n", "https://www.dov.vlaanderen.be/data/monster/*pkey_monster*" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://www.dov.vlaanderen.be/data/monster/2017-180446\n" ] } ], "source": [ "for pkey_monster in set(df.loc[df.naam == '16C'].pkey_monster):\n", " print(pkey_monster)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get samples with specific properties" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next to querying samples based on their geographic location within a bounding box, we can also search for borehole samples matching a specific set of properties. For this we can build a query using a combination of the 'Monster' fields and operators provided by the WFS protocol.\n", "\n", "A list of possible operators can be found below:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['PropertyIsBetween',\n", " 'PropertyIsEqualTo',\n", " 'PropertyIsGreaterThan',\n", " 'PropertyIsGreaterThanOrEqualTo',\n", " 'PropertyIsLessThan',\n", " 'PropertyIsLessThanOrEqualTo',\n", " 'PropertyIsLike',\n", " 'PropertyIsNotEqualTo',\n", " 'PropertyIsNull',\n", " 'SortProperty']" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[i for i,j in inspect.getmembers(sys.modules['owslib.fes2'], inspect.isclass) if 'Property' in i]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example we build a query using the *PropertyIsEqualTo* operator to find all samples where monstertype equals 'geroerd':" ] }, { "cell_type": "code", "execution_count": 10, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_monsternaampkey_parentsmateriaalklassedatum_monsternamediepte_van_mdiepte_tot_mmonstertypemonstersamenstellingbemonsteringsprocedurebemonsteringsinstrumentbemonstering_door
0https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/199...sediment1996-06-0179.079.0geroerdEnkelvoudig monsterNaN(spoelboor,)NaN
1https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/199...sediment1998-05-207.07.0geroerdEnkelvoudig monsterNaN(avegaarbooras,)NaN
2https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/199...sediment1999-05-0610.510.5geroerdEnkelvoudig monsterNaN(boor,)NaN
3https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/198...sediment1981-05-170.10.1geroerdEnkelvoudig monsterNaN(boor,)NaN
4https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/196...sediment1963-06-0111.012.0geroerdEnkelvoudig monsterNaN(spoelboor,)NaN
\n", "
" ], "text/plain": [ " pkey_monster naam \\\n", "0 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "1 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "2 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "3 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "4 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "\n", " pkey_parents materiaalklasse \\\n", "0 (https://www.dov.vlaanderen.be/data/boring/199... sediment \n", "1 (https://www.dov.vlaanderen.be/data/boring/199... sediment \n", "2 (https://www.dov.vlaanderen.be/data/boring/199... sediment \n", "3 (https://www.dov.vlaanderen.be/data/boring/198... sediment \n", "4 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "\n", " datum_monstername diepte_van_m diepte_tot_m monstertype \\\n", "0 1996-06-01 79.0 79.0 geroerd \n", "1 1998-05-20 7.0 7.0 geroerd \n", "2 1999-05-06 10.5 10.5 geroerd \n", "3 1981-05-17 0.1 0.1 geroerd \n", "4 1963-06-01 11.0 12.0 geroerd \n", "\n", " monstersamenstelling bemonsteringsprocedure bemonsteringsinstrument \\\n", "0 Enkelvoudig monster NaN (spoelboor,) \n", "1 Enkelvoudig monster NaN (avegaarbooras,) \n", "2 Enkelvoudig monster NaN (boor,) \n", "3 Enkelvoudig monster NaN (boor,) \n", "4 Enkelvoudig monster NaN (spoelboor,) \n", "\n", " bemonstering_door \n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from owslib.fes2 import PropertyIsEqualTo\n", "\n", "query = PropertyIsEqualTo(propertyname='monstertype',\n", " literal='geroerd')\n", "df = monster.search(query=query, max_features=10)\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once again we can use the *pkey_monster* as a permanent link to the information of these samples:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://www.dov.vlaanderen.be/data/monster/2017-127061\n", "https://www.dov.vlaanderen.be/data/monster/2017-127081\n", "https://www.dov.vlaanderen.be/data/monster/2017-127099\n", "https://www.dov.vlaanderen.be/data/monster/2017-131193\n", "https://www.dov.vlaanderen.be/data/monster/2017-131408\n", "https://www.dov.vlaanderen.be/data/monster/2017-137853\n", "https://www.dov.vlaanderen.be/data/monster/2017-137878\n", "https://www.dov.vlaanderen.be/data/monster/2017-137903\n", "https://www.dov.vlaanderen.be/data/monster/2017-131795\n", "https://www.dov.vlaanderen.be/data/monster/2017-131804\n" ] } ], "source": [ "for pkey_monster in df['pkey_monster']:\n", " print(pkey_monster)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get samples in a bounding box based on specific properties" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can combine a query on attributes with a query on geographic location to get the samples within a bounding box that have specific properties.\n", "\n", "The following example requests the samples with a depth greater than or equal to 15 meters within the given bounding box.\n", "\n", "(Note that the datatype of the *literal* parameter should be a string, regardless of the datatype of this field in the output dataframe.)" ] }, { "cell_type": "code", "execution_count": 12, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pkey_monsternaampkey_parentsmateriaalklassedatum_monsternamediepte_van_mdiepte_tot_mmonstertypemonstersamenstellingbemonsteringsprocedurebemonsteringsinstrumentbemonstering_door
0https://www.dov.vlaanderen.be/data/monster/201...39A(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-0417.0017.37ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling Geotechniek
1https://www.dov.vlaanderen.be/data/monster/201...39B(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-0417.3717.40ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling Geotechniek
2https://www.dov.vlaanderen.be/data/monster/201...N4A(https://www.dov.vlaanderen.be/data/boring/200...sediment2009-05-2815.7515.90ongeroerdEnkelvoudig monster22475-1-2007(steekbus,)VO - Afdeling Geotechniek
3https://www.dov.vlaanderen.be/data/monster/201...N4B(https://www.dov.vlaanderen.be/data/boring/200...sediment2009-05-2815.9016.15ongeroerdEnkelvoudig monster22475-1-2007(steekbus,)VO - Afdeling Geotechniek
4https://www.dov.vlaanderen.be/data/monster/201...N8(https://www.dov.vlaanderen.be/data/boring/200...sediment2005-01-1816.5017.00ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling Geotechniek
\n", "
" ], "text/plain": [ " pkey_monster naam \\\n", "0 https://www.dov.vlaanderen.be/data/monster/201... 39A \n", "1 https://www.dov.vlaanderen.be/data/monster/201... 39B \n", "2 https://www.dov.vlaanderen.be/data/monster/201... N4A \n", "3 https://www.dov.vlaanderen.be/data/monster/201... N4B \n", "4 https://www.dov.vlaanderen.be/data/monster/201... N8 \n", "\n", " pkey_parents materiaalklasse \\\n", "0 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "1 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "2 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "3 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "4 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "\n", " datum_monstername diepte_van_m diepte_tot_m monstertype \\\n", "0 2002-03-04 17.00 17.37 ongeroerd \n", "1 2002-03-04 17.37 17.40 ongeroerd \n", "2 2009-05-28 15.75 15.90 ongeroerd \n", "3 2009-05-28 15.90 16.15 ongeroerd \n", "4 2005-01-18 16.50 17.00 ongeroerd \n", "\n", " monstersamenstelling bemonsteringsprocedure bemonsteringsinstrument \\\n", "0 Enkelvoudig monster NaN (steekbus,) \n", "1 Enkelvoudig monster NaN (steekbus,) \n", "2 Enkelvoudig monster 22475-1-2007 (steekbus,) \n", "3 Enkelvoudig monster 22475-1-2007 (steekbus,) \n", "4 Enkelvoudig monster NaN (steekbus,) \n", "\n", " bemonstering_door \n", "0 MVG - Afdeling Geotechniek \n", "1 MVG - Afdeling Geotechniek \n", "2 VO - Afdeling Geotechniek \n", "3 VO - Afdeling Geotechniek \n", "4 MVG - Afdeling Geotechniek " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from owslib.fes2 import PropertyIsGreaterThanOrEqualTo\n", "\n", "query = PropertyIsGreaterThanOrEqualTo(\n", " propertyname='diepte_tot_m',\n", " literal='15')\n", "\n", "df = monster.search(\n", " location=Within(Box(122000, 187000, 124000, 189000, epsg=31370)),\n", " query=query\n", " )\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get sample based on fields not available in the standard output dataframe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To keep the output dataframe size acceptable, not all available WFS fields are included in the standard output. However, one can use this information to select samples as illustrated below.\n", "\n", "For example, make a selection of the monsters with 100 or more observations:" ] }, { "cell_type": "code", "execution_count": 50, "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", " \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_monsternaampkey_parentsmateriaalklassedatum_monsternamediepte_van_mdiepte_tot_mmonstertypemonstersamenstellingbemonsteringsprocedurebemonsteringsinstrumentbemonstering_dooraantal_observaties
0https://www.dov.vlaanderen.be/data/monster/202...000/00/2-F1/M2024(https://www.dov.vlaanderen.be/data/filter/200...grondwater2024-05-22NaN3.0vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Analytico B.V.101
1https://www.dov.vlaanderen.be/data/monster/202...000/32/3-F1/M2024(https://www.dov.vlaanderen.be/data/filter/200...grondwater2024-05-15NaN3.0vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Analytico B.V.104
2https://www.dov.vlaanderen.be/data/monster/202...000/32/5-F1/M2024(https://www.dov.vlaanderen.be/data/filter/200...grondwater2024-05-16NaN3.0vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Analytico B.V.101
3https://www.dov.vlaanderen.be/data/monster/202...010/32/2-F1/M2024(https://www.dov.vlaanderen.be/data/filter/200...grondwater2024-05-16NaN2.5vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Analytico B.V.104
4https://www.dov.vlaanderen.be/data/monster/202...011/00/4-F1/M2024(https://www.dov.vlaanderen.be/data/filter/200...grondwater2024-05-22NaN3.0vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Analytico B.V.104
\n", "
" ], "text/plain": [ " pkey_monster naam \\\n", "0 https://www.dov.vlaanderen.be/data/monster/202... 000/00/2-F1/M2024 \n", "1 https://www.dov.vlaanderen.be/data/monster/202... 000/32/3-F1/M2024 \n", "2 https://www.dov.vlaanderen.be/data/monster/202... 000/32/5-F1/M2024 \n", "3 https://www.dov.vlaanderen.be/data/monster/202... 010/32/2-F1/M2024 \n", "4 https://www.dov.vlaanderen.be/data/monster/202... 011/00/4-F1/M2024 \n", "\n", " pkey_parents materiaalklasse \\\n", "0 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "1 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "2 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "3 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "4 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "\n", " datum_monstername diepte_van_m diepte_tot_m monstertype \\\n", "0 2024-05-22 NaN 3.0 vloeistof \n", "1 2024-05-15 NaN 3.0 vloeistof \n", "2 2024-05-16 NaN 3.0 vloeistof \n", "3 2024-05-16 NaN 2.5 vloeistof \n", "4 2024-05-22 NaN 3.0 vloeistof \n", "\n", " monstersamenstelling bemonsteringsprocedure bemonsteringsinstrument \\\n", "0 Enkelvoudig monster NaN (pomp,) \n", "1 Enkelvoudig monster NaN (pomp,) \n", "2 Enkelvoudig monster NaN (pomp,) \n", "3 Enkelvoudig monster NaN (pomp,) \n", "4 Enkelvoudig monster NaN (pomp,) \n", "\n", " bemonstering_door aantal_observaties \n", "0 Eurofins Analytico B.V. 101 \n", "1 Eurofins Analytico B.V. 104 \n", "2 Eurofins Analytico B.V. 101 \n", "3 Eurofins Analytico B.V. 104 \n", "4 Eurofins Analytico B.V. 104 " ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pydov.types.monster import Monster\n", "\n", "query = PropertyIsGreaterThanOrEqualTo(\n", " propertyname='aantal_observaties',\n", " literal='100')\n", "\n", "fields = Monster.get_field_names()\n", "fields.append('aantal_observaties')\n", "\n", "df = monster.search(query=query, max_features = 10, return_fields=fields)\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get sample with data from a subtype" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are different subtypes available within monster search: 'BemonsterdObject', 'Opslaglocatie', 'Monsterbehandeling'\n", "\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/001] .\n", "[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", "
pkey_monsternaampkey_parentsmateriaalklassedatum_monsternamediepte_van_mdiepte_tot_mmonstertypemonstersamenstellingbemonsteringsprocedurebemonsteringsinstrumentbemonstering_doormonsterbehandeling_doormonsterbehandeling_datummonsterbehandeling_tijdstipmonsterbehandeling_behandelingmonsterbehandeling_behandeling_waarde
0https://www.dov.vlaanderen.be/data/monster/202...CN_142439_2021_M(https://www.dov.vlaanderen.be/data/bodemlocat...bodem2021-04-030.00.1geroerdMengmonsterNaN(pvcaangescherpt30mm,)Deelnemers citizen science projectUniversiteit AntwerpenNaNNaNMonstervoorbereiding doorUniversiteit Antwerpen
\n", "
" ], "text/plain": [ " pkey_monster naam \\\n", "0 https://www.dov.vlaanderen.be/data/monster/202... CN_142439_2021_M \n", "\n", " pkey_parents materiaalklasse \\\n", "0 (https://www.dov.vlaanderen.be/data/bodemlocat... bodem \n", "\n", " datum_monstername diepte_van_m diepte_tot_m monstertype \\\n", "0 2021-04-03 0.0 0.1 geroerd \n", "\n", " monstersamenstelling bemonsteringsprocedure bemonsteringsinstrument \\\n", "0 Mengmonster NaN (pvcaangescherpt30mm,) \n", "\n", " bemonstering_door monsterbehandeling_door \\\n", "0 Deelnemers citizen science project Universiteit Antwerpen \n", "\n", " monsterbehandeling_datum monsterbehandeling_tijdstip \\\n", "0 NaN NaN \n", "\n", " monsterbehandeling_behandeling monsterbehandeling_behandeling_waarde \n", "0 Monstervoorbereiding door Universiteit Antwerpen " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pydov.search.monster import MonsterSearch\n", "from pydov.types.monster import Monster, Monsterbehandeling\n", "from owslib.fes2 import PropertyIsLike\n", "\n", "monster = MonsterSearch(\n", " objecttype=Monster.with_subtype(Monsterbehandeling))\n", "query = PropertyIsLike(propertyname='pkey_monster', literal='%/2021-339689')\n", "df = monster.search(query=query)\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get a boxplot with the depth distribution of samples with sampling instrument 'steekbus'" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/004] ....\n" ] } ], "source": [ "from pydov.util.query import PropertyLikeList\n", "\n", "monster = MonsterSearch()\n", "\n", "query = PropertyLikeList(propertyname='bemonsteringsinstrument',\n", " lst=['steekbus'])\n", "\n", "df = monster.search(query=query, return_fields=[\n", " 'diepte_van_m', 'diepte_tot_m'\n", "])\n" ] }, { "cell_type": "code", "execution_count": 18, "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", "
diepte_van_mdiepte_tot_m
count33344.00000033361.000000
mean6.8874907.223054
std7.1729187.213257
min0.0000000.100000
25%2.0000002.320000
50%4.5000004.850000
75%9.0000009.400000
max60.00000060.300000
\n", "
" ], "text/plain": [ " diepte_van_m diepte_tot_m\n", "count 33344.000000 33361.000000\n", "mean 6.887490 7.223054\n", "std 7.172918 7.213257\n", "min 0.000000 0.100000\n", "25% 2.000000 2.320000\n", "50% 4.500000 4.850000\n", "75% 9.000000 9.400000\n", "max 60.000000 60.300000" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, \"Depth distribution samples with sampling instrument 'steekbus'\")" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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YFJk2rjTJDJd3L5rNoPup+iVV16BTCaDTCZD7969YWHxv48WFBTg7t27ePXVV6skSCIiIqKqVuakaNCgQQCA8+fPIywsDPb29tI4S0tL+Pr6Ijw8XOcBEhEREVWHMidFc+fOBQD4+vpi6NChsLa2rrKgiIiIiKpbuXu0joyMBACcPn0a165dAwA0b94c7dq1021kRERERNWoQu8+GzZsGI4ePSp1qpiWloYuXbrgxx9/RP369XUdIxEREVGVK3c/RWPGjIFKpcK1a9eQmpqK1NRUXLt2DYWFhXj33XerIkYiIiKiKlfuR/JtbGxw7NgxvPLKKxrlZ86cQXBwsF5e4PYyfCTftPGRXSLTxe27ZjPY13wU5eXlBZVKVay8oKAAnp6eOgmKiIiIqLqVOylavHgxJk6ciNOnT0tlp0+fxkcffYQvv/xSp8ERERERVZdy3z6rVasWsrOzkZ+fL3XgqP7bzs5Oo64h9G7N22emjZfXiUwXt++azaB7tFZbvnx5FYRBREREpF8V7qeIiIiIyJSUu00RANy+fRtz5szBm2++ieTkZADA7t27ceXKFZ0GR0RERFRdyp0UxcbGIiAgACdPnkR0dDQyMzMBABcuXJBeBUJERERkbMqdFH388cf49NNPsW/fPlhaWkrlvXr1wokTJ3QaHBEREVF1KXdSdOnSJbzxxhvFyt3c3PD06VOdBEVERERU3cqdFDk7O+Px48fFys+dO4d69erpJCgiIiKi6lbupGjYsGGYOXMmEhMTIZPJUFhYiKNHj2LatGl45513qiJGIiIioipX7qRo4cKF8Pf3h5eXFzIzM9G8eXN069YNXbp0wZw5c6oiRiIiIqIqV+4erdXu37+Py5cvIzMzE6+88goaN26s69h0gj1amzb2eEtkurh912xG0aO1mre3N7y9vXUZCxEREZHelCkpioqKKvMEly5dWuFgiIiIiPSlTEnRuXPnNIbPnj2L/Px8NG3aFABw48YNmJubo127drqPkIiIiKgalCkpOnjwoPT30qVL4eDggO+//x61atUCADx79gyjRo1CcHBw1URJREREVMXK3dC6Xr16iImJQYsWLTTKL1++jNDQUDx69EinAVYWG1qbNjbEJDJd3L5rNn0cv8v9SL5CocCTJ0+KlT958gQZGRk6CYqIiIioupU7KXrjjTcwatQoREdH48GDB3jw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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = df[df.diepte_tot_m != 0].boxplot()\n", "ax.set_ylabel(\"depth (m)\")\n", "ax.set_title(\"Depth distribution samples with sampling instrument 'steekbus'\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Finding related data\n", "\n", "### Finding boreholes associated with samples\n", "\n", "To find the boreholes based on a given dataframe with samples, you can use the Join query operator:" ] }, { "cell_type": "code", "execution_count": 20, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_monsternaampkey_parentsmateriaalklassedatum_monsternamediepte_van_mdiepte_tot_mmonstertypemonstersamenstellingbemonsteringsprocedurebemonsteringsinstrumentbemonstering_door
0https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/199...sediment1996-06-0179.079.0geroerdEnkelvoudig monsterNaN(spoelboor,)NaN
1https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/199...sediment1998-05-207.07.0geroerdEnkelvoudig monsterNaN(avegaarbooras,)NaN
2https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/199...sediment1999-05-0610.510.5geroerdEnkelvoudig monsterNaN(boor,)NaN
3https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/198...sediment1980-01-01288.8288.8ongeroerdEnkelvoudig monsterNaN(buis,)NaN
4https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/198...sediment1981-05-170.10.1geroerdEnkelvoudig monsterNaN(boor,)NaN
.......................................
95https://www.dov.vlaanderen.be/data/monster/200...000/32/2/M0504(https://www.dov.vlaanderen.be/data/filter/200...grondwater2005-09-12NaN3.0vloeistofEnkelvoudig monsterNaN(pomp,)Bodemkundige Dienst van Belgiƫ
96https://www.dov.vlaanderen.be/data/monster/200...000/32/2/M0602(https://www.dov.vlaanderen.be/data/filter/200...grondwater2006-02-23NaN6.5vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Envirotox NV
97https://www.dov.vlaanderen.be/data/monster/200...000/32/2/M0602(https://www.dov.vlaanderen.be/data/filter/200...grondwater2006-02-22NaN3.0vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Envirotox NV
98https://www.dov.vlaanderen.be/data/monster/200...000/32/2/M0603(https://www.dov.vlaanderen.be/data/filter/200...grondwater2006-08-25NaN6.5vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Envirotox NV
99https://www.dov.vlaanderen.be/data/monster/200...000/32/2/M0603(https://www.dov.vlaanderen.be/data/filter/200...grondwater2006-08-25NaN3.0vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Envirotox NV
\n", "

100 rows Ɨ 12 columns

\n", "
" ], "text/plain": [ " pkey_monster naam \\\n", "0 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "1 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "2 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "3 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "4 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", ".. ... ... \n", "95 https://www.dov.vlaanderen.be/data/monster/200... 000/32/2/M0504 \n", "96 https://www.dov.vlaanderen.be/data/monster/200... 000/32/2/M0602 \n", "97 https://www.dov.vlaanderen.be/data/monster/200... 000/32/2/M0602 \n", "98 https://www.dov.vlaanderen.be/data/monster/200... 000/32/2/M0603 \n", "99 https://www.dov.vlaanderen.be/data/monster/200... 000/32/2/M0603 \n", "\n", " pkey_parents materiaalklasse \\\n", "0 (https://www.dov.vlaanderen.be/data/boring/199... sediment \n", "1 (https://www.dov.vlaanderen.be/data/boring/199... sediment \n", "2 (https://www.dov.vlaanderen.be/data/boring/199... sediment \n", "3 (https://www.dov.vlaanderen.be/data/boring/198... sediment \n", "4 (https://www.dov.vlaanderen.be/data/boring/198... sediment \n", ".. ... ... \n", "95 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "96 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "97 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "98 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "99 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "\n", " datum_monstername diepte_van_m diepte_tot_m monstertype \\\n", "0 1996-06-01 79.0 79.0 geroerd \n", "1 1998-05-20 7.0 7.0 geroerd \n", "2 1999-05-06 10.5 10.5 geroerd \n", "3 1980-01-01 288.8 288.8 ongeroerd \n", "4 1981-05-17 0.1 0.1 geroerd \n", ".. ... ... ... ... \n", "95 2005-09-12 NaN 3.0 vloeistof \n", "96 2006-02-23 NaN 6.5 vloeistof \n", "97 2006-02-22 NaN 3.0 vloeistof \n", "98 2006-08-25 NaN 6.5 vloeistof \n", "99 2006-08-25 NaN 3.0 vloeistof \n", "\n", " monstersamenstelling bemonsteringsprocedure bemonsteringsinstrument \\\n", "0 Enkelvoudig monster NaN (spoelboor,) \n", "1 Enkelvoudig monster NaN (avegaarbooras,) \n", "2 Enkelvoudig monster NaN (boor,) \n", "3 Enkelvoudig monster NaN (buis,) \n", "4 Enkelvoudig monster NaN (boor,) \n", ".. ... ... ... \n", "95 Enkelvoudig monster NaN (pomp,) \n", "96 Enkelvoudig monster NaN (pomp,) \n", "97 Enkelvoudig monster NaN (pomp,) \n", "98 Enkelvoudig monster NaN (pomp,) \n", "99 Enkelvoudig monster NaN (pomp,) \n", "\n", " bemonstering_door \n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", ".. ... \n", "95 Bodemkundige Dienst van Belgiƫ \n", "96 Eurofins Envirotox NV \n", "97 Eurofins Envirotox NV \n", "98 Eurofins Envirotox NV \n", "99 Eurofins Envirotox NV \n", "\n", "[100 rows x 12 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pydov.search.monster import MonsterSearch\n", "from pydov.search.boring import BoringSearch\n", "\n", "from pydov.util.query import Join\n", "\n", "monster_search = MonsterSearch()\n", "boring_search = BoringSearch()\n", "\n", "df_monsters = monster_search.search(max_features=100)\n", "df_monsters" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/001] .\n", "[000/008] ........\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", "
pkey_boringboornummerxymv_mtawstart_boring_mtawgemeentediepte_boring_vandiepte_boring_totdatum_aanvanguitvoerderboorgatmetingdiepte_methode_vandiepte_methode_totboormethode
0https://www.dov.vlaanderen.be/data/boring/1901...kb26d63e-B3234942.0189926.074.074.00As0.0649.501901-01-01onbekendFalse0.0649.50onbekend
1https://www.dov.vlaanderen.be/data/boring/1996...kb26d78e-B249236820.0181175.090.590.50Zutendaal0.0200.701996-06-01Peeters-RamselTrue0.0200.70spoelboring
2https://www.dov.vlaanderen.be/data/boring/1981...kb17d32w-B380214069.5216345.447.047.00Lommel0.020.001981-05-17onbekendFalse0.020.00onbekend
3https://www.dov.vlaanderen.be/data/boring/1963...kb32d103w-B110165215.0161534.080.080.00Overijse0.056.001963-06-01Smet - DesselFalse0.056.00spoelboring
4https://www.dov.vlaanderen.be/data/boring/1999...kb23d73w-B386153903.0178252.013.013.00Machelen0.036.501999-05-06GEOLABFalse0.036.50droge boring
5https://www.dov.vlaanderen.be/data/boring/1998...GEO-98/060-B1160032.9175678.8NaN59.97NaN0.07.001998-05-20MVG - Afdeling GeotechniekFalse0.07.00ramkernboring
6https://www.dov.vlaanderen.be/data/boring/1980...kb5d11e-B28778776.0226370.04.94.90Knokke-Heist0.0440.901980-01-01Smet - DesselTrue0.0440.90gestoken boring
7https://www.dov.vlaanderen.be/data/boring/1964...kb32d90w-B1117181406.0172961.066.066.00Lubbeek0.046.951964-01-01onbekendFalse0.046.95kernboring
\n", "
" ], "text/plain": [ " pkey_boring boornummer \\\n", "0 https://www.dov.vlaanderen.be/data/boring/1901... kb26d63e-B3 \n", "1 https://www.dov.vlaanderen.be/data/boring/1996... kb26d78e-B249 \n", "2 https://www.dov.vlaanderen.be/data/boring/1981... kb17d32w-B380 \n", "3 https://www.dov.vlaanderen.be/data/boring/1963... kb32d103w-B110 \n", "4 https://www.dov.vlaanderen.be/data/boring/1999... kb23d73w-B386 \n", "5 https://www.dov.vlaanderen.be/data/boring/1998... GEO-98/060-B1 \n", "6 https://www.dov.vlaanderen.be/data/boring/1980... kb5d11e-B287 \n", "7 https://www.dov.vlaanderen.be/data/boring/1964... kb32d90w-B1117 \n", "\n", " x y mv_mtaw start_boring_mtaw gemeente \\\n", "0 234942.0 189926.0 74.0 74.00 As \n", "1 236820.0 181175.0 90.5 90.50 Zutendaal \n", "2 214069.5 216345.4 47.0 47.00 Lommel \n", "3 165215.0 161534.0 80.0 80.00 Overijse \n", "4 153903.0 178252.0 13.0 13.00 Machelen \n", "5 160032.9 175678.8 NaN 59.97 NaN \n", "6 78776.0 226370.0 4.9 4.90 Knokke-Heist \n", "7 181406.0 172961.0 66.0 66.00 Lubbeek \n", "\n", " diepte_boring_van diepte_boring_tot datum_aanvang \\\n", "0 0.0 649.50 1901-01-01 \n", "1 0.0 200.70 1996-06-01 \n", "2 0.0 20.00 1981-05-17 \n", "3 0.0 56.00 1963-06-01 \n", "4 0.0 36.50 1999-05-06 \n", "5 0.0 7.00 1998-05-20 \n", "6 0.0 440.90 1980-01-01 \n", "7 0.0 46.95 1964-01-01 \n", "\n", " uitvoerder boorgatmeting diepte_methode_van \\\n", "0 onbekend False 0.0 \n", "1 Peeters-Ramsel True 0.0 \n", "2 onbekend False 0.0 \n", "3 Smet - Dessel False 0.0 \n", "4 GEOLAB False 0.0 \n", "5 MVG - Afdeling Geotechniek False 0.0 \n", "6 Smet - Dessel True 0.0 \n", "7 onbekend False 0.0 \n", "\n", " diepte_methode_tot boormethode \n", "0 649.50 onbekend \n", "1 200.70 spoelboring \n", "2 20.00 onbekend \n", "3 56.00 spoelboring \n", "4 36.50 droge boring \n", "5 7.00 ramkernboring \n", "6 440.90 gestoken boring \n", "7 46.95 kernboring " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_boringen = boring_search.search(\n", " query=Join(df_monsters, on='pkey_boring', using='pkey_parents'))\n", "df_boringen" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Finding samples associated with boreholes\n", "\n", "To find the samples based on a given dataframe with boreholes, you can use the `FuzzyJoin` query operator. This will make sure you get all the samples which are (at least partly) linked to one of the boreholes:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/001] .\n", "[000/100] ..................................................\n", "[050/100] ..................................................\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_boringboornummerxymv_mtawstart_boring_mtawgemeentediepte_boring_vandiepte_boring_totdatum_aanvanguitvoerderboorgatmetingdiepte_methode_vandiepte_methode_totboormethode
0https://www.dov.vlaanderen.be/data/boring/2016...kb29d84e-B57492424.0170752.040.0040.00Wortegem-Petegem0.00.0NaNonbekendFalse0.00.0onbekend
1https://www.dov.vlaanderen.be/data/boring/2016...kb29d84e-B57592296.0170885.046.0046.00Wortegem-Petegem0.00.0NaNonbekendFalse0.00.0onbekend
2https://www.dov.vlaanderen.be/data/boring/1945...kb22d55e-B1037108890.0188690.014.3114.31Melle0.015.01945-01-01De Meyer L.-GentFalse0.015.0droge boring
3https://www.dov.vlaanderen.be/data/boring/2016...kb29d84e-B57692243.0170939.047.5047.50Wortegem-Petegem0.00.0NaNonbekendFalse0.00.0onbekend
4https://www.dov.vlaanderen.be/data/boring/2016...kb29d84e-B57792475.0171088.039.0039.00Wortegem-Petegem0.00.0NaNonbekendFalse0.00.0onbekend
................................................
97https://www.dov.vlaanderen.be/data/boring/2016...kb29d84e-B64790320.0176885.056.0056.00Kruishoutem0.00.0NaNonbekendFalse0.00.0onbekend
98https://www.dov.vlaanderen.be/data/boring/2016...kb29d84e-B64890180.0176737.060.0060.00Kruishoutem0.00.0NaNonbekendFalse0.00.0onbekend
99https://www.dov.vlaanderen.be/data/boring/2016...kb29d84e-B65090085.0176728.061.0061.00Kruishoutem0.00.0NaNonbekendFalse0.00.0onbekend
100https://www.dov.vlaanderen.be/data/boring/2016...kb29d84e-B65190668.0176436.064.0064.00Kruishoutem0.00.0NaNonbekendFalse0.00.0onbekend
101https://www.dov.vlaanderen.be/data/boring/2016...kb29d84e-B65290870.0176275.068.0068.00Kruishoutem0.00.0NaNonbekendFalse0.00.0onbekend
\n", "

102 rows Ɨ 15 columns

\n", "
" ], "text/plain": [ " pkey_boring boornummer \\\n", "0 https://www.dov.vlaanderen.be/data/boring/2016... kb29d84e-B574 \n", "1 https://www.dov.vlaanderen.be/data/boring/2016... kb29d84e-B575 \n", "2 https://www.dov.vlaanderen.be/data/boring/1945... kb22d55e-B1037 \n", "3 https://www.dov.vlaanderen.be/data/boring/2016... kb29d84e-B576 \n", "4 https://www.dov.vlaanderen.be/data/boring/2016... kb29d84e-B577 \n", ".. ... ... \n", "97 https://www.dov.vlaanderen.be/data/boring/2016... kb29d84e-B647 \n", "98 https://www.dov.vlaanderen.be/data/boring/2016... kb29d84e-B648 \n", "99 https://www.dov.vlaanderen.be/data/boring/2016... kb29d84e-B650 \n", "100 https://www.dov.vlaanderen.be/data/boring/2016... kb29d84e-B651 \n", "101 https://www.dov.vlaanderen.be/data/boring/2016... kb29d84e-B652 \n", "\n", " x y mv_mtaw start_boring_mtaw gemeente \\\n", "0 92424.0 170752.0 40.00 40.00 Wortegem-Petegem \n", "1 92296.0 170885.0 46.00 46.00 Wortegem-Petegem \n", "2 108890.0 188690.0 14.31 14.31 Melle \n", "3 92243.0 170939.0 47.50 47.50 Wortegem-Petegem \n", "4 92475.0 171088.0 39.00 39.00 Wortegem-Petegem \n", ".. ... ... ... ... ... \n", "97 90320.0 176885.0 56.00 56.00 Kruishoutem \n", "98 90180.0 176737.0 60.00 60.00 Kruishoutem \n", "99 90085.0 176728.0 61.00 61.00 Kruishoutem \n", "100 90668.0 176436.0 64.00 64.00 Kruishoutem \n", "101 90870.0 176275.0 68.00 68.00 Kruishoutem \n", "\n", " diepte_boring_van diepte_boring_tot datum_aanvang uitvoerder \\\n", "0 0.0 0.0 NaN onbekend \n", "1 0.0 0.0 NaN onbekend \n", "2 0.0 15.0 1945-01-01 De Meyer L.-Gent \n", "3 0.0 0.0 NaN onbekend \n", "4 0.0 0.0 NaN onbekend \n", ".. ... ... ... ... \n", "97 0.0 0.0 NaN onbekend \n", "98 0.0 0.0 NaN onbekend \n", "99 0.0 0.0 NaN onbekend \n", "100 0.0 0.0 NaN onbekend \n", "101 0.0 0.0 NaN onbekend \n", "\n", " boorgatmeting diepte_methode_van diepte_methode_tot boormethode \n", "0 False 0.0 0.0 onbekend \n", "1 False 0.0 0.0 onbekend \n", "2 False 0.0 15.0 droge boring \n", "3 False 0.0 0.0 onbekend \n", "4 False 0.0 0.0 onbekend \n", ".. ... ... ... ... \n", "97 False 0.0 0.0 onbekend \n", "98 False 0.0 0.0 onbekend \n", "99 False 0.0 0.0 onbekend \n", "100 False 0.0 0.0 onbekend \n", "101 False 0.0 0.0 onbekend \n", "\n", "[102 rows x 15 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pydov.search.monster import MonsterSearch\n", "from pydov.search.boring import BoringSearch\n", "\n", "from pydov.util.query import FuzzyJoin\n", "\n", "monster_search = MonsterSearch()\n", "boring_search = BoringSearch()\n", "\n", "df_boringen = boring_search.search(max_features=100)\n", "df_boringen" ] }, { "cell_type": "code", "execution_count": 23, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_monsternaampkey_parentsmateriaalklassedatum_monsternamediepte_van_mdiepte_tot_mmonstertypemonstersamenstellingbemonsteringsprocedurebemonsteringsinstrumentbemonstering_door
0https://www.dov.vlaanderen.be/data/monster/201...1(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-06-280.50.57ongeroerdEnkelvoudig monsterNaN(steekbus,)Rijksinstituut voor Grondmechanica (RIG)
1https://www.dov.vlaanderen.be/data/monster/201...1(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-07-060.50.74ongeroerdEnkelvoudig monsterNaN(steekbus,)Rijksinstituut voor Grondmechanica (RIG)
2https://www.dov.vlaanderen.be/data/monster/201...1(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-07-120.50.66ongeroerdEnkelvoudig monsterNaN(steekbus,)Rijksinstituut voor Grondmechanica (RIG)
3https://www.dov.vlaanderen.be/data/monster/201...1(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-07-140.50.70ongeroerdEnkelvoudig monsterNaN(steekbus,)Rijksinstituut voor Grondmechanica (RIG)
4https://www.dov.vlaanderen.be/data/monster/201...1(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-08-081.01.33ongeroerdEnkelvoudig monsterNaN(steekbus,)Rijksinstituut voor Grondmechanica (RIG)
5https://www.dov.vlaanderen.be/data/monster/201...2(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-06-282.02.27ongeroerdEnkelvoudig monsterNaN(steekbus,)Rijksinstituut voor Grondmechanica (RIG)
6https://www.dov.vlaanderen.be/data/monster/201...2(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-07-067.07.18ongeroerdEnkelvoudig monsterNaN(steekbus,)Rijksinstituut voor Grondmechanica (RIG)
7https://www.dov.vlaanderen.be/data/monster/201...2(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-07-143.03.29ongeroerdEnkelvoudig monsterNaN(steekbus,)Rijksinstituut voor Grondmechanica (RIG)
8https://www.dov.vlaanderen.be/data/monster/201...2(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-08-083.03.32ongeroerdEnkelvoudig monsterNaN(steekbus,)Rijksinstituut voor Grondmechanica (RIG)
9https://www.dov.vlaanderen.be/data/monster/201...3(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-06-283.53.78ongeroerdEnkelvoudig monsterNaN(steekbus,)Rijksinstituut voor Grondmechanica (RIG)
10https://www.dov.vlaanderen.be/data/monster/201...3(https://www.dov.vlaanderen.be/data/boring/196...sediment1966-07-146.06.50geroerdEnkelvoudig monsterNaN(lepelboor,)Rijksinstituut voor Grondmechanica (RIG)
\n", "
" ], "text/plain": [ " pkey_monster naam \\\n", "0 https://www.dov.vlaanderen.be/data/monster/201... 1 \n", "1 https://www.dov.vlaanderen.be/data/monster/201... 1 \n", "2 https://www.dov.vlaanderen.be/data/monster/201... 1 \n", "3 https://www.dov.vlaanderen.be/data/monster/201... 1 \n", "4 https://www.dov.vlaanderen.be/data/monster/201... 1 \n", "5 https://www.dov.vlaanderen.be/data/monster/201... 2 \n", "6 https://www.dov.vlaanderen.be/data/monster/201... 2 \n", "7 https://www.dov.vlaanderen.be/data/monster/201... 2 \n", "8 https://www.dov.vlaanderen.be/data/monster/201... 2 \n", "9 https://www.dov.vlaanderen.be/data/monster/201... 3 \n", "10 https://www.dov.vlaanderen.be/data/monster/201... 3 \n", "\n", " pkey_parents materiaalklasse \\\n", "0 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "1 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "2 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "3 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "4 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "5 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "6 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "7 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "8 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "9 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "10 (https://www.dov.vlaanderen.be/data/boring/196... sediment \n", "\n", " datum_monstername diepte_van_m diepte_tot_m monstertype \\\n", "0 1966-06-28 0.5 0.57 ongeroerd \n", "1 1966-07-06 0.5 0.74 ongeroerd \n", "2 1966-07-12 0.5 0.66 ongeroerd \n", "3 1966-07-14 0.5 0.70 ongeroerd \n", "4 1966-08-08 1.0 1.33 ongeroerd \n", "5 1966-06-28 2.0 2.27 ongeroerd \n", "6 1966-07-06 7.0 7.18 ongeroerd \n", "7 1966-07-14 3.0 3.29 ongeroerd \n", "8 1966-08-08 3.0 3.32 ongeroerd \n", "9 1966-06-28 3.5 3.78 ongeroerd \n", "10 1966-07-14 6.0 6.50 geroerd \n", "\n", " monstersamenstelling bemonsteringsprocedure bemonsteringsinstrument \\\n", "0 Enkelvoudig monster NaN (steekbus,) \n", "1 Enkelvoudig monster NaN (steekbus,) \n", "2 Enkelvoudig monster NaN (steekbus,) \n", "3 Enkelvoudig monster NaN (steekbus,) \n", "4 Enkelvoudig monster NaN (steekbus,) \n", "5 Enkelvoudig monster NaN (steekbus,) \n", "6 Enkelvoudig monster NaN (steekbus,) \n", "7 Enkelvoudig monster NaN (steekbus,) \n", "8 Enkelvoudig monster NaN (steekbus,) \n", "9 Enkelvoudig monster NaN (steekbus,) \n", "10 Enkelvoudig monster NaN (lepelboor,) \n", "\n", " bemonstering_door \n", "0 Rijksinstituut voor Grondmechanica (RIG) \n", "1 Rijksinstituut voor Grondmechanica (RIG) \n", "2 Rijksinstituut voor Grondmechanica (RIG) \n", "3 Rijksinstituut voor Grondmechanica (RIG) \n", "4 Rijksinstituut voor Grondmechanica (RIG) \n", "5 Rijksinstituut voor Grondmechanica (RIG) \n", "6 Rijksinstituut voor Grondmechanica (RIG) \n", "7 Rijksinstituut voor Grondmechanica (RIG) \n", "8 Rijksinstituut voor Grondmechanica (RIG) \n", "9 Rijksinstituut voor Grondmechanica (RIG) \n", "10 Rijksinstituut voor Grondmechanica (RIG) " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_monsters = monster_search.search(\n", " query=FuzzyJoin(df_boringen, on='pkey_parents', using='pkey_boring'))\n", "df_monsters" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Adding the sampled object to the monster dataframe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The default dataframe of the Monster datatype doesn't contains information about the 'sampled object' by default. This can be added to the dataframe as its subtype.\n", "\n", "You can find which extra subtypes are available for a certain type with the `get_subtypes` method:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'BemonsterdObject': {'name': 'BemonsterdObject',\n", " 'class': pydov.types.monster.BemonsterdObject,\n", " 'definition': 'Subtype listing the sampled object(s) of the sample. It has the following fields: bemonsterd_object_type, bemonsterd_object_naam, bemonsterd_object_permkey.'},\n", " 'Monsterbehandeling': {'name': 'Monsterbehandeling',\n", " 'class': pydov.types.monster.Monsterbehandeling,\n", " 'definition': 'Subtype containing fields about the\\ntreatment of the sample. It has the following fields: monsterbehandeling_door, monsterbehandeling_datum, monsterbehandeling_tijdstip, monsterbehandeling_behandeling, monsterbehandeling_behandeling_waarde.'},\n", " 'Opslaglocatie': {'name': 'Opslaglocatie',\n", " 'class': pydov.types.monster.Opslaglocatie,\n", " 'definition': 'Subtype listing the storage location(s) of the sample. It has the following fields: opslaglocatie_naam, opslaglocatie_van, opslaglocatie_tot.'}}" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pydov.types.monster import Monster\n", "\n", "Monster.get_subtypes()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get the details about the sampled objects, we can instantiate the search class with the `BemonsterdObject` subtype:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "from pydov.types.monster import BemonsterdObject\n", "\n", "monster_search = MonsterSearch(\n", " objecttype=Monster.with_subtype(BemonsterdObject)\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When we now request information about the fields, this will include the extra fields from the subtype:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", "
\n", "

bemonsterd_object_permkey - Een unieke DOV identifier in de vorm van een permkey.

  • type: string
  • notnull: False
  • query: False
  • cost: 10
  • multivalue: False
\n", "
\n", " " ], "text/plain": [ "{'name': 'bemonsterd_object_permkey', 'type': 'string', 'multivalue': False, 'definition': 'Een unieke DOV identifier in de vorm van een permkey.', 'notnull': False, 'query': False, 'cost': 10}" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "monster_search.get_fields()['bemonsterd_object_permkey']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And when we query the data, the extra fields will be part of the resulting dataframe:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/001] .\n", "[000/010] ..........\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", "
pkey_monsternaampkey_parentsmateriaalklassedatum_monsternamediepte_van_mdiepte_tot_mmonstertypemonstersamenstellingbemonsteringsprocedurebemonsteringsinstrumentbemonstering_doorbemonsterd_object_typebemonsterd_object_naambemonsterd_object_permkey
0https://www.dov.vlaanderen.be/data/monster/201...12(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-045.506.00ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling GeotechniekBORINGGEO-02/028-B52002-003282
1https://www.dov.vlaanderen.be/data/monster/201...16A(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-047.007.12ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling GeotechniekBORINGGEO-02/028-B52002-003282
2https://www.dov.vlaanderen.be/data/monster/201...16B(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-047.127.27ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling GeotechniekBORINGGEO-02/028-B52002-003282
3https://www.dov.vlaanderen.be/data/monster/201...16C(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-047.277.43ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling GeotechniekBORINGGEO-02/028-B52002-003282
4https://www.dov.vlaanderen.be/data/monster/201...16D(https://www.dov.vlaanderen.be/data/boring/200...sediment2002-03-047.437.50ongeroerdEnkelvoudig monsterNaN(steekbus,)MVG - Afdeling GeotechniekBORINGGEO-02/028-B52002-003282
\n", "
" ], "text/plain": [ " pkey_monster naam \\\n", "0 https://www.dov.vlaanderen.be/data/monster/201... 12 \n", "1 https://www.dov.vlaanderen.be/data/monster/201... 16A \n", "2 https://www.dov.vlaanderen.be/data/monster/201... 16B \n", "3 https://www.dov.vlaanderen.be/data/monster/201... 16C \n", "4 https://www.dov.vlaanderen.be/data/monster/201... 16D \n", "\n", " pkey_parents materiaalklasse \\\n", "0 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "1 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "2 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "3 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "4 (https://www.dov.vlaanderen.be/data/boring/200... sediment \n", "\n", " datum_monstername diepte_van_m diepte_tot_m monstertype \\\n", "0 2002-03-04 5.50 6.00 ongeroerd \n", "1 2002-03-04 7.00 7.12 ongeroerd \n", "2 2002-03-04 7.12 7.27 ongeroerd \n", "3 2002-03-04 7.27 7.43 ongeroerd \n", "4 2002-03-04 7.43 7.50 ongeroerd \n", "\n", " monstersamenstelling bemonsteringsprocedure bemonsteringsinstrument \\\n", "0 Enkelvoudig monster NaN (steekbus,) \n", "1 Enkelvoudig monster NaN (steekbus,) \n", "2 Enkelvoudig monster NaN (steekbus,) \n", "3 Enkelvoudig monster NaN (steekbus,) \n", "4 Enkelvoudig monster NaN (steekbus,) \n", "\n", " bemonstering_door bemonsterd_object_type bemonsterd_object_naam \\\n", "0 MVG - Afdeling Geotechniek BORING GEO-02/028-B5 \n", "1 MVG - Afdeling Geotechniek BORING GEO-02/028-B5 \n", "2 MVG - Afdeling Geotechniek BORING GEO-02/028-B5 \n", "3 MVG - Afdeling Geotechniek BORING GEO-02/028-B5 \n", "4 MVG - Afdeling Geotechniek BORING GEO-02/028-B5 \n", "\n", " bemonsterd_object_permkey \n", "0 2002-003282 \n", "1 2002-003282 \n", "2 2002-003282 \n", "3 2002-003282 \n", "4 2002-003282 " ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = monster_search.search(location=Within(Box(122000, 187000, 124000, 189000, epsg=31370)), max_features = 10)\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mind that one sample can originate from multiple 'sampled objects', so it's possible for one sample to be split into multiple rows. Also, since we are now requesting fields from XML, querying will be significantly slower than before." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Get more details about a sample" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get more details about a sample than is available in the default dataframe, you can add an extra fieldset containing extra details.\n", "\n", "You can find which extra fieldsets are available for a certain type with the `get_fieldsets` method:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'MonsterDetails': {'name': 'MonsterDetails',\n", " 'class': pydov.types.monster.MonsterDetails,\n", " 'definition': 'Fieldset containing fields with extra\\ndetails about the sample.\\n It has the following fields: tijdstip_monstername.'}}" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pydov.types.monster import Monster\n", "\n", "Monster.get_fieldsets()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case, the fieldset `MonsterDetails` is available, which will add the extra field `tijdstip_monstername`.\n", "\n", "To use it, we can add the extra fields from the fieldset when instantiating our search instance:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "from pydov.search.monster import MonsterSearch\n", "from pydov.types.monster import Monster, MonsterDetails\n", "\n", "monster_search = MonsterSearch(\n", " objecttype=Monster.with_extra_fields(MonsterDetails))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When we now request information about the fields, this will include the extra fields from the fieldset:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", "
\n", "

tijdstip_monstername - Tijdstip waarop het monster werd verkregen uit het bemonsterdObject.

  • type: string
  • notnull: False
  • query: False
  • cost: 10
  • multivalue: False
\n", "
\n", " " ], "text/plain": [ "{'name': 'tijdstip_monstername', 'type': 'string', 'multivalue': False, 'definition': 'Tijdstip waarop het monster werd verkregen uit het bemonsterdObject.', 'notnull': False, 'query': False, 'cost': 10}" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "monster_search.get_fields()['tijdstip_monstername']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And when we query the data, the extra details will be part of the resulting dataframe:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[000/001] .\n", "[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", "
pkey_monsternaampkey_parentsmateriaalklassedatum_monsternamediepte_van_mdiepte_tot_mmonstertypemonstersamenstellingbemonsteringsprocedurebemonsteringsinstrumentbemonstering_doortijdstip_monstername
0https://www.dov.vlaanderen.be/data/monster/202...CMON_test_ilvo_laag_0_10_MG_2022(https://www.dov.vlaanderen.be/data/bodemdiept...bodem2022-03-100.00.1geroerdMengmonstercsp(steekguts30mm,)Departement Omgeving10:45:00
\n", "
" ], "text/plain": [ " pkey_monster \\\n", "0 https://www.dov.vlaanderen.be/data/monster/202... \n", "\n", " naam \\\n", "0 CMON_test_ilvo_laag_0_10_MG_2022 \n", "\n", " pkey_parents materiaalklasse \\\n", "0 (https://www.dov.vlaanderen.be/data/bodemdiept... bodem \n", "\n", " datum_monstername diepte_van_m diepte_tot_m monstertype \\\n", "0 2022-03-10 0.0 0.1 geroerd \n", "\n", " monstersamenstelling bemonsteringsprocedure bemonsteringsinstrument \\\n", "0 Mengmonster csp (steekguts30mm,) \n", "\n", " bemonstering_door tijdstip_monstername \n", "0 Departement Omgeving 10:45:00 " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from owslib.fes2 import PropertyIsLike\n", "\n", "monster_search.search(\n", " query=PropertyIsLike(\n", " 'pkey_monster', '%/2022-400005')\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualise results on a map\n", "\n", "Using Folium, we can display the results of our search on a map." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "# import the necessary modules (not included in the requirements of pydov!)\n", "import folium\n", "import geopandas as gpd" ] }, { "cell_type": "code", "execution_count": 34, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_monsternaampkey_parentsmateriaalklassediepte_van_mdiepte_tot_mmonstertypemonstersamenstellingbemonsteringsprocedurebemonsteringsinstrumentbemonstering_doorgeom
0https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/199...sediment79.079.0geroerdEnkelvoudig monsterNaN(spoelboor,)NaNPOINT (236820 181175)
1https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/199...sediment7.07.0geroerdEnkelvoudig monsterNaN(avegaarbooras,)NaNPOINT (160032.9 175678.8)
2https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/199...sediment10.510.5geroerdEnkelvoudig monsterNaN(boor,)NaNPOINT (153903 178252)
3https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/198...sediment288.8288.8ongeroerdEnkelvoudig monsterNaN(buis,)NaNPOINT (78776 226370)
4https://www.dov.vlaanderen.be/data/monster/201...0(https://www.dov.vlaanderen.be/data/boring/198...sediment0.10.1geroerdEnkelvoudig monsterNaN(boor,)NaNPOINT (214069.5 216345.4)
.......................................
95https://www.dov.vlaanderen.be/data/monster/200...000/32/2/M0504(https://www.dov.vlaanderen.be/data/filter/200...grondwaterNaN3.0vloeistofEnkelvoudig monsterNaN(pomp,)Bodemkundige Dienst van BelgiƫPOINT (29001.35 187051.01)
96https://www.dov.vlaanderen.be/data/monster/200...000/32/2/M0602(https://www.dov.vlaanderen.be/data/filter/200...grondwaterNaN6.5vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Envirotox NVPOINT (29001.35 187051.01)
97https://www.dov.vlaanderen.be/data/monster/200...000/32/2/M0602(https://www.dov.vlaanderen.be/data/filter/200...grondwaterNaN3.0vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Envirotox NVPOINT (29001.35 187051.01)
98https://www.dov.vlaanderen.be/data/monster/200...000/32/2/M0603(https://www.dov.vlaanderen.be/data/filter/200...grondwaterNaN6.5vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Envirotox NVPOINT (29001.35 187051.01)
99https://www.dov.vlaanderen.be/data/monster/200...000/32/2/M0603(https://www.dov.vlaanderen.be/data/filter/200...grondwaterNaN3.0vloeistofEnkelvoudig monsterNaN(pomp,)Eurofins Envirotox NVPOINT (29001.35 187051.01)
\n", "

100 rows Ɨ 12 columns

\n", "
" ], "text/plain": [ " pkey_monster naam \\\n", "0 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "1 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "2 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "3 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", "4 https://www.dov.vlaanderen.be/data/monster/201... 0 \n", ".. ... ... \n", "95 https://www.dov.vlaanderen.be/data/monster/200... 000/32/2/M0504 \n", "96 https://www.dov.vlaanderen.be/data/monster/200... 000/32/2/M0602 \n", "97 https://www.dov.vlaanderen.be/data/monster/200... 000/32/2/M0602 \n", "98 https://www.dov.vlaanderen.be/data/monster/200... 000/32/2/M0603 \n", "99 https://www.dov.vlaanderen.be/data/monster/200... 000/32/2/M0603 \n", "\n", " pkey_parents materiaalklasse \\\n", "0 (https://www.dov.vlaanderen.be/data/boring/199... sediment \n", "1 (https://www.dov.vlaanderen.be/data/boring/199... sediment \n", "2 (https://www.dov.vlaanderen.be/data/boring/199... sediment \n", "3 (https://www.dov.vlaanderen.be/data/boring/198... sediment \n", "4 (https://www.dov.vlaanderen.be/data/boring/198... sediment \n", ".. ... ... \n", "95 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "96 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "97 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "98 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "99 (https://www.dov.vlaanderen.be/data/filter/200... grondwater \n", "\n", " diepte_van_m diepte_tot_m monstertype monstersamenstelling \\\n", "0 79.0 79.0 geroerd Enkelvoudig monster \n", "1 7.0 7.0 geroerd Enkelvoudig monster \n", "2 10.5 10.5 geroerd Enkelvoudig monster \n", "3 288.8 288.8 ongeroerd Enkelvoudig monster \n", "4 0.1 0.1 geroerd Enkelvoudig monster \n", ".. ... ... ... ... \n", "95 NaN 3.0 vloeistof Enkelvoudig monster \n", "96 NaN 6.5 vloeistof Enkelvoudig monster \n", "97 NaN 3.0 vloeistof Enkelvoudig monster \n", "98 NaN 6.5 vloeistof Enkelvoudig monster \n", "99 NaN 3.0 vloeistof Enkelvoudig monster \n", "\n", " bemonsteringsprocedure bemonsteringsinstrument \\\n", "0 NaN (spoelboor,) \n", "1 NaN (avegaarbooras,) \n", "2 NaN (boor,) \n", "3 NaN (buis,) \n", "4 NaN (boor,) \n", ".. ... ... \n", "95 NaN (pomp,) \n", "96 NaN (pomp,) \n", "97 NaN (pomp,) \n", "98 NaN (pomp,) \n", "99 NaN (pomp,) \n", "\n", " bemonstering_door geom \n", "0 NaN POINT (236820 181175) \n", "1 NaN POINT (160032.9 175678.8) \n", "2 NaN POINT (153903 178252) \n", "3 NaN POINT (78776 226370) \n", "4 NaN POINT (214069.5 216345.4) \n", ".. ... ... \n", "95 Bodemkundige Dienst van Belgiƫ POINT (29001.35 187051.01) \n", "96 Eurofins Envirotox NV POINT (29001.35 187051.01) \n", "97 Eurofins Envirotox NV POINT (29001.35 187051.01) \n", "98 Eurofins Envirotox NV POINT (29001.35 187051.01) \n", "99 Eurofins Envirotox NV POINT (29001.35 187051.01) \n", "\n", "[100 rows x 12 columns]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pydov.search.monster import MonsterSearch\n", "from pydov.types.monster import Monster\n", "\n", "from pydov.search.fields import GeometryReturnField\n", "\n", "ms = MonsterSearch()\n", "\n", "return_fields = Monster.get_field_names()\n", "return_fields.remove('datum_monstername')\n", "return_fields.append(GeometryReturnField('geom', 31370))\n", "\n", "df = ms.search(max_features=100, return_fields=return_fields)\n", "df" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "geo_df = gpd.GeoDataFrame(df, geometry='geom', crs='EPSG:31370')\n", "popup = folium.GeoJsonPopup(fields=[\"naam\", \"diepte_van_m\", \"diepte_tot_m\", 'pkey_parents'])\n", "geo_json = folium.GeoJson(data=geo_df, popup=popup)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ "" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# initialize the Folium map on the centre of the selected locations, play with the zoom until ok\n", "fmap = folium.Map(zoom_start=12)\n", "geo_json.add_to(fmap)\n", "\n", "fmap.fit_bounds(fmap.get_bounds())\n", "fmap" ] } ], "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": 4 }