Borehole Research (BHR)
The BRO database contains several types of borehole research:
Geotechnical Borehole Research
Pedological Borehole Research
Geological Borehole Research
Geotechnical Borehole Research (BHR-GT)
Geotechnical Borehole Research helps determine the bearing capacity of the subsurface (onshore and offshore). It may include drill-sample descriptions and laboratory analyses.
import os
import matplotlib.pyplot as plt
import brodata
download_dir = "download"
if not os.path.isdir(download_dir):
os.makedirs(download_dir)
to_file = os.path.join(download_dir, "BHR000000353924.xml")
bhr_gt = brodata.bhr.GeotechnicalBoreholeResearch.from_bro_id(
"BHR000000353924", to_file=to_file
)
bhr_gt
GeotechnicalBoreholeResearch(broId='BHR000000353924', x=118550.903, y=439975.134)
There are 2 descriptive borehole logs in this Geotechnical Borehole Research. Let’s look at the data from the first.
bhr_gt.descriptiveBoreholeLog[0]["layer"]
| upperBoundary | upperBoundaryDetermination | lowerBoundary | lowerBoundaryDetermination | anthropogenic | geotechnicalSoilName | tertiaryConstituent | colour | dispersedInhomogeneity | organicMatterContentClass | sandMedianClass | sizeFraction | angularity | sphericity | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.0 | afgeleid | 1.0 | afgeleid | nee | sterkGrindigZand | [puin] | lichtbruin | [geen] | nietOrganisch | fijn | zand | subhoekig | bol |
| 1 | 1.0 | afgeleid | 1.2 | afgeleid | nee | sterkGrindigZand | [puin] | lichtbruin | [geen] | nietOrganisch | fijn | zand | subhoekig | bol |
| 2 | 1.2 | afgeleid | 2.2 | afgeleid | nee | klei | [puin] | standaardGrijs | [geen] | nietOrganisch | NaN | NaN | NaN | NaN |
| 3 | 2.2 | afgeleid | 3.2 | afgeleid | nee | klei | [puin] | standaardGrijs | [geen] | nietOrganisch | NaN | NaN | NaN | NaN |
| 4 | 3.2 | afgeleid | 3.5 | afgeleid | nee | klei | [puin] | donkergrijs | [geen] | nietOrganisch | NaN | NaN | NaN | NaN |
| 5 | 3.5 | afgeleid | 4.0 | afgeleid | nee | klei | [puin] | standaardGrijs | [geen] | nietOrganisch | NaN | NaN | NaN | NaN |
| 6 | 4.0 | afgeleid | 5.0 | afgeleid | nee | veen | [geen] | donkerbruin | [geen] | NaN | NaN | NaN | NaN | NaN |
| 7 | 5.0 | afgeleid | 5.2 | afgeleid | nee | veen | [geen] | donkerbruin | [geen] | NaN | NaN | NaN | NaN | NaN |
| 8 | 5.2 | afgeleid | 6.2 | afgeleid | nee | zwakZandigeKlei | [geen] | standaardGrijs | [geen] | zwakOrganisch | NaN | NaN | NaN | NaN |
| 9 | 6.2 | afgeleid | 6.5 | afgeleid | nee | zwakZandigeKlei | [geen] | standaardGrijs | [geen] | zwakOrganisch | NaN | NaN | NaN | NaN |
| 10 | 6.5 | afgeleid | 7.2 | afgeleid | nee | zwakZandigeKlei | [geen] | standaardGrijs | [geen] | zwakOrganisch | NaN | NaN | NaN | NaN |
| 11 | 7.2 | afgeleid | 8.2 | afgeleid | nee | zand | [geen] | standaardGrijs | [geen] | nietOrganisch | fijn | zand | subhoekig | bol |
| 12 | 8.2 | afgeleid | 9.2 | afgeleid | nee | zand | [geen] | standaardGrijs | [geen] | nietOrganisch | fijn | zand | subhoekig | bol |
| 13 | 9.2 | afgeleid | 10.0 | afgeleid | nee | zand | [geen] | standaardGrijs | [geen] | nietOrganisch | fijn | zand | subhoekig | bol |
Plot the descriptive borehole logs. Some soil types are not yet supported, and mixed soil types (e.g. kleiigVeen) may not render as intended.
f, ax = plt.subplots()
xticks = []
xticklabels = []
for x, bl in enumerate(bhr_gt.descriptiveBoreholeLog):
brodata.plot.bro_lithology(bl["layer"], x=x, z=bhr_gt.offset, ax=ax)
xticks.append(x)
xticklabels.append(bl["descriptionQuality"])
ax.set_xlim(-0.5, x + 0.5)
ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels)
ax.set_ylabel("z (m t.o.v. NAP)");
No color defined for hoofdgrondsoort kleiigVeen
No color defined for hoofdgrondsoort siltigZand
The function brodata.plot.bro_lithology_advanced supports mixed soil types.
f, ax = plt.subplots()
xticks = []
xticklabels = []
for x, bl in enumerate(bhr_gt.descriptiveBoreholeLog):
df = bl["layer"]
brodata.plot.bro_lithology_advanced(df, x=x, width=0.2, z=bhr_gt.offset, ax=ax)
xticks.append(x)
xticklabels.append(bl["descriptionQuality"])
ax.set_xlim(-0.5, x + 0.5)
ax.set_ylim(bhr_gt.offset - bhr_gt.boredInterval['endDepth'].max(), bhr_gt.offset)
ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels)
ax.set_ylabel("z (m t.o.v. NAP)");
We can also call the BRO-service to generate the figure for us. This sends a request to the BRO-webservice, and returns a graphical representation of the drilling.
brodata.bhr.bhrgt_graph(to_file, language="en")
Show the rest of the contents of the Geotechnical Borehole Research.
bhr_gt.boredInterval
| beginDepth | endDepth | boringTechnique | boredDiameter | |
|---|---|---|---|---|
| 0 | 0.0 | 10.0 | mechanischPulsen | 133 |
bhr_gt.completedInterval
| beginDepth | endDepth | permanentCasingPresent | backfillMaterial | backfillMaterialCertified | |
|---|---|---|---|---|---|
| 0 | 0.0 | 10.0 | nee | kleiZwelklasse2 | nee |
bhr_gt.sampledInterval
| beginDepth | endDepth | preTreatment | samplingMethod | samplingQuality | orientatedSampled | samplerType | sampleContainerDiameter | sampleContainerLength | cuttingShoeInsideDiameter | stockingUsed | rightAngledCuttingShoe | taperAngle | cuttingShoeOutsideDiameter | lubricationFluidUsed | coreCatcherPresent | pistonPresent | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.0 | 10.0 | geen | opDiepteLosroeren | klasseE | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 1 | 1.2 | 1.6 | geen | opDiepteUitsteken | klasseB | nee | steekbus | 67 | 0.44 | 67 | nee | nee | 30 | 69 | nee | nee | ja |
| 2 | 2.2 | 2.6 | geen | opDiepteUitsteken | klasseB | nee | steekbus | 67 | 0.44 | 67 | nee | nee | 30 | 69 | nee | nee | ja |
| 3 | 3.2 | 3.6 | geen | opDiepteUitsteken | klasseB | nee | steekbus | 67 | 0.44 | 67 | nee | nee | 30 | 69 | nee | nee | ja |
| 4 | 4.2 | 4.6 | geen | opDiepteUitsteken | klasseB | nee | steekbus | 67 | 0.44 | 67 | nee | nee | 30 | 69 | nee | nee | ja |
| 5 | 5.2 | 5.6 | geen | opDiepteUitsteken | klasseB | nee | steekbus | 67 | 0.44 | 67 | nee | nee | 30 | 69 | nee | nee | ja |
| 6 | 6.2 | 6.6 | geen | opDiepteUitsteken | klasseB | nee | steekbus | 67 | 0.44 | 67 | nee | nee | 30 | 69 | nee | nee | ja |
| 7 | 7.2 | 7.6 | geen | opDiepteUitsteken | klasseB | nee | steekbus | 67 | 0.44 | 67 | nee | nee | 30 | 69 | nee | nee | ja |
| 8 | 8.2 | 8.6 | geen | opDiepteUitsteken | klasseB | nee | steekbus | 67 | 0.44 | 67 | nee | nee | 30 | 69 | nee | nee | ja |
| 9 | 9.2 | 9.6 | geen | opDiepteUitsteken | klasseB | nee | steekbus | 67 | 0.44 | 67 | nee | nee | 30 | 69 | nee | nee | ja |
bhr_gt.to_dict()
bhr_data = bhr_gt.to_dict()
bhr_data.pop("boredInterval")
bhr_data.pop("completedInterval")
bhr_data.pop("descriptiveBoreholeLog")
bhr_data.pop("sampledInterval")
bhr_data
{'boreholeCompleted': 'ja',
'boringEndDate': Timestamp('2021-12-07 00:00:00'),
'boringProcedure': 'SIKB2101vanafV3.3',
'boringStartDate': Timestamp('2021-12-07 00:00:00'),
'broId': 'BHR000000353924',
'coordinateTransformation': 'RDNAPTRANS2018',
'corrected': 'nee',
'date': '2022-03-25',
'deliveredLocation': <POINT (118550.903 439975.134)>,
'deliveryAccountableParty': '30276831',
'deliveryContext': 'publiekeTaak',
'deregistered': 'nee',
'descriptionProcedure': 'ISO14688d1v2019c2020',
'descriptionReportDate': Timestamp('2022-01-17 00:00:00'),
'discipline': 'geotechniek',
'eventName': 'volledigGerapporteerd',
'finalDepthBoring': 10.0,
'finalDepthSampling': 10.0,
'groundwaterLevel': 1.2,
'horizontalPositioningDate': Timestamp('2021-10-18 00:00:00'),
'horizontalPositioningMethod': 'RTKGPS0tot2cm',
'id': 'BRO_0003',
'localVerticalReferencePoint': 'maaiveld',
'objectRegistrationTime': '2022-04-08T11:22:45+02:00',
'offset': 1.008,
'preparation': 'geen',
'qualityRegime': 'IMBRO',
'registrationCompletionTime': '2022-04-08T11:22:45+02:00',
'registrationStatus': 'voltooid',
'reregistered': 'nee',
'researchReportDate': Timestamp('2022-03-25 00:00:00'),
'rockReached': 'nee',
'samplingProcedure': 'ISO22475d1v2019',
'siteCharacteristicDetermined': 'ja',
'soilUse': 'geenBodemgebruik',
'standardizedLocation': <POINT (4.857 51.947)>,
'stopCriterion': 'einddoel',
'subsurfaceContaminated': 'nee',
'surveyProcedure': 'EN1997d2v2007',
'surveyPurpose': 'waterkering',
'trajectoryExcavated': 'nee',
'underReview': 'nee',
'verticalDatum': 'NAP',
'verticalPositioningDate': Timestamp('2021-10-18 00:00:00'),
'verticalPositioningMethod': 'RTKGPS0tot4cm'}
Pedological Borehole Research (BHR-P)
Pedological Borehole Research is important for understanding the composition and structure of the soil. It describes the soil structure of the shallowest part of the soil and subsurface based on a borehole. This research may consist of a soil science borehole description and a borehole analysis.
bhr_p = brodata.bhr.PedologicalBoreholeResearch.from_bro_id("BHR000000175723")
df = bhr_p.boreholeSampleDescription
df
| upperBoundary | lowerBoundary | anthropogenic | numberOfLayerComponents | horizonCode | standardSoilName | soilTypeLoamBased | pedologicalSoilName | organicMatterClass | carbonateClass | ripingClass | containsGravel | containsShellMatter | organicMatterContent | clayContent | peatType | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.0 | 0.4 | nee | 1 | Aa | sterkSiltigeKlei | nee | lichteKlei | matigHumeus | kalkloos | geheelGerijpt | nee | nee | 4.0 | 33.0 | NaN |
| 1 | 0.4 | 1.0 | nee | 1 | Cg | matigSiltigeKlei | nee | matigZwareKlei | zwakHumeus | kalkloos | geheelGerijpt | nee | nee | NaN | 40.0 | NaN |
| 2 | 1.0 | 1.3 | nee | 1 | Cu | mineraalarmVeen | nee | veen | NaN | kalkloos | NaN | nee | nee | 60.0 | NaN | bosveen |
| 3 | 1.3 | 1.7 | nee | 1 | Cr | mineraalarmVeen | nee | veen | NaN | kalkloos | NaN | nee | nee | 60.0 | NaN | bosveen |
f, ax = plt.subplots()
z = bhr_p.offset
brodata.plot.bro_lithology_advanced(df, z=z, ax=ax, soil_name_column="standardSoilName")
ax.set_ylim(bhr_p.offset - bhr_p.endDepth, bhr_p.offset)
ax.set_ylabel("z (m t.o.v. NAP)");
Geological Borehole Research (BHR-G)
Geological Borehole Research almost always focus on mapping or modeling. They consist of a geological core description and a geological core analysis.
bhr_g = brodata.bhr.GeologicalBoreholeResearch.from_bro_id("BHR000000429481")
df = bhr_g.descriptiveBoreholeLog[0]['layer']
df
| upperBoundary | upperBoundaryDetermination | lowerBoundary | lowerBoundaryDetermination | anthropogenic | rooted | soilNameNEN5104 | gravelContentClass | organicMatterContentClassNEN5104 | carbonateContentClass | colour | sandMedianClass | sandSorting | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.0 | waargenomen | 1.2 | onbekend | onbekend | onbekend | zwakSiltigZand | onbekend | onbekend | onbekend | grijs | matigFijnNEN5104 | onbekend |
| 1 | 1.2 | onbekend | 1.5 | onbekend | onbekend | ja | zwakZandigeKlei | onbekend | onbekend | onbekend | donkergrijs | NaN | NaN |
| 2 | 1.5 | onbekend | 1.9 | onbekend | onbekend | onbekend | grondNietGespecificeerd | onbekend | onbekend | onbekend | onbekend | NaN | NaN |
| 3 | 1.9 | onbekend | 2.8 | onbekend | onbekend | onbekend | zwakSiltigeKlei | onbekend | onbekend | onbekend | grijsBruin | NaN | NaN |
| 4 | 2.8 | onbekend | 3.0 | onbekend | onbekend | onbekend | zwakSiltigeKlei | onbekend | onbekend | onbekend | grijs | NaN | NaN |
| 5 | 3.0 | onbekend | 3.4 | onbekend | onbekend | onbekend | grondNietGespecificeerd | onbekend | onbekend | onbekend | onbekend | NaN | NaN |
| 6 | 3.4 | onbekend | 4.5 | onbekend | onbekend | onbekend | zwakSiltigeKlei | onbekend | onbekend | onbekend | grijs | NaN | NaN |
| 7 | 4.5 | onbekend | 4.9 | onbekend | onbekend | onbekend | grondNietGespecificeerd | onbekend | onbekend | onbekend | onbekend | NaN | NaN |
| 8 | 4.9 | onbekend | 5.5 | onbekend | onbekend | onbekend | matigSiltigeKlei | onbekend | onbekend | onbekend | grijs | NaN | NaN |
| 9 | 5.5 | onbekend | 5.9 | onbekend | onbekend | onbekend | grondNietGespecificeerd | onbekend | onbekend | onbekend | onbekend | NaN | NaN |
| 10 | 5.9 | onbekend | 6.0 | voorbepaald | onbekend | onbekend | matigSiltigeKlei | onbekend | onbekend | onbekend | grijs | NaN | NaN |
f, ax = plt.subplots()
z = bhr_g.offset
brodata.plot.bro_lithology_advanced(df, soil_name_column="soilNameNEN5104", ax=ax, z=z)
ax.set_ylim(z - df["lowerBoundary"].max(), z)
ax.set_ylabel("z (m t.o.v. NAP)");