Example of DOV search methods for soil data (bodemgegevens)

Binder

Use cases explained below

  • Introduction to the bodem-objects

  • Get bodemsites in a bounding box

  • Get bodemlocaties with specific properties

  • Get all direct and indirect bodemobservaties linked to a bodemlocatie

  • Find all bodemlocaties where observations exist for organic carbon percentage in Geraardsbergen between 0 and 30 cm deep

  • Find Aardewerk soil locations

[1]:
%matplotlib inline

import inspect, sys
import warnings; warnings.simplefilter('ignore')
[2]:
import pandas as pd

# check pydov path
import pydov

Get information about the datatype ‘Bodemlocatie’

Other datatypes are also possible:

  • Bodemsite: BodemsiteSearch

  • Bodemobservatie: BodemobservatieSearch

[3]:
from pydov.search.bodemlocatie import BodemlocatieSearch
bodemlocatie = BodemlocatieSearch()

A description is provided for the ‘Bodemlocatie’ datatype:

[4]:
bodemlocatie.get_description()
[4]:
"Een bodemlocatie is ofwel een profielput of een boring. Een boring is altijd één puntlocatie (x,y,z) en een profielput heeft minimum één en maximum twee puntlocaties (begin- en eindpunt van de profielput). \r\nEen profielput is een uitgegraven put in de bodem waarin profielbeschrijvingen, monsternames of bodemobservaties worden uitgevoerd. Een profielbeschrijving is een waarneming van bodemhorizonten en/of bodemlagen in een uitgegraven profielput. Een bodemhorizont is een visueel te onderscheiden deel van de bodem dat ontstaan is door omzetting van het moedermateriaal door pedogenetische processen of door het afzetten van organisch materiaal. Een bodemhorizont heeft voor de meeste bodemvariabelen homogene morfologische en analytische karakteristieken. Een bodemlaag daarentegen is ontstaan door niet-pedogenetische processen. Aan de hand van een profielput krijg je een beeld van de bodemkundige opbouw.\r\nEen boring is het resultaat van het boren in de ondergrond met verwijdering van bodem door middel van een gereedschap in de vorm van een holle buis. Aan de hand van dit opgeboorde bodemmateriaal worden bodembeschrijvingen, bodemobservaties en monsternames uitgevoerd.\r\nDe bodemlocaties uit de 'Aardewerk-Vlaanderen-2010' databank worden afzonderlijk ontsloten in de datasets 'Bodemprofielen kartering Belgische bodemkaart' en 'Oppervlaktemonsters kartering Belgische bodemkaart'."

The different fields that are available for objects of the ‘Bodemlocatie’ datatype can be requested with the get_fields() method:

[5]:
fields = bodemlocatie.get_fields()

# print available fields
for f in fields.values():
    print(f['name'])
naam
pkey_bodemlocatie
type
rapport_bodemlocatie
profielbeschrijving
waarnemingsdatum
doel
x
y
mv_mtaw
Auteurs
Aantal_classificaties
Aantal_opbouwen
erfgoed
Aantal_observaties
Aantal_monsters
bodemstreek
Bodemsite
pkey_bodemsite
Opdrachten
eerste_invoer
geom
invoerdatum
educatieve_waarde

Alternatively, you can list all the fields and their details by inspecting the get_fields() output or the search instance itself in a notebook:

[6]:
bodemlocatie
[6]:
pydov.search.bodemlocatie.BodemlocatieSearch

Een bodemlocatie is ofwel een profielput of een boring. Een boring is altijd één puntlocatie (x,y,z) en een profielput heeft minimum één en maximum twee puntlocaties (begin- en eindpunt van de profielput). Een profielput is een uitgegraven put in de bodem waarin profielbeschrijvingen, monsternames of bodemobservaties worden uitgevoerd. Een profielbeschrijving is een waarneming van bodemhorizonten en/of bodemlagen in een uitgegraven profielput. Een bodemhorizont is een visueel te onderscheiden deel van de bodem dat ontstaan is door omzetting van het moedermateriaal door pedogenetische processen of door het afzetten van organisch materiaal. Een bodemhorizont heeft voor de meeste bodemvariabelen homogene morfologische en analytische karakteristieken. Een bodemlaag daarentegen is ontstaan door niet-pedogenetische processen. Aan de hand van een profielput krijg je een beeld van de bodemkundige opbouw. Een boring is het resultaat van het boren in de ondergrond met verwijdering van bodem door middel van een gereedschap in de vorm van een holle buis. Aan de hand van dit opgeboorde bodemmateriaal worden bodembeschrijvingen, bodemobservaties en monsternames uitgevoerd. De bodemlocaties uit de 'Aardewerk-Vlaanderen-2010' databank worden afzonderlijk ontsloten in de datasets 'Bodemprofielen kartering Belgische bodemkaart' en 'Oppervlaktemonsters kartering Belgische bodemkaart'.

naam - De unieke naam van de bodemlocatie.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

pkey_bodemlocatie - Permanente URL die verwijst naar de gegevens van de bodemlocatie op de website.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

type - Het type van de bodemlocatie: boring of profielput.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False
  • codelist:
  • pydov.util.codelists.FeatureCatalogueValues

    boring - boring - Een boring is het resultaat van het boren in de ondergrond met verwijdering van bodem door middel van een gereedschap in de vorm van een holle buis. Aan de hand van dit opgeboorde bodemmateriaal worden bodembeschrijvingen, bodemobservaties en monsternames uitgevoerd.

    profielput - profielput - Een profielput is een uitgegraven put in de bodem waarin profielbeschrijvingen, monsternames of bodemobservaties worden uitgevoerd. Een profielbeschrijving is een waarneming van bodemhorizonten en/of bodemlagen in een uitgegraven profielput. Een bodemhorizont is een visueel te onderscheiden deel van de bodem dat ontstaan is door omzetting van het moedermateriaal door pedogenetische processen of door het afzetten van organisch materiaal. Een bodemhorizont heeft voor de meeste bodemvariabelen homogene morfologische en analytische karakteristieken. Een bodemlaag daarentegen is ontstaan door niet-pedogenetische processen. Aan de hand van een profielput krijg je een beeld van de bodemkundige opbouw.

rapport_bodemlocatie - URL die verwijst naar een volledig rapport van de bodemlocatie in PDF formaat.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

profielbeschrijving - URL die verwijst naar de profielbeschrijving van de bodemlocatie in PDF formaat.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

waarnemingsdatum - De datum waarop de bodemlocatie bestudeerd en geobserveerd werd.

  • type: date
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

doel - Het doel van de bodemlocatie: bodemkundige opbouw, infrastructuurwerken, ruilverkaveling, archeologische opgraving, bodemobservaties, ...

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

x - De x-coördinaat van (het startpunt van) de bodemlocatie in het Lambert72 coördinaatsysteem (in meter, EPSG:31370).

  • type: float
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

y - De y-coördinaat van (het startpunt van) de bodemlocatie in het Lambert72 coördinaatsysteem (in meter, EPSG:31370).

  • type: float
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

mv_mtaw - De hoogte van het maaiveld van (het startpunt van) de bodemlocatie in het TAW stelsel (in meter).

  • type: float
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

Auteurs - De auteur die de bodemlocatie bestudeerd en/of geobserveerd heeft.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

Aantal_classificaties - Het aantal classficiaties aan een bodemlocatie. Er kunnen verschillende types classificaties aan een bodemlocatie worden gehangen: Belgische classificatie, WRB classificatie, ...

  • type: integer
  • notnull: True
  • query: True
  • cost: 1
  • multivalue: False

Aantal_opbouwen - Geeft aan hoeveel verschillende types bodemkundige opbouw beschikbaar zijn voor deze bodemlocatie (van 0 t.e.m. 3): algemeen, technisch en/of WRB diagnostisch.

  • type: integer
  • notnull: True
  • query: True
  • cost: 1
  • multivalue: False

erfgoed - Of de bodemlocatie gekend is als bodemkundig erfgoed, om één of meerdere redenen.

  • type: boolean
  • notnull: True
  • query: True
  • cost: 1
  • multivalue: False

Aantal_observaties - Het aantal observaties dat aan de bodemlocatie gekoppeld is.

  • type: integer
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

Aantal_monsters - Het aantal monsters dat aan de bodemlocatie gekoppeld is.

  • type: integer
  • notnull: True
  • query: True
  • cost: 1
  • multivalue: False

bodemstreek - De bodemstreek waarin deze bodemlocatie gelegen is volgens de Digitale Bodemkaart van het Vlaamse Gewest.

  • type: string
  • notnull: True
  • query: True
  • cost: 1
  • multivalue: False

Bodemsite - De naam van de bodemsite waaraan de bodemlocatie gekoppeld is.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

pkey_bodemsite - Permanente URL die verwijst naar de gegevens van de bodemsite waaraan de bodemlocatie gekoppeld is, op de website.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

Opdrachten - De DOV-opdracht(en) waaraan de bodemlocatie gekoppeld is.

  • type: string
  • notnull: False
  • query: True
  • cost: 1
  • multivalue: False

eerste_invoer - Het tijdstip waarop deze bodemlocatie voor het eerst in DOV ingevoerd werd.

  • type: datetime
  • notnull: True
  • query: True
  • cost: 1
  • multivalue: False

geom - None

  • type: geometry
  • notnull: False
  • query: False
  • cost: 1
  • multivalue: False

invoerdatum - Datum van invoer van de bodemlocatie.

  • type: date
  • notnull: False
  • query: False
  • cost: 10
  • multivalue: False

educatieve_waarde - Educatieve waarde van de bodemlocatie.

  • type: string
  • notnull: False
  • query: False
  • cost: 10
  • multivalue: False

Example use cases

Get bodemsites in a bounding box

Get data for all the bodemsites that are geographically located completely within the bounds of the specified box.

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.

The same methods can be used for other bodem objects.

[7]:
from pydov.search.bodemsite import BodemsiteSearch
bodemsite = BodemsiteSearch()
[8]:
from pydov.util.location import Within, Box

df = bodemsite.search(location=Within(Box(148000, 160800, 160000, 169500, epsg=31370)))
df.head()
[000/001] .
[000/029] ccccccccccccccccccccccccccccc
[8]:
pkey_bodemsite naam waarnemingsdatum beschrijving invoerdatum
0 https://www.dov.vlaanderen.be/data/bodemsite/2... CN_269435 2021-04-03 Curieuzeneuzen: meetsite in een particuliere tuin 2023-09-29
1 https://www.dov.vlaanderen.be/data/bodemsite/2... CN_270914 2021-04-03 Curieuzeneuzen: meetsite in een particuliere tuin 2023-09-29
2 https://www.dov.vlaanderen.be/data/bodemsite/2... CN_286763 2021-04-03 Curieuzeneuzen: meetsite in een schooltuin 2023-09-29
3 https://www.dov.vlaanderen.be/data/bodemsite/2... CN_287465 2021-04-03 Curieuzeneuzen: meetsite in een openbaar groen... 2023-09-29
4 https://www.dov.vlaanderen.be/data/bodemsite/2... Zoniënwoud_Groenendaal NaN Zachte helling op plateau, Bodem nooit onder l... NaN

The dataframe contains a list of bodemsites. The available data are flattened to represent unique attributes per row of the dataframe.

Using the pkey_bodemsite field one can request the details of this bodemsite in a webbrowser:

[9]:
for pkey_bodemsite in set(df.pkey_bodemsite.head()):
    print(pkey_bodemsite)
https://www.dov.vlaanderen.be/data/bodemsite/2017-000210
https://www.dov.vlaanderen.be/data/bodemsite/2021-007106
https://www.dov.vlaanderen.be/data/bodemsite/2021-007116
https://www.dov.vlaanderen.be/data/bodemsite/2021-007484
https://www.dov.vlaanderen.be/data/bodemsite/2021-007552

Get bodemlocaties with specific properties

Next to querying bodem objects based on their geographic location within a bounding box, we can also search for bodem objects matching a specific set of properties. The same methods can be used for all bodem objects. For this we can build a query using a combination of the ‘Bodemlocatie’ fields and operators provided by the WFS protocol.

A list of possible operators can be found below:

[10]:
[i for i,j in inspect.getmembers(sys.modules['owslib.fes2'], inspect.isclass) if 'Property' in i]
[10]:
['PropertyIsBetween',
 'PropertyIsEqualTo',
 'PropertyIsGreaterThan',
 'PropertyIsGreaterThanOrEqualTo',
 'PropertyIsLessThan',
 'PropertyIsLessThanOrEqualTo',
 'PropertyIsLike',
 'PropertyIsNotEqualTo',
 'PropertyIsNull',
 'SortProperty']

In this example we build a query using the PropertyIsEqualTo operator to find all bodemlocaties with bodemstreek ‘zandstreek’. We use max_features=10 to limit the results to 10.

[11]:
from owslib.fes2 import PropertyIsEqualTo

query = PropertyIsEqualTo(propertyname='bodemstreek',
                          literal='Zandstreek')
df = bodemlocatie.search(query=query, max_features=10)

df.head()
[000/001] .
[000/010] cccccccccc
[11]:
pkey_bodemlocatie pkey_bodemsite naam type waarnemingsdatum doel x y mv_mtaw erfgoed bodemstreek invoerdatum educatieve_waarde
0 https://www.dov.vlaanderen.be/data/bodemlocati... NaN ARCH_2017C381_WP0001BP01 profielput 2017-03-27 archeologische proefputten ifv prehistorische ... 100951.02 197304.89 6.11 False Zandstreek 2022-03-02 NaN
1 https://www.dov.vlaanderen.be/data/bodemlocati... NaN ARCH_2018D174_1 profielput 2018-11-07 archeologische proefsleuven en proefputten 136567.44 209067.73 13.17 False Zandstreek 2022-03-02 NaN
2 https://www.dov.vlaanderen.be/data/bodemlocati... NaN ARCH_2018D174_2 profielput 2018-11-07 archeologische proefsleuven en proefputten 136520.06 209040.88 13.75 False Zandstreek 2022-03-02 NaN
3 https://www.dov.vlaanderen.be/data/bodemlocati... NaN ARCH_2018D174_3 profielput 2018-11-07 archeologische proefsleuven en proefputten 136458.47 209006.77 13.41 False Zandstreek 2022-03-02 NaN
4 https://www.dov.vlaanderen.be/data/bodemlocati... NaN ARCH_2021L196_463.1 profielput 2021-12-21 archeologische proefsleuven en proefputten 119075.97 201394.21 5.75 False Zandstreek 2022-03-07 NaN

Once again we can use the pkey_bodemlocatie as a permanent link to the information of these bodemlocaties:

[12]:
for pkey_bodemlocatie in set(df.pkey_bodemlocatie.head()):
    print(pkey_bodemlocatie)
https://www.dov.vlaanderen.be/data/bodemlocatie/2017-018199
https://www.dov.vlaanderen.be/data/bodemlocatie/2021-024151
https://www.dov.vlaanderen.be/data/bodemlocatie/2018-022980
https://www.dov.vlaanderen.be/data/bodemlocatie/2018-022978
https://www.dov.vlaanderen.be/data/bodemlocatie/2018-022979

Get all observaties linked to bodemlocatie

Get all bodemobservaties in a specific bodemlocatie. Direct means bodemobservaties directly linked with a bodemlocatie. Indirect means bodemobservaties linked with child-objects of the bodemlocatie, like diepteintervallen or monsters.

[13]:
from pydov.search.observatie import ObservatieSearch
from pydov.search.monster import MonsterSearch

from pydov.search.bodemlocatie import BodemlocatieSearch
from pydov.search.bodemdiepteinterval import BodemdiepteintervalSearch

from owslib.fes2 import PropertyIsEqualTo
from pydov.util.query import Join, FuzzyJoin

bodemlocatie = BodemlocatieSearch()
bodemdiepteinterval = BodemdiepteintervalSearch()
monster = MonsterSearch()
observatie = ObservatieSearch()

# prepare an empty dataframe to store all observations:
df_observaties = pd.DataFrame()

First, we get the soil locations (bodemlocaties) of our interest:

[14]:
df_bodemlocaties = bodemlocatie.search(query=PropertyIsEqualTo(propertyname='naam', literal='VMM_INF_52'),
                                   return_fields=('pkey_bodemlocatie',))
df_bodemlocaties.head()
[000/001] .
[14]:
pkey_bodemlocatie
0 https://www.dov.vlaanderen.be/data/bodemlocati...

First, let’s search for all observations that are linked directly to the soil location:

[15]:
# find observations linked directly to the soil location
df_obs = observatie.search(
    query=Join(df_bodemlocaties, on='pkey_parent', using='pkey_bodemlocatie')
)

# in this case, the parent is the soil location
df_obs['pkey_bodemlocatie'] = df_obs['pkey_parent']

# add these observations to the dataframe with observations
df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)
df_observaties
[000/000] .
[15]:
pkey_observatie pkey_parent fenomeentijd diepte_van_m diepte_tot_m parametergroep parameter detectieconditie resultaat eenheid methode uitvoerder herkomst pkey_bodemlocatie

Observations can also be linked to a specific depth interval of the soil location. First, we have to find all depth intervals, and then search for observations linked to those:

[16]:
# find all depth intervals linked to the soil location
df_diepteintervallen = bodemdiepteinterval.search(
    query=Join(df_bodemlocaties, on='pkey_bodemlocatie'),
    return_fields=('pkey_diepteinterval','pkey_bodemlocatie',)
)

if len(df_diepteintervallen) > 0:

    # find all observations linked to the depth intervals
    df_obs = observatie.search(query=Join(df_diepteintervallen, on='pkey_parent', using='pkey_diepteinterval'))

    # merge the result with the depth intervals, to be able to link the observations with the soil location
    df_obs = df_obs.merge(
        df_diepteintervallen, left_on='pkey_parent', right_on='pkey_diepteinterval'
    ).drop(
        columns=('pkey_diepteinterval')
    )

    if len(df_obs) > 0:
        df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)

df_observaties
[000/001] .
[000/001] .
[16]:
pkey_observatie pkey_parent fenomeentijd diepte_van_m diepte_tot_m parametergroep parameter detectieconditie resultaat eenheid methode uitvoerder herkomst pkey_bodemlocatie
0 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
1 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
2 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
3 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
4 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
5 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
6 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
7 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
8 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
9 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
10 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
11 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
12 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
13 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
14 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
15 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...

Observations can also be linked to a sample taken from the soil location. First we have to find all samples, and then find observations linked to those:

[17]:
# find all samples linked to the soil location
df_monsters = monster.search(
    query=FuzzyJoin(df_bodemlocaties, on='pkey_parents', using='pkey_bodemlocatie'),
    return_fields=('pkey_monster', 'pkey_parents')
)

# take the first soil location from the sample's parents as the linked soil location
df_monsters['pkey_bodemlocatie'] = df_monsters['pkey_parents'].apply(lambda x: [i for i in x if 'bodemlocatie' in i][0])

if len(df_monsters) > 0:

    # find all observations linked to samples
    df_obs = observatie.search(query=Join(df_monsters, on='pkey_parent', using='pkey_monster'))

    # merge the result with the samples, to be able to link them to their soil location
    df_obs = df_obs.merge(
        df_monsters, left_on='pkey_parent', right_on='pkey_monster'
    ).drop(
        columns=['pkey_parents', 'pkey_monster']
    )

    if len(df_obs) > 0:
        df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)

df_observaties
[000/000] .
[17]:
pkey_observatie pkey_parent fenomeentijd diepte_van_m diepte_tot_m parametergroep parameter detectieconditie resultaat eenheid methode uitvoerder herkomst pkey_bodemlocatie
0 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
1 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
2 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
3 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
4 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
5 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
6 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
7 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
8 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
9 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
10 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
11 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
12 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
13 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
14 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
15 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...

Lastly, observations can also be linked to a sample linked to a specific depth interval. First we have to find all samples linked to a depth interval, and then find observations linked to those:

[18]:
# find all samples linked to a depth interval
df_monsters_diepteintervallen = monster.search(
    query=FuzzyJoin(df_diepteintervallen, on='pkey_parents', using='pkey_diepteinterval'),
    return_fields=('pkey_monster', 'pkey_parents')
)

# take the first depth interval from the sample's parents as the linked depth interval
df_monsters_diepteintervallen['pkey_diepteinterval'] = df_monsters_diepteintervallen['pkey_parents'].apply(lambda x: [i for i in x if 'diepteinterval' in i][0])

# merge the result with the depth interval to be able to link them to the soil location
df_monsters_diepteintervallen = df_monsters_diepteintervallen.merge(
    df_diepteintervallen, on='pkey_diepteinterval'
).drop(
    columns=('pkey_diepteinterval')
)

if len(df_monsters_diepteintervallen) > 0:

    # find all observations linked to the samples
    df_obs = observatie.search(query=Join(df_monsters_diepteintervallen, on='pkey_parent', using='pkey_monster'))

    # merge the result with the previous result, to be able to link them to the soil location
    df_obs = df_obs.merge(
        df_monsters_diepteintervallen, left_on='pkey_parent', right_on='pkey_monster'
    ).drop(
        columns=['pkey_parents', 'pkey_monster']
    )

    if len(df_obs) > 0:
        df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)

df_observaties
[000/001] .
[000/001] .
[18]:
pkey_observatie pkey_parent fenomeentijd diepte_van_m diepte_tot_m parametergroep parameter detectieconditie resultaat eenheid methode uitvoerder herkomst pkey_bodemlocatie
0 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
1 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
2 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
3 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
4 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
5 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
6 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
7 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
8 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
9 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
10 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
11 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
12 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
13 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
14 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
15 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
16 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/201... 2015-08-27 NaN NaN Bodem_fysisch_textuur Textuurfracties (textuurmeting) NaN NaN % Textuur pipetmethode Robinson-Köhn NaN LABO https://www.dov.vlaanderen.be/data/bodemlocati...
17 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/201... 2015-08-27 NaN NaN Bodem_fysisch_textuur Textuurfracties (textuurmeting) NaN NaN % Textuur pipetmethode Robinson-Köhn Bodemkundige Dienst van België LABO https://www.dov.vlaanderen.be/data/bodemlocati...
18 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/201... 2015-08-27 NaN NaN Bodem_fysisch_textuur Textuur - granulometrisch - klassen bodemkarte... NaN E - Klei - Textuur pipetmethode Robinson-Köhn Bodemkundige Dienst van België LABO https://www.dov.vlaanderen.be/data/bodemlocati...
19 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/201... 2015-09-08 NaN NaN Bodem_fysisch_textuur Textuurfracties (textuurmeting) NaN NaN % Textuur pipetmethode Robinson-Köhn Bodemkundige Dienst van België LABO https://www.dov.vlaanderen.be/data/bodemlocati...
20 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/201... 2015-08-27 NaN NaN Bodem_fysisch_textuur Textuur - handmatig - klassen bodemkartering (... NaN A - Leem - Textuur manuele schatting (palpatie) Bodemkundige Dienst van België LABO https://www.dov.vlaanderen.be/data/bodemlocati...

We can also group these queries into a function, which will allow us to easily reuse this with any given dataframe of soil locations (containing at least the column pkey_bodemlocatie):

[19]:
def search_all_observations(df_bodemlocaties):
    df_observaties = pd.DataFrame()

    ## Direct observations

    # find observations linked directly to the soil location
    df_obs = observatie.search(
        query=Join(df_bodemlocaties, on='pkey_parent', using='pkey_bodemlocatie')
    )

    # in this case, the parent is the soil location
    df_obs['pkey_bodemlocatie'] = df_obs['pkey_parent']

    # add these observations to the dataframe with observations
    df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)


    ## Observations linked to depth intervals

    # find all depth intervals linked to the soil location
    df_diepteintervallen = bodemdiepteinterval.search(
        query=Join(df_bodemlocaties, on='pkey_bodemlocatie'),
        return_fields=('pkey_diepteinterval','pkey_bodemlocatie',)
    )

    if len(df_diepteintervallen) > 0:

        # find all observations linked to the depth intervals
        df_obs = observatie.search(query=Join(df_diepteintervallen, on='pkey_parent', using='pkey_diepteinterval'))

        # merge the result with the depth intervals, to be able to link the observations with the soil location
        df_obs = df_obs.merge(
            df_diepteintervallen, left_on='pkey_parent', right_on='pkey_diepteinterval'
        ).drop(
            columns=('pkey_diepteinterval')
        )

        if len(df_obs) > 0:
            df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)


    ## Observations linked to samples

    # find all samples linked to the soil location
    df_monsters = monster.search(
        query=FuzzyJoin(df_bodemlocaties, on='pkey_parents', using='pkey_bodemlocatie'),
        return_fields=('pkey_monster', 'pkey_parents')
    )

    # take the first soil location from the sample's parents as the linked soil location
    df_monsters['pkey_bodemlocatie'] = df_monsters['pkey_parents'].apply(lambda x: [i for i in x if 'bodemlocatie' in i][0])

    if len(df_monsters) > 0:

        # find all observations linked to samples
        df_obs = observatie.search(query=Join(df_monsters, on='pkey_parent', using='pkey_monster'))

        # merge the result with the samples, to be able to link them to their soil location
        df_obs = df_obs.merge(
            df_monsters, left_on='pkey_parent', right_on='pkey_monster'
        ).drop(
            columns=['pkey_parents', 'pkey_monster']
        )

        if len(df_obs) > 0:
            df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)


    ## Observations linked to samples linked to depth intervals

    # find all samples linked to a depth interval
    df_monsters_diepteintervallen = monster.search(
        query=FuzzyJoin(df_diepteintervallen, on='pkey_parents', using='pkey_diepteinterval'),
        return_fields=('pkey_monster', 'pkey_parents')
    )

    # take the first depth interval from the sample's parents as the linked depth interval
    df_monsters_diepteintervallen['pkey_diepteinterval'] = df_monsters_diepteintervallen['pkey_parents'].apply(lambda x: [i for i in x if 'diepteinterval' in i][0])

    # merge the result with the depth interval to be able to link them to the soil location
    df_monsters_diepteintervallen = df_monsters_diepteintervallen.merge(
        df_diepteintervallen, on='pkey_diepteinterval'
    ).drop(
        columns=('pkey_diepteinterval')
    )

    if len(df_monsters_diepteintervallen) > 0:

        # find all observations linked to the samples
        df_obs = observatie.search(query=Join(df_monsters_diepteintervallen, on='pkey_parent', using='pkey_monster'))

        # merge the result with the previous result, to be able to link them to the soil location
        df_obs = df_obs.merge(
            df_monsters_diepteintervallen, left_on='pkey_parent', right_on='pkey_monster'
        ).drop(
            columns=['pkey_parents', 'pkey_monster']
        )

        if len(df_obs) > 0:
            df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)

    return df_observaties

search_all_observations(df_bodemlocaties)
[000/000] .[000/001] .
[000/001] .
[000/000] .[000/001] .
[000/001] .
[19]:
pkey_observatie pkey_parent fenomeentijd diepte_van_m diepte_tot_m parametergroep parameter detectieconditie resultaat eenheid methode uitvoerder herkomst pkey_bodemlocatie
0 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
1 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
2 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
3 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
4 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
5 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
6 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
7 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
8 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
9 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
10 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
11 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
12 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
13 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
14 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
15 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Porchet-methode Bodemkundige Dienst van België VELD https://www.dov.vlaanderen.be/data/bodemlocati...
16 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/201... 2015-08-27 NaN NaN Bodem_fysisch_textuur Textuurfracties (textuurmeting) NaN NaN % Textuur pipetmethode Robinson-Köhn NaN LABO https://www.dov.vlaanderen.be/data/bodemlocati...
17 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/201... 2015-08-27 NaN NaN Bodem_fysisch_textuur Textuurfracties (textuurmeting) NaN NaN % Textuur pipetmethode Robinson-Köhn Bodemkundige Dienst van België LABO https://www.dov.vlaanderen.be/data/bodemlocati...
18 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/201... 2015-08-27 NaN NaN Bodem_fysisch_textuur Textuur - granulometrisch - klassen bodemkarte... NaN E - Klei - Textuur pipetmethode Robinson-Köhn Bodemkundige Dienst van België LABO https://www.dov.vlaanderen.be/data/bodemlocati...
19 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/201... 2015-09-08 NaN NaN Bodem_fysisch_textuur Textuurfracties (textuurmeting) NaN NaN % Textuur pipetmethode Robinson-Köhn Bodemkundige Dienst van België LABO https://www.dov.vlaanderen.be/data/bodemlocati...
20 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/201... 2015-08-27 NaN NaN Bodem_fysisch_textuur Textuur - handmatig - klassen bodemkartering (... NaN A - Leem - Textuur manuele schatting (palpatie) Bodemkundige Dienst van België LABO https://www.dov.vlaanderen.be/data/bodemlocati...

Find all soil locations with a given soil classification

Get all soil locations with a given soil classification:

[20]:
from owslib.fes2 import PropertyIsEqualTo
from pydov.util.query import Join

from pydov.search.bodemclassificatie import BodemclassificatieSearch
from pydov.search.bodemlocatie import BodemlocatieSearch

bodemclassificatie = BodemclassificatieSearch()
bl_Scbz = bodemclassificatie.search(query=PropertyIsEqualTo('bodemtype', 'Scbz'), return_fields=['pkey_bodemlocatie'])

bodemlocatie = BodemlocatieSearch()
bl = bodemlocatie.search(query=Join(bl_Scbz, 'pkey_bodemlocatie'))
bl.head()
[000/001] .
[000/001] .
[000/010] ..........
[20]:
pkey_bodemlocatie pkey_bodemsite naam type waarnemingsdatum doel x y mv_mtaw erfgoed bodemstreek invoerdatum educatieve_waarde
0 https://www.dov.vlaanderen.be/data/bodemlocati... https://www.dov.vlaanderen.be/data/bodemsite/2... HAAST_16 profielput 2015-04-16 archeologische landschappelijke profielputten 248905.67 200391.29 32.88 True Kempen 2015-04-16 ZEER
1 https://www.dov.vlaanderen.be/data/bodemlocati... NaN KART_PROF_071E/28 profielput 1960-09-30 bodemprofielen en oppervlaktemonsters karterin... 129724.00 186794.00 7.00 False Zandstreek 2019-10-11 OK
2 https://www.dov.vlaanderen.be/data/bodemlocati... NaN KART_PROF_071E/24 profielput 1960-09-29 bodemprofielen en oppervlaktemonsters karterin... 128409.00 185764.00 5.00 False Zandleemstreek 2019-10-11 OK
3 https://www.dov.vlaanderen.be/data/bodemlocati... NaN KART_PROF_071E/21 profielput 1960-09-28 bodemprofielen en oppervlaktemonsters karterin... 127729.00 185179.00 5.00 False Zandleemstreek 2019-10-11 OK
4 https://www.dov.vlaanderen.be/data/bodemlocati... NaN KART_OPP_053W/030 boring 1968-01-01 bodemprofielen en oppervlaktemonsters karterin... 73845.00 195091.00 -9999.00 False Kunstmatige gronden 2019-10-12 OK

We can also get their observations, using the function we defined earlier:

[21]:
obs = search_all_observations(bl)
obs.head()
[000/001] .
[000/001] .
[000/001] .
[000/001] .
[000/001] .
[000/001] .
[000/001] .
[21]:
pkey_observatie pkey_parent fenomeentijd diepte_van_m diepte_tot_m parametergroep parameter detectieconditie resultaat eenheid methode uitvoerder herkomst pkey_bodemlocatie
0 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemlocati... NaN NaN NaN Bodemanalyse parameters vegetatie (vegetatie) NaN gras NaN Onbekend NaN VELD https://www.dov.vlaanderen.be/data/bodemlocati...
1 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemlocati... 1960-09-30 NaN NaN Bodem_terrein Vegetatie (vegetatie) NaN Aardappel (Solanum tuberosum) - NaN Appelmans, Frans VELD https://www.dov.vlaanderen.be/data/bodemlocati...
2 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemlocati... 1960-09-30 NaN NaN Bodem_fysisch_vocht Drainage Aardewerk - interne drainage (drainag... NaN Di2 - langzaam NaN Terreinobservatie Belgische bodemkartering Appelmans, Frans VELD https://www.dov.vlaanderen.be/data/bodemlocati...
3 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemlocati... 1960-09-30 NaN NaN Bodem_fysisch_vocht Drainage Aardewerk - oppervlakkige drainage (d... NaN Dr2 - langzaam NaN Terreinobservatie Belgische bodemkartering Appelmans, Frans VELD https://www.dov.vlaanderen.be/data/bodemlocati...
4 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemlocati... 1960-09-30 NaN NaN Bodem_terrein Geologische aard - afzettingswijze laag 1 (geo... NaN st - stuif- / verstoven NaN Terreinobservatie Belgische bodemkartering Appelmans, Frans VELD https://www.dov.vlaanderen.be/data/bodemlocati...

Get all depth intervals and observations from a soil location

[22]:
from pydov.search.bodemlocatie import BodemlocatieSearch
from pydov.search.bodemdiepteinterval import BodemdiepteintervalSearch
from pydov.util.query import Join
from owslib.fes2 import PropertyIsEqualTo

bodemlocatie = BodemlocatieSearch()
bodemdiepteinterval = BodemdiepteintervalSearch()

bodemlocaties = bodemlocatie.search(query=PropertyIsEqualTo(propertyname='naam', literal='VMM_INF_52'),
                                    return_fields=('pkey_bodemlocatie',))

bodemdiepteintervallen = bodemdiepteinterval.search(
    query=Join(bodemlocaties, on='pkey_bodemlocatie'))
bodemdiepteintervallen
[000/001] .
[000/001] .
[22]:
pkey_diepteinterval pkey_bodemopbouw pkey_bodemlocatie nr type naam bovengrens1_cm bovengrens2_cm ondergrens1_cm ondergrens2_cm ondergrens_bereikt grensduidelijkheid grensregelmatigheid beschrijving x y mv_mtaw
0 https://www.dov.vlaanderen.be/data/bodemdiepte... https://www.dov.vlaanderen.be/data/bodemopbouw... https://www.dov.vlaanderen.be/data/bodemlocati... 1 horizont NaN 0.0 NaN 10.0 NaN NVT NaN NaN - 129586.0 182459.0 30.7
1 https://www.dov.vlaanderen.be/data/bodemdiepte... https://www.dov.vlaanderen.be/data/bodemopbouw... https://www.dov.vlaanderen.be/data/bodemlocati... 2 horizont NaN 10.0 NaN 40.0 NaN NVT NaN NaN - 129586.0 182459.0 30.7
2 https://www.dov.vlaanderen.be/data/bodemdiepte... https://www.dov.vlaanderen.be/data/bodemopbouw... https://www.dov.vlaanderen.be/data/bodemlocati... 3 horizont NaN 40.0 NaN 85.0 NaN NVT NaN NaN horizont gebruikt voor infiltratiemetingen 129586.0 182459.0 30.7
3 https://www.dov.vlaanderen.be/data/bodemdiepte... https://www.dov.vlaanderen.be/data/bodemopbouw... https://www.dov.vlaanderen.be/data/bodemlocati... 4 horizont NaN 85.0 NaN 130.0 NaN NVT NaN NaN - 129586.0 182459.0 30.7
4 https://www.dov.vlaanderen.be/data/bodemdiepte... https://www.dov.vlaanderen.be/data/bodemopbouw... https://www.dov.vlaanderen.be/data/bodemlocati... 5 horizont NaN 130.0 NaN 200.0 NaN NEE NaN NaN - 129586.0 182459.0 30.7

And get their observations:

[23]:
# direct observaties linked to diepteintervallen
df_observaties = observatie.search(query=Join(bodemdiepteintervallen, on='pkey_parent', using='pkey_diepteinterval'))
df_observaties.head()
[000/001] .
[23]:
pkey_observatie pkey_parent fenomeentijd diepte_van_m diepte_tot_m parametergroep parameter detectieconditie resultaat eenheid methode uitvoerder herkomst
0 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD
1 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD
2 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Open-end-methode Bodemkundige Dienst van België VELD
3 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat Enkele-ring-methode Bodemkundige Dienst van België VELD
4 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/bodemdiepte... 2015-09-08 NaN NaN Bodem_fysisch_vocht Ksat (ksat) NaN 0.00E00 m/s Ksat_Soakaway_methode Bodemkundige Dienst van België VELD

Find all bodemlocaties where observations exist for organic carbon percentage in Geraardsbergen between 0 and 30 cm deep

Get boundaries of Geraardsbergen by using a WFS

[24]:
from owslib.etree import etree
from owslib.wfs import WebFeatureService
from pydov.util.location import (
    GmlFilter,
    Within,
)

from owslib.fes import PropertyIsEqualTo

gemeentegrenzen = WebFeatureService(
    'https://geo.api.vlaanderen.be/VRBG/wfs',
    version='1.1.0')

gemeente_filter = PropertyIsEqualTo(propertyname='NAAM', literal='Geraardsbergen')
gemeente_poly = gemeentegrenzen.getfeature(
    typename='VRBG:Refgem',
    filter=etree.tostring(gemeente_filter.toXML()).decode("utf8"),
    outputFormat='text/xml; subtype=gml/3.2').read()

Get bodemobservaties in Geraardsbergen with the requested properties:

[25]:
import pandas as pd

from owslib.fes2 import PropertyIsEqualTo, PropertyIsGreaterThanOrEqualTo, PropertyIsLessThanOrEqualTo
from owslib.fes2 import And

from pydov.util.query import Join, FuzzyJoin

from pydov.search.bodemlocatie import BodemlocatieSearch
from pydov.search.bodemdiepteinterval import BodemdiepteintervalSearch
from pydov.search.observatie import ObservatieSearch
from pydov.search.monster import MonsterSearch

bodemlocatie = BodemlocatieSearch()
diepteinterval = BodemdiepteintervalSearch()
observatie = ObservatieSearch()
monster = MonsterSearch()

df_observaties = pd.DataFrame()

df_bodemlocaties = bodemlocatie.search(
    location=GmlFilter(gemeente_poly, Within)
)

parameter_name = 'Organische C - percentage (organische_c_perc)'

## Direct observations

# find observations linked directly to the soil location
df_obs = observatie.search(
    query=And([
        Join(df_bodemlocaties, on='pkey_parent', using='pkey_bodemlocatie'),
        PropertyIsEqualTo('parameter', parameter_name),
        PropertyIsGreaterThanOrEqualTo('diepte_van_m', '0'),
        PropertyIsLessThanOrEqualTo('diepte_tot_m', '0.3')
    ])
)

# in this case, the parent is the soil location
df_obs['pkey_bodemlocatie'] = df_obs['pkey_parent']

# add these observations to the dataframe with observations
df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)

## Observations linked to depth intervals

df_diepteintervallen = diepteinterval.search(
    query=And([
        Join(df_bodemlocaties, on='pkey_bodemlocatie'),
        PropertyIsGreaterThanOrEqualTo('bovengrens1_cm', '0'),
        PropertyIsLessThanOrEqualTo('ondergrens1_cm', '30')
    ]),
    return_fields=('pkey_diepteinterval', 'pkey_bodemlocatie')
)

if len(df_diepteintervallen) > 0:

    # find all observations linked to the depth intervals
    df_obs = observatie.search(
        query=And([
            Join(df_diepteintervallen, on='pkey_parent', using='pkey_diepteinterval'),
            PropertyIsEqualTo('parameter', parameter_name)
        ])
    )

    # merge the result with the depth intervals, to be able to link the observations with the soil location
    df_obs = df_obs.merge(
        df_diepteintervallen, left_on='pkey_parent', right_on='pkey_diepteinterval'
    ).drop(
        columns=('pkey_diepteinterval')
    )

    if len(df_obs) > 0:
        df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)


## Observations linked to samples

df_monsters = monster.search(
    query=And([
         FuzzyJoin(df_bodemlocaties, on='pkey_parents', using='pkey_bodemlocatie'),
         PropertyIsGreaterThanOrEqualTo(propertyname="diepte_van_m", literal = '0'),
         PropertyIsLessThanOrEqualTo(propertyname="diepte_tot_m", literal = '0.30')
    ]),
    return_fields=('pkey_monster', 'pkey_parents')
)

# take the first soil location from the sample's parents as the linked soil location
df_monsters['pkey_bodemlocatie'] = df_monsters['pkey_parents'].apply(lambda x: [i for i in x if 'bodemlocatie' in i][0])

if len(df_monsters) > 0:

    # find all observations linked to samples
    df_obs = observatie.search(
        query=And([
            Join(df_monsters, on='pkey_parent', using='pkey_monster'),
            PropertyIsEqualTo('parameter', parameter_name)
        ])
    )

    # merge the result with the samples, to be able to link them to their soil location
    df_obs = df_obs.merge(
        df_monsters, left_on='pkey_parent', right_on='pkey_monster'
    ).drop(
        columns=['pkey_parents', 'pkey_monster']
    )

    if len(df_obs) > 0:
        df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)


## Observations linked to samples linked to depth intervals

# find all samples linked to a depth interval
df_monsters_diepteintervallen = monster.search(
    query=FuzzyJoin(df_diepteintervallen, on='pkey_parents', using='pkey_diepteinterval'),
    return_fields=('pkey_monster', 'pkey_parents')
)

# take the first depth interval from the sample's parents as the linked depth interval
df_monsters_diepteintervallen['pkey_diepteinterval'] = df_monsters_diepteintervallen['pkey_parents'].apply(lambda x: [i for i in x if 'diepteinterval' in i][0])

# merge the result with the depth interval to be able to link them to the soil location
df_monsters_diepteintervallen = df_monsters_diepteintervallen.merge(
    df_diepteintervallen, on='pkey_diepteinterval'
).drop(
    columns=('pkey_diepteinterval')
)


if len(df_monsters_diepteintervallen) > 0:

    # find all observations linked to the samples
    df_obs = observatie.search(query=And([
        Join(df_monsters_diepteintervallen, on='pkey_parent', using='pkey_monster'),
        PropertyIsEqualTo('parameter', parameter_name)
    ]))

    # merge the result with the previous result, to be able to link them to the soil location
    df_obs = df_obs.merge(
        df_monsters_diepteintervallen, left_on='pkey_parent', right_on='pkey_monster'
    ).drop(
        columns=['pkey_parents', 'pkey_monster']
    )

    if len(df_obs) > 0:
        df_observaties = pd.concat([df_observaties, df_obs]).reset_index(drop=True)

df_observaties.head()

[000/001] .
[000/309] ..................................................
[050/309] ..................................................
[100/309] ..................................................
[150/309] ..................................................
[200/309] ..................................................
[250/309] ..................................................
[300/309] .........
[000/000] .[000/001] .
[000/000] .[000/001] .
[000/001] .
[000/001] .
[000/001] .
[25]:
pkey_observatie pkey_parent fenomeentijd diepte_van_m diepte_tot_m parametergroep parameter detectieconditie resultaat eenheid methode uitvoerder herkomst pkey_bodemlocatie
0 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/202... 2021-04-03 NaN NaN Bodem_chemisch Organische C - percentage (organische_c_perc) NaN 2.11 % TOC by CN analyser na verwijderen anorganische C Universiteit Gent, Department of Green Chemist... LABO https://www.dov.vlaanderen.be/data/bodemlocati...
1 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/202... 2021-04-03 NaN NaN Bodem_chemisch Organische C - percentage (organische_c_perc) NaN 2.46 % TOC by CN analyser na verwijderen anorganische C Universiteit Gent, Department of Green Chemist... LABO https://www.dov.vlaanderen.be/data/bodemlocati...
2 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/202... 2021-04-03 NaN NaN Bodem_chemisch Organische C - percentage (organische_c_perc) NaN 3.65 % TOC by CN analyser na verwijderen anorganische C Universiteit Gent, Department of Green Chemist... LABO https://www.dov.vlaanderen.be/data/bodemlocati...
3 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/202... 2021-04-03 NaN NaN Bodem_chemisch Organische C - percentage (organische_c_perc) NaN 2.82 % TOC by CN analyser na verwijderen anorganische C Universiteit Gent, Department of Green Chemist... LABO https://www.dov.vlaanderen.be/data/bodemlocati...
4 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/202... 2021-04-03 NaN NaN Bodem_chemisch Organische C - percentage (organische_c_perc) NaN 0.75 % TOC by CN analyser na verwijderen anorganische C Universiteit Gent, Department of Green Chemist... LABO https://www.dov.vlaanderen.be/data/bodemlocati...

Now we have all observations with the requested properties. Next we need to link them with the bodemlocatie

[26]:
import pandas as pd

# Merge the bodemlocatie information together with the observation information
merged = pd.merge(df_observaties, df_bodemlocaties, on="pkey_bodemlocatie", how='left')
merged.head()
[26]:
pkey_observatie pkey_parent fenomeentijd diepte_van_m diepte_tot_m parametergroep parameter detectieconditie resultaat eenheid ... type waarnemingsdatum doel x y mv_mtaw erfgoed bodemstreek invoerdatum educatieve_waarde
0 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/202... 2021-04-03 NaN NaN Bodem_chemisch Organische C - percentage (organische_c_perc) NaN 2.11 % ... boring 2021-04-03 bodemchemisch en bodemfysisch onderzoek 119024.66 158973.23 27.98 False Leemstreek 2023-09-29 NaN
1 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/202... 2021-04-03 NaN NaN Bodem_chemisch Organische C - percentage (organische_c_perc) NaN 2.46 % ... boring 2021-04-03 bodemchemisch en bodemfysisch onderzoek 111423.09 161667.22 34.08 False Zandleemstreek 2023-09-29 NaN
2 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/202... 2021-04-03 NaN NaN Bodem_chemisch Organische C - percentage (organische_c_perc) NaN 3.65 % ... boring 2021-04-03 bodemchemisch en bodemfysisch onderzoek 111828.87 161403.19 44.25 False Kunstmatige gronden 2023-09-29 NaN
3 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/202... 2021-04-03 NaN NaN Bodem_chemisch Organische C - percentage (organische_c_perc) NaN 2.82 % ... boring 2021-04-03 bodemchemisch en bodemfysisch onderzoek 121724.11 164764.12 29.22 False Zandleemstreek 2023-09-29 NaN
4 https://www.dov.vlaanderen.be/data/observatie/... https://www.dov.vlaanderen.be/data/monster/202... 2021-04-03 NaN NaN Bodem_chemisch Organische C - percentage (organische_c_perc) NaN 0.75 % ... boring 2021-04-03 bodemchemisch en bodemfysisch onderzoek 114116.35 162559.50 39.43 False NaN 2023-09-29 NaN

5 rows × 26 columns

To export the results to CSV, you can use for example:

merged.to_csv("test.csv")

We can plot also the results on a map This can take some time!

[27]:
import folium
from folium.plugins import MarkerCluster
from pyproj import Transformer

# convert the coordinates to lat/lon for folium
def convert_latlon(x1, y1):
    transformer = Transformer.from_crs("epsg:31370", "epsg:4326", always_xy=True)
    x2,y2 = transformer.transform(x1, y1)
    return x2, y2

#convert coordinates to wgs84
merged['lon'], merged['lat'] = zip(*map(convert_latlon, merged['x'], merged['y']))

# Get only location and value
loclist = merged[['lat', 'lon']].values.tolist()

# initialize the Folium map on the centre of the selected locations, play with the zoom until ok
fmap = folium.Map(location=[merged['lat'].mean(), merged['lon'].mean()], zoom_start=10)
marker_cluster = MarkerCluster().add_to(fmap)
for loc in range(0, len(loclist)):
    popup = 'Bodemlocatie: ' + merged['pkey_bodemlocatie'][loc]
    popup = popup + '<br> Observatie: ' + merged['pkey_observatie'][loc]
    popup = popup + '<br> Value: ' + merged['resultaat'][loc] + merged['eenheid'][loc]
    folium.Marker(loclist[loc], popup=popup).add_to(marker_cluster)
fmap
[27]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Filter Aardewerk soil locations

Since we know that Aardewerk soil locations make use of a specific suffix, a query could be built filtering these out.

Since we only need to match a partial string in the name, we will build a query using the PropertyIsLike operator to find all Aardewerk bodemlocaties. We use max_features=10 to limit the results to 10.

[28]:
from owslib.fes2 import PropertyIsLike

query = PropertyIsLike(propertyname='naam',
                       literal='KART_PROF_%', wildCard='%')
df = bodemlocatie.search(query=query, max_features=10)

df.head()
[000/001] .
[000/010] ..........
[28]:
pkey_bodemlocatie pkey_bodemsite naam type waarnemingsdatum doel x y mv_mtaw erfgoed bodemstreek invoerdatum educatieve_waarde
0 https://www.dov.vlaanderen.be/data/bodemlocati... NaN KART_PROF_001E/02 profielput 1954-05-31 bodemprofielen en oppervlaktemonsters karterin... 158367.0 240397.0 12.5 False Kempen 2019-10-11 OK
1 https://www.dov.vlaanderen.be/data/bodemlocati... NaN KART_PROF_007W/40 profielput 1955-07-07 bodemprofielen en oppervlaktemonsters karterin... 167292.0 229988.0 19.0 False Kempen 2019-10-11 OK
2 https://www.dov.vlaanderen.be/data/bodemlocati... NaN KART_PROF_037E/38 profielput 1952-02-01 bodemprofielen en oppervlaktemonsters karterin... 65969.0 207819.0 21.0 False Zandstreek 2019-10-11 OK
3 https://www.dov.vlaanderen.be/data/bodemlocati... NaN KART_PROF_022E/68 profielput 1951-03-02 bodemprofielen en oppervlaktemonsters karterin... 65480.0 213545.0 2.0 False Oudlandpolders 2019-10-11 OK
4 https://www.dov.vlaanderen.be/data/bodemlocati... NaN KART_PROF_099E/01 profielput 1957-10-14 bodemprofielen en oppervlaktemonsters karterin... 109819.0 167483.0 81.5 False Zandleemstreek 2019-10-11 OK

As seen in the soil data example, we can use the pkey_bodemlocatie as a permanent link to the information of these bodemlocaties:

[29]:
for pkey_bodemlocatie in set(df.pkey_bodemlocatie):
    print(pkey_bodemlocatie)
https://www.dov.vlaanderen.be/data/bodemlocatie/1958-000829
https://www.dov.vlaanderen.be/data/bodemlocatie/1955-000823
https://www.dov.vlaanderen.be/data/bodemlocatie/1954-000828
https://www.dov.vlaanderen.be/data/bodemlocatie/1952-000824
https://www.dov.vlaanderen.be/data/bodemlocatie/1952-000830
https://www.dov.vlaanderen.be/data/bodemlocatie/1955-000827
https://www.dov.vlaanderen.be/data/bodemlocatie/1951-000825
https://www.dov.vlaanderen.be/data/bodemlocatie/1957-000826
https://www.dov.vlaanderen.be/data/bodemlocatie/1949-000831
https://www.dov.vlaanderen.be/data/bodemlocatie/1954-000822