Example of DOV search methods for soil data (bodemgegevens)
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]:
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:
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]:
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