Example of DOV search methods for hydrogeological interpretations

Use cases:

  • Select interpretations in a bbox
  • Select interpretations in a bbox with selected properties
  • Select interpretations in a municipality
  • Get interpretations using info from wfs fields, not available in the standard output dataframe

In [1]:
%matplotlib inline
import os, sys
import inspect

In [3]:
import pydov

Get information about code base


In [4]:
from pydov.search.interpretaties import HydrogeologischeStratigrafieSearch
ip_hydrogeo = HydrogeologischeStratigrafieSearch()

# information about the HydrogeologischeStratigrafie type (In Dutch):
print(ip_hydrogeo.get_description())


De hydrostratigrafie geeft, op basis van de (gecodeerde) lithologie, een indeling weer naar de al dan niet watervoerende eigenschappen van een bepaald beschreven diepte-interval. Deze interpretatie respecteert de lithostratigrafie van het Tertiair, maar deelt deze anders in. De hiervoor gebruikte standaard is de Hydrogeologische Codering van de Ondergrond van Vlaanderen (HCOV). Deze kan beschouwd worden als de officiele hydrogeologische codering voor het Vlaams Gewest.

In [5]:
# information about the available fields for a HydrogeologischeStratigrafie object
fields = ip_hydrogeo.get_fields()
# print available fields
for f in fields.values():
    print(f['name'])


pkey_interpretatie
Type_proef
Proefnummer
pkey_boring
x
y
Z_mTAW
diepte_tot_m
gemeente
Auteurs
Datum
Opdrachten
betrouwbaarheid_interpretatie
Geldig_van
Geldig_tot
diepte_laag_van
diepte_laag_tot
aquifer

In [6]:
# print information for a certain field
fields['aquifer']


Out[6]:
{'name': 'aquifer',
 'type': 'string',
 'definition': 'code van de watervoerende laag waarin de laag Hydrogeologische stratigrafie zich bevindt.',
 'notnull': False,
 'query': False,
 'cost': 10,
 'values': {'0000': 'Onbekend',
  '0100': 'Quartaire aquifersystemen',
  '0110': 'Ophogingen',
  '0120': 'Duinen',
  '0130': 'Polderafzettingen',
  '0131': 'Kleiige polderafzettingen van de kustvlakte',
  '0132': 'Kleiige polderafzettingen van het Meetjesland',
  '0133': 'Kleiige polderafzettingen van Waasland-Antwerpen',
  '0134': 'Zandige kreekruggen',
  '0135': 'Veen-kleiige poelgronden',
  '0140': 'Alluviale deklagen',
  '0150': 'Deklagen',
  '0151': 'Zandige deklagen',
  '0152': 'Zand-lemige deklagen',
  '0153': 'Lemige deklagen',
  '0154': 'Kleiige deklagen',
  '0160': 'Pleistocene afzettingen',
  '0161': 'Pleistoceen van de kustvlakte',
  '0162': 'Pleistoceen van de Vlaamse Vallei',
  '0163': 'Pleistoceen van de riviervalleien',
  '0170': 'Maas- en Rijnafzettingen',
  '0171': 'Afzettingen Hoofdterras',
  '0172': 'Afzettingen Tussenterassen',
  '0173': 'Afzettingen Maasvlakte',
  '0200': 'Kempens Aquifersysteem',
  '0210': 'Kiezeloolietformatie ten noorden van Feldbiss',
  '0211': 'Zandige eenheid boven de Brunssum I-klei',
  '0212': 'Brunssum I-Klei',
  '0213': 'Zand van Pey',
  '0214': 'Brunssum II-klei',
  '0215': 'Zand van Waubach',
  '0220': 'Klei-zand-complex van de Kempen',
  '0221': 'Klei van Turnhout',
  '0222': 'Zand van Beerse',
  '0223': 'Klei van Rijkevorsel',
  '0230': 'Pleistoceen en Plioceen aquifer',
  '0231': 'Zanden van Brasschaat en/of Merksplas',
  '0232': 'Zand van Mol',
  '0233': 'Zandige top van Lillo',
  '0234': 'Zand van Poederlee en/of zandige top van Kasterlee',
  '0240': 'Pliocene kleiige laag',
  '0241': 'Kleiig deel van Lillo en/of van de overgang Lillo-Kattendijk',
  '0242': 'Kleiige overgang tussen de zanden van Kasterlee en Diest',
  '0250': 'Mioceen Aquifersysteem',
  '0251': 'Zand van Kattendijk en/of onderste zandlaag van Lillo',
  '0252': 'Zand van Diest',
  '0253': 'Zand van Bolderberg',
  '0254': 'Zanden van Berchem en/of Voort',
  '0255': 'Klei van Veldhoven',
  '0256': 'Zand van Eigenbilzen',
  '0300': 'Boom Aquitard',
  '0301': 'Kleiig deel van Eigenbilzen',
  '0302': 'Klei van Putte',
  '0303': 'Klei van Terhagen',
  '0304': 'Klei van Belsele-Waas',
  '0400': 'Oligoceen Aquifersysteem',
  '0410': 'Zand van Kerniel',
  '0420': 'Klei van Kleine-Spouwen',
  '0430': 'Ruisbroek-Berg Aquifer',
  '0431': 'Zand van Berg',
  '0432': 'Zand van Kerkom',
  '0433': 'Kleiig zand van Oude Biezen',
  '0434': 'Zand van Boutersem',
  '0435': 'Zand van Ruisbroek',
  '0436': 'Zand van Wintham',
  '0440': 'Tongeren Aquitard',
  '0441': 'Klei van Henis',
  '0442': 'Klei van Watervliet',
  '0450': 'Onder-Oligoceen Aquifersysteem',
  '0451': 'Zand van Neerrepen',
  '0452': 'Zand-Klei van Grimmertingen',
  '0453': 'Kleiig zand van Bassevelde',
  '0500': 'Bartoon Aquitardsysteem',
  '0501': 'Klei van Onderdijke',
  '0502': 'Zand van Buisputten',
  '0503': 'Klei van Zomergem',
  '0504': 'Zand van Onderdaele',
  '0505': 'Kleien van Ursel en/of Asse',
  '0600': 'Ledo Paniseliaan Brusseliaan Aquifersysteem',
  '0610': 'Wemmel-Lede Aquifer',
  '0611': 'Zand van Wemmel',
  '0612': 'Zand van Lede',
  '0620': 'Zand van Brussel',
  '0630': 'Afzettingen van het Boven-Paniseliaan',
  '0631': 'Zanden van Aanlter en/of Oedelem',
  '0632': 'Zandige klei van Beernem',
  '0640': 'Zandige afzettingen van het Onder-Paniseliaan (Vlierzele en/of Aalterbrugge)',
  '0700': 'Paniseliaan Aquitard',
  '0701': 'Klei van Pittem',
  '0702': 'Klei van Merelbeke',
  '0800': 'Ieperiaan Aquifer (Egem en of Mont-Panisel)',
  '0900': 'Ieperiaan aquitardsysteem',
  '0910': 'Silt van Kortemark',
  '0920': 'Afzettingen van Kortrijk',
  '0921': 'Klei van Aalbeke',
  '0922': 'Klei van Moen',
  '0923': 'Zand van Mons-en-Pévèle',
  '0924': 'Klei van Saint-Maur',
  '0925': 'Klei van Mont-Héribu',
  '1000': 'Paleoceen Aquifersysteem',
  '1010': 'Landeniaan Aquifersysteem',
  '1011': 'Zand van Knokke',
  '1012': 'Zandige afzettingen van Loksbergen en/of Dormaal',
  '1013': 'Zand van Grandglise en/of Hoegaarden',
  '1014': 'Kleiig deel van Lincent',
  '1015': 'Versteend deel van Lincent',
  '1020': 'Landeniaan en Heersiaan Aquitard',
  '1021': 'Siltige afzetting van Halen',
  '1022': 'Klei van Waterschei',
  '1023': 'Slecht doorlatend deel van de mergels van Gelinden',
  '1030': 'Heersiaan en Opglabbeek Aquifersysteem',
  '1031': 'Doorlatend deel van de Mergels van Gelinden',
  '1032': 'Zand van Orp',
  '1033': 'Zand van Eisden',
  '1034': 'Klei van Opoeteren',
  '1035': 'Zand van Maasmechelen',
  '1100': 'Krijt Aquifersysteem',
  '1110': 'Krijt Aquifer',
  '1111': 'Kalksteen van Houthem',
  '1112': 'Tufkrijt van Maastricht',
  '1113': 'Krijt van Gulpen',
  '1120': 'Afzettingen van Vaals (Smectiet van Herve)',
  '1130': 'Zand van Aken',
  '1140': 'Turoonmergels op Massief van Brabant',
  '1150': 'Wealdiaan',
  '1200': 'Jura-Trias-Perm',
  '1210': 'Jura',
  '1220': 'Trias',
  '1230': 'Perm',
  '1300': 'Sokkel',
  '1310': 'Boven-Carboon',
  '1320': 'Kolenkalk',
  '1330': 'Devoon',
  '1340': 'Cambro-Siluur Massief van Brabant'}}

The cost is an arbitrary attribute to indicate if the information is retrieved from a wfs query (cost = 1), or from an xml (cost = 10)


In [7]:
# if an attribute can have several values, these are listed under 'values', e.g. for 'Type_proef':
fields['Type_proef']


Out[7]:
{'name': 'Type_proef',
 'definition': "Het type van de proef waarvan de hydrogeologische stratigrafie een interpretatie is. Bij een hydrogeologische stratigrafie zal dit altijd 'Boring' zijn.",
 'type': 'string',
 'notnull': False,
 'query': True,
 'cost': 1,
 'values': {'Boring': 'De hydrogeologische stratigrafie is een interpretatie van een boring.'}}

Try-out of use cases

Select interpretations in a bbox


In [8]:
from pydov.util.location import Within, Box

# Get all borehole data in a bounding box (llx, lly, ulx, uly)
# the pkey_boring link is not available below, but is in the df
df = ip_hydrogeo.search(location=Within(Box(153145, 206930, 153150, 206935)))
print(df.head())


[000/001] .
                                  pkey_interpretatie  \
0  https://www.dov.vlaanderen.be/data/interpretat...   
1  https://www.dov.vlaanderen.be/data/interpretat...   

                                         pkey_boring  \
0  https://www.dov.vlaanderen.be/data/boring/1974...   
1  https://www.dov.vlaanderen.be/data/boring/1974...   

  betrouwbaarheid_interpretatie         x         y  diepte_laag_van  \
0                          goed  153147.0  206931.0              0.0   
1                          goed  153147.0  206931.0              2.5   

   diepte_laag_tot aquifer  
0              2.5    0152  
1              7.0    0254  

Select interpretations in a bbox with selected properties


In [9]:
# list available query methods
methods = [i for i,j in inspect.getmembers(sys.modules['owslib.fes'], 
                                           inspect.isclass) 
           if 'Property' in i]
print(methods)
from owslib.fes import PropertyIsGreaterThanOrEqualTo


['PropertyIsBetween', 'PropertyIsEqualTo', 'PropertyIsGreaterThan', 'PropertyIsGreaterThanOrEqualTo', 'PropertyIsLessThan', 'PropertyIsLessThanOrEqualTo', 'PropertyIsLike', 'PropertyIsNotEqualTo', 'PropertyIsNull', 'SortProperty']

The property feature methodes listed above are available from the owslib module. These were not adapted for use in pydov.


In [10]:
# Get deep boreholes in a bounding box 
from owslib.fes import PropertyIsEqualTo
# the propertyname can be any of the fields of the hydrogeological interpretations object that belong to the wfs source
# the literal is always a string, no matter what its definition is in the boring object (string, float...)
query = PropertyIsGreaterThanOrEqualTo(
        propertyname='betrouwbaarheid_interpretatie', literal='goed')
df = ip_hydrogeo.search(location=Within(Box(153145, 206930, 153150, 206935)),
                        query=query
                       )
print(df.head())


[000/001] c
                                  pkey_interpretatie  \
0  https://www.dov.vlaanderen.be/data/interpretat...   
1  https://www.dov.vlaanderen.be/data/interpretat...   

                                         pkey_boring  \
0  https://www.dov.vlaanderen.be/data/boring/1974...   
1  https://www.dov.vlaanderen.be/data/boring/1974...   

  betrouwbaarheid_interpretatie         x         y  diepte_laag_van  \
0                          goed  153147.0  206931.0              0.0   
1                          goed  153147.0  206931.0              2.5   

   diepte_laag_tot aquifer  
0              2.5    0152  
1              7.0    0254  

Select interpretations in a municipality


In [11]:
query = PropertyIsEqualTo(propertyname='gemeente',
                          literal='Aartselaar')
df = ip_hydrogeo.search(query=query)
print(df.head())


[000/006] ......
                                  pkey_interpretatie  \
0  https://www.dov.vlaanderen.be/data/interpretat...   
1  https://www.dov.vlaanderen.be/data/interpretat...   
2  https://www.dov.vlaanderen.be/data/interpretat...   
3  https://www.dov.vlaanderen.be/data/interpretat...   
4  https://www.dov.vlaanderen.be/data/interpretat...   

                                         pkey_boring  \
0  https://www.dov.vlaanderen.be/data/boring/1950...   
1  https://www.dov.vlaanderen.be/data/boring/1950...   
2  https://www.dov.vlaanderen.be/data/boring/1895...   
3  https://www.dov.vlaanderen.be/data/boring/1895...   
4  https://www.dov.vlaanderen.be/data/boring/1894...   

  betrouwbaarheid_interpretatie         x         y  diepte_laag_van  \
0                          goed  151457.0  201527.0              0.0   
1                          goed  151457.0  201527.0             49.0   
2                          goed  151041.0  202065.0              0.0   
3                          goed  151041.0  202065.0              2.6   
4                          goed  150678.0  200279.0              0.0   

   diepte_laag_tot aquifer  
0             49.0    0300  
1             59.0    0400  
2              2.6    0151  
3              3.1    0254  
4              2.7    0160  

Get interpretations using info from wfs fields, not available in the standard output dataframe

To keep the dataframe size acceptable, not all wfs fields are included in the standard output. However, one can use this information to select interpretations as illustrated below. The available wfs fields can be viewed in the object catalog of the 'Hydrogeologische stratigrafie' wfs service, on-line [2018 05 16]: https://www.dov.vlaanderen.be/geonetwork/apps/tabsearch/index.html?hl=dut. For example, make a selection of the interpretations in the municipality of Antwerp that were derived from cpt data


In [12]:
from owslib.fes import And
from owslib.fes import PropertyIsEqualTo
query = And([PropertyIsEqualTo(propertyname='gemeente',
                               literal='Antwerpen'),
             PropertyIsEqualTo(propertyname='Type_proef', 
                               literal='Boring')]
            )
df = ip_hydrogeo.search(query=query, )
print(df.head())


[000/191] ..................................................
[050/191] ..................................................
[100/191] ...............................................c..
[150/191] .........................................
                                  pkey_interpretatie  \
0  https://www.dov.vlaanderen.be/data/interpretat...   
1  https://www.dov.vlaanderen.be/data/interpretat...   
2  https://www.dov.vlaanderen.be/data/interpretat...   
3  https://www.dov.vlaanderen.be/data/interpretat...   
4  https://www.dov.vlaanderen.be/data/interpretat...   

                                         pkey_boring  \
0  https://www.dov.vlaanderen.be/data/boring/1956...   
1  https://www.dov.vlaanderen.be/data/boring/1956...   
2  https://www.dov.vlaanderen.be/data/boring/1956...   
3  https://www.dov.vlaanderen.be/data/boring/1979...   
4  https://www.dov.vlaanderen.be/data/boring/1979...   

  betrouwbaarheid_interpretatie         x         y  diepte_laag_van  \
0                          goed  154869.0  217060.0              0.0   
1                          goed  154869.0  217060.0              1.0   
2                          goed  154869.0  217060.0              8.0   
3                          goed  144134.0  226051.0              0.0   
4                          goed  144134.0  226051.0              7.5   

   diepte_laag_tot aquifer  
0              1.0    0140  
1              8.0    0233  
2             20.0    0241  
3              7.5    0110  
4             11.0    0133  

Visualize results

Using Folium, we can display the results of our search on a map.


In [16]:
# import the necessary modules (not included in the requirements of pydov!)
import folium
from folium.plugins import MarkerCluster
from pyproj import Transformer

In [17]:
# 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

df['lon'], df['lat'] = zip(*map(convert_latlon, df['x'], df['y'])) 
# convert to list
loclist = df[['lat', 'lon']].values.tolist()

In [18]:
# initialize the Folium map on the centre of the selected locations, play with the zoom until ok# initia 
fmap = folium.Map(location=[df['lat'].mean(), df['lon'].mean()], zoom_start=12)
marker_cluster = MarkerCluster().add_to(fmap)
for loc in range(0, len(loclist)):
    folium.Marker(loclist[loc], popup=df['aquifer'][loc]).add_to(marker_cluster)
fmap


Out[18]:
Make this Notebook Trusted to load map: File -> Trust Notebook