Example of DOV search methods for quartaire stratigrafie

Use cases:

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

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

In [2]:
# check pydov path
import pydov

Get information about code base


In [4]:
from pydov.search.interpretaties import QuartairStratigrafieSearch
# information about the QuartairStratigrafie type (In Dutch):
ip_quart = QuartairStratigrafieSearch()
ip_quart.get_description()


Out[4]:
'De quartaire afzettingen in Vlaanderen, de jongste afzettingen, zijn lateraal en verticaal heterogeen en varieren erg in dikte. De afzettingen zijn vooral onder continentale omstandigheden tot stand gekomen (rivier-, duinafzettingen). Eigenlijk zijn het pakketten die zelden meer dan 30 meter en soms zelfs minder dan 1 meter dik zijn. Omwille van deze grote eigenheid en de grote mate van detail van de beschrijvingen, werd hiervoor een eigen stratigrafische codering uitgewerkt voor Vlaanderen.'

In [5]:
# information about the available fields for a QuartairStratigrafie object
fields = ip_quart.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
lid1
relatie_lid1_lid2
lid2

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


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

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)

Try-out of use cases

Select interpretations in a bbox


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

# Get all interpretations in a bounding box (llx, lly, ulx, uly)
# the pkey_boring link is not available below, but is in the df
df = ip_quart.search(location=Within(Box(132815, 191700, 133815, 192700)))
df.head()


[000/003] ccc
Out[8]:
pkey_interpretatie pkey_boring betrouwbaarheid_interpretatie x y diepte_laag_van diepte_laag_tot lid1 relatie_lid1_lid2 lid2
0 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1974... onbekend 132975.0 191969.0 0.0 4.5 K T K
1 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1974... onbekend 132975.0 191969.0 4.5 7.5 F T F
2 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1974... onbekend 132975.0 191969.0 7.5 8.0 Rf T Rf
3 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1974... onbekend 132949.0 192068.0 0.0 4.5 K T K
4 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1974... onbekend 132949.0 192068.0 4.5 9.5 F T F

Select interpretations in a bbox with selected properties


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


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

In [12]:
from owslib.fes import PropertyIsGreaterThanOrEqualTo

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


In [15]:
# Get deep boreholes in a bounding box 
from owslib.fes import PropertyIsLike
# the propertyname can be any of the fields of the 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 = PropertyIsLike(
        propertyname='betrouwbaarheid_interpretatie', literal='onbekend')
df = ip_quart.search(location=Within(Box(132815, 191700, 133815, 192700)),
                     query=query
                    )
df.head()


[000/003] ccc
Out[15]:
pkey_interpretatie pkey_boring betrouwbaarheid_interpretatie x y diepte_laag_van diepte_laag_tot lid1 relatie_lid1_lid2 lid2
0 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1974... onbekend 132975.0 191969.0 0.0 4.5 K T K
1 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1974... onbekend 132975.0 191969.0 4.5 7.5 F T F
2 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1974... onbekend 132975.0 191969.0 7.5 8.0 Rf T Rf
3 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1974... onbekend 132949.0 192068.0 0.0 4.5 K T K
4 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1974... onbekend 132949.0 192068.0 4.5 9.5 F T F

Select records within a distance from a point


In [18]:
from pydov.util.location import Point, WithinDistance

# Get all interpretations within a defined distance from a point
location = WithinDistance(location=Point(133000, 192000),
                          distance=1000, distance_unit='meter')
df = ip_quart.search(location=location)
df.head()


[000/015] ccccccccccccccc
Out[18]:
pkey_interpretatie pkey_boring betrouwbaarheid_interpretatie x y diepte_laag_van diepte_laag_tot lid1 relatie_lid1_lid2 lid2
0 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1943... onbekend 132089.0 191777.0 0.00 1.00 K T K
1 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1943... onbekend 132089.0 191777.0 1.00 1.50 D T D
2 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1943... onbekend 132089.0 191777.0 1.50 9.00 F T F
3 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1943... onbekend 132089.0 191777.0 9.00 12.05 Rf T Rf
4 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1943... onbekend 132089.0 191777.0 12.05 30.00 $ T $

Select interpretations in a municipality


In [19]:
from owslib.fes import PropertyIsEqualTo
query = PropertyIsEqualTo(propertyname='gemeente',
                          literal='Hamme')
df = ip_quart.search(query=query)
df.head()


[000/028] ............................
Out[19]:
pkey_interpretatie pkey_boring betrouwbaarheid_interpretatie x y diepte_laag_van diepte_laag_tot lid1 relatie_lid1_lid2 lid2
0 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1930... onbekend 135738.8 193299.5 0.0 13.40 ô T F
1 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1930... onbekend 135738.8 193299.5 13.4 35.00 $ T $
2 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1935... onbekend 133638.2 197756.1 0.0 3.50 D T D
3 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1935... onbekend 133638.2 197756.1 3.5 16.50 F T F
4 https://www.dov.vlaanderen.be/data/interpretat... https://www.dov.vlaanderen.be/data/boring/1935... onbekend 133638.2 197756.1 16.5 54.95 $ T $

Visualize results

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


In [22]:
# import the necessary modules (not included in the requirements of pydov!)
import folium
from folium.plugins import MarkerCluster
from pyproj import Transformer
# for windows 10 users, we could not get it working with Microsoft Edge
# change the browser to Chrome in the Notebook config file instead

In [23]:
# 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 [24]:
# initialize the Folium map on the centre of the selected locations, play with the zoom until ok
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['lid1'][loc]).add_to(marker_cluster)
fmap


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

In [ ]: