@bedrock-engineer/bro-xml-parser 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +21 -12
  2. package/dist/browser.d.ts +15 -5
  3. package/dist/browser.d.ts.map +1 -1
  4. package/dist/browser.js +7 -5
  5. package/dist/browser.js.map +1 -1
  6. package/dist/core/columns.d.ts +80 -0
  7. package/dist/core/columns.d.ts.map +1 -0
  8. package/dist/core/columns.js +100 -0
  9. package/dist/core/columns.js.map +1 -0
  10. package/dist/core/producer.d.ts +216 -0
  11. package/dist/core/producer.d.ts.map +1 -0
  12. package/dist/core/producer.js +85 -0
  13. package/dist/core/producer.js.map +1 -0
  14. package/dist/core/schema-parser.d.ts +41 -17
  15. package/dist/core/schema-parser.d.ts.map +1 -1
  16. package/dist/core/schema-parser.js +178 -73
  17. package/dist/core/schema-parser.js.map +1 -1
  18. package/dist/core/version-detector.d.ts +3 -1
  19. package/dist/core/version-detector.d.ts.map +1 -1
  20. package/dist/core/version-detector.js +37 -0
  21. package/dist/core/version-detector.js.map +1 -1
  22. package/dist/decoders/constants.d.ts +2 -0
  23. package/dist/decoders/constants.d.ts.map +1 -0
  24. package/dist/decoders/constants.js +2 -0
  25. package/dist/decoders/constants.js.map +1 -0
  26. package/dist/decoders/type-decoders.d.ts +38 -0
  27. package/dist/decoders/type-decoders.d.ts.map +1 -0
  28. package/dist/decoders/type-decoders.js +134 -0
  29. package/dist/decoders/type-decoders.js.map +1 -0
  30. package/dist/namespaces.d.ts.map +1 -1
  31. package/dist/namespaces.js +16 -0
  32. package/dist/namespaces.js.map +1 -1
  33. package/dist/node.d.ts +15 -5
  34. package/dist/node.d.ts.map +1 -1
  35. package/dist/node.js +7 -5
  36. package/dist/node.js.map +1 -1
  37. package/dist/parser.d.ts +69 -19
  38. package/dist/parser.d.ts.map +1 -1
  39. package/dist/parser.js +103 -29
  40. package/dist/parser.js.map +1 -1
  41. package/dist/producers.d.ts +36 -0
  42. package/dist/producers.d.ts.map +1 -0
  43. package/dist/producers.js +35 -0
  44. package/dist/producers.js.map +1 -0
  45. package/dist/resolvers/gld-resolvers.d.ts +30 -0
  46. package/dist/resolvers/gld-resolvers.d.ts.map +1 -0
  47. package/dist/resolvers/gld-resolvers.js +76 -0
  48. package/dist/resolvers/gld-resolvers.js.map +1 -0
  49. package/dist/resolvers/gmw-resolvers.d.ts +37 -0
  50. package/dist/resolvers/gmw-resolvers.d.ts.map +1 -0
  51. package/dist/resolvers/gmw-resolvers.js +101 -0
  52. package/dist/resolvers/gmw-resolvers.js.map +1 -0
  53. package/dist/resolvers.d.ts +2 -0
  54. package/dist/resolvers.d.ts.map +1 -1
  55. package/dist/resolvers.js +4 -0
  56. package/dist/resolvers.js.map +1 -1
  57. package/dist/schema-presets.d.ts +67 -16
  58. package/dist/schema-presets.d.ts.map +1 -1
  59. package/dist/schema-presets.js +51 -114
  60. package/dist/schema-presets.js.map +1 -1
  61. package/dist/schemas/bhrg-schema.d.ts +528 -9
  62. package/dist/schemas/bhrg-schema.d.ts.map +1 -1
  63. package/dist/schemas/bhrg-schema.js +330 -189
  64. package/dist/schemas/bhrg-schema.js.map +1 -1
  65. package/dist/schemas/bhrgt-analysis.d.ts +1057 -0
  66. package/dist/schemas/bhrgt-analysis.d.ts.map +1 -0
  67. package/dist/schemas/bhrgt-analysis.js +454 -0
  68. package/dist/schemas/bhrgt-analysis.js.map +1 -0
  69. package/dist/schemas/bore-schema.d.ts +773 -9
  70. package/dist/schemas/bore-schema.d.ts.map +1 -1
  71. package/dist/schemas/bore-schema.js +344 -292
  72. package/dist/schemas/bore-schema.js.map +1 -1
  73. package/dist/schemas/common-fields.d.ts +50 -5
  74. package/dist/schemas/common-fields.d.ts.map +1 -1
  75. package/dist/schemas/common-fields.js +70 -19
  76. package/dist/schemas/common-fields.js.map +1 -1
  77. package/dist/schemas/cpt-schema.d.ts +126 -9
  78. package/dist/schemas/cpt-schema.d.ts.map +1 -1
  79. package/dist/schemas/cpt-schema.js +182 -285
  80. package/dist/schemas/cpt-schema.js.map +1 -1
  81. package/dist/schemas/generated/gld.generated.d.ts +9 -0
  82. package/dist/schemas/generated/gld.generated.d.ts.map +1 -0
  83. package/dist/schemas/generated/gld.generated.js +19 -0
  84. package/dist/schemas/generated/gld.generated.js.map +1 -0
  85. package/dist/schemas/gld-schema.d.ts +92 -0
  86. package/dist/schemas/gld-schema.d.ts.map +1 -0
  87. package/dist/schemas/gld-schema.js +88 -0
  88. package/dist/schemas/gld-schema.js.map +1 -0
  89. package/dist/schemas/gmw-schema.d.ts +180 -0
  90. package/dist/schemas/gmw-schema.d.ts.map +1 -0
  91. package/dist/schemas/gmw-schema.js +131 -0
  92. package/dist/schemas/gmw-schema.js.map +1 -0
  93. package/dist/types/index.d.ts +51 -1421
  94. package/dist/types/index.d.ts.map +1 -1
  95. package/dist/types/index.js.map +1 -1
  96. package/package.json +1 -1
@@ -1,6 +1,12 @@
1
1
  /**
2
2
  * Type definitions for BRO/XML parser
3
3
  */
4
+ import type { Produced } from "../core/producer.js";
5
+ import type { CPT_PRODUCER } from "../schemas/cpt-schema.js";
6
+ import type { BORE_PRODUCER } from "../schemas/bore-schema.js";
7
+ import type { BHRG_PRODUCER } from "../schemas/bhrg-schema.js";
8
+ import type { GMW_PRODUCER } from "../schemas/gmw-schema.js";
9
+ import type { GLD_PRODUCER } from "../schemas/gld-schema.js";
4
10
  /**
5
11
  * Namespace mapping (prefix -> URI)
6
12
  */
@@ -21,9 +27,9 @@ export interface ParseMeta {
21
27
  */
22
28
  schemaNamespace: string;
23
29
  /**
24
- * Data type detected (CPT, BHR-GT, BHR-G)
30
+ * Data type detected (CPT, BHR-GT, BHR-G, GMW, GLD)
25
31
  */
26
- dataType: "CPT" | "BHR-GT" | "BHR-G";
32
+ dataType: "CPT" | "BHR-GT" | "BHR-G" | "GMW" | "GLD";
27
33
  /**
28
34
  * Warnings encountered during parsing
29
35
  *
@@ -41,32 +47,6 @@ export interface XMLAdapter {
41
47
  evaluateXPath(doc: Document | Node, query: string, namespaceResolver: (prefix: string | null) => string | null): Node | null;
42
48
  evaluateXPathAll(doc: Document | Node, query: string, namespaceResolver: (prefix: string | null) => string | null): Array<Node>;
43
49
  }
44
- /**
45
- * Context passed to resolver functions
46
- */
47
- export interface ResolverContext {
48
- node: Node;
49
- element: Node;
50
- namespaces: Namespaces;
51
- adapter: XMLAdapter;
52
- }
53
- /**
54
- * Resolver function type
55
- */
56
- export type ResolverFunction = (value: string | null, context: ResolverContext) => unknown;
57
- /**
58
- * Schema field definition
59
- */
60
- export interface SchemaField {
61
- xpath: string;
62
- resolver?: ResolverFunction;
63
- attribute?: string;
64
- required?: boolean;
65
- }
66
- /**
67
- * Schema definition (field name -> field config)
68
- */
69
- export type Schema = Record<string, SchemaField>;
70
50
  /**
71
51
  * BRO quality regime
72
52
  *
@@ -82,19 +62,9 @@ export interface Location {
82
62
  y: number;
83
63
  epsg: string;
84
64
  }
85
- /**
86
- * Layer of material removed before CPT was performed (e.g. asphalt, gravel fill)
87
- *
88
- * Found in additionalInvestigation. Directly affects depth interpretation.
89
- */
90
- export interface RemovedLayer {
91
- sequenceNumber: number;
92
- upperBoundary: number;
93
- lowerBoundary: number;
94
- description: string | null;
95
- }
96
65
  /**
97
66
  * CPT measurement row (dynamic fields based on parameters)
67
+ * @internal
98
68
  */
99
69
  export interface CPTMeasurement {
100
70
  penetrationLength: number;
@@ -125,6 +95,7 @@ export interface CPTMeasurement {
125
95
  }
126
96
  /**
127
97
  * Single measurement row in a dissipation test (pore pressure decay over time)
98
+ * @internal
128
99
  */
129
100
  export interface DissipationMeasurement {
130
101
  elapsedTime: number;
@@ -134,1401 +105,38 @@ export interface DissipationMeasurement {
134
105
  porePressureU3: number | null;
135
106
  }
136
107
  /**
137
- * Dissipation test performed at a specific depth
108
+ * Complete CPT data (metadata + measurements).
138
109
  *
139
- * During a CPT, the cone can be paused at a given depth to measure
140
- * pore pressure decay over time. A CPT can contain multiple dissipation tests.
110
+ * Inferred from `CPT_PRODUCER`; `meta` (parse metadata) and the optional
111
+ * user-set `alias` are the only fields not produced from the XML.
141
112
  */
142
- export interface DissipationTest {
143
- penetrationLength: number;
144
- phenomenonTime: string | null;
145
- measurements: Array<DissipationMeasurement>;
146
- }
147
- /**
148
- * Common `brocom:RegistrationObject` fields shared by every BRO registration
149
- * type (CPT, BHR-GT, BHR-G, ...).
150
- *
151
- * Mirrors how the XSDs model these: each registration object extends
152
- * `brocom:RegistrationObject` via complexContent. Domain data interfaces extend
153
- * this so the shared surface is declared once and stays consistent. The runtime
154
- * counterpart is `COMMON_REGISTRATION_FIELDS` in schemas/common-fields.ts.
155
- */
156
- export interface BRORegistrationObject {
157
- broId: string | null;
158
- /**
159
- * BRO quality regime
160
- *
161
- * - IMBRO: Strict regime (all mandatory fields required)
162
- * - IMBRO/A: Relaxed regime for historical data (allows missing fields)
163
- */
164
- qualityRegime: QualityRegime | null;
165
- /** Party responsible for delivering the data to the BRO (bronhouder, KvK number or name) */
166
- deliveryAccountableParty: string | null;
167
- /** Object identifier assigned by the accountable party (their own reference) */
168
- objectIdAccountableParty: string | null;
169
- /** KvK number of the party responsible for the delivery */
170
- deliveryResponsibleParty: string | null;
171
- /** BRO registration history */
172
- registrationHistory: RegistrationHistory | null;
173
- }
174
- /**
175
- * Complete CPT data (metadata + measurements)
176
- */
177
- export interface CPTData extends BRORegistrationObject {
178
- /**
179
- * Metadata about the parsed document (schema version, warnings)
180
- */
113
+ export type CPTData = {
181
114
  meta: ParseMeta;
182
- /**
183
- * User-defined identifier (not parsed from XML)
184
- *
185
- * Useful for tracking data that doesn't have a broId yet,
186
- * such as during data collection or before BRO registration.
187
- *
188
- * @example
189
- * ```typescript
190
- * const cpt = parser.parseCPT(xmlString);
191
- * cpt.alias = "Site A - Test 1";
192
- * ```
193
- */
194
115
  alias?: string;
195
- /** KvK number of the operator that carried out the research */
196
- researchOperator: string | null;
197
- researchReportDate: string | null;
198
- /** When the cone penetration test was physically performed in the field (om:phenomenonTime) */
199
- conePenetrationTestPhenomenonTime: string | null;
200
- /** When the cone penetration test result was produced (om:resultTime) */
201
- conePenetrationTestResultTime: string | null;
202
- deliveredLocation: Location | null;
203
- standardizedLocation: Location | null;
204
- /** Coordinate transformation applied to the standardized location (e.g. "RDNAPTRANS2018") */
205
- coordinateTransformation: string | null;
206
- /** Date horizontal position was determined */
207
- horizontalPositioningDate: string | null;
208
- /** Method used to determine horizontal position (e.g., "onbekend", "GNSS") */
209
- horizontalPositioningMethod: string | null;
210
- /** KvK number of the operator that determined the horizontal position */
211
- horizontalPositioningOperator: string | null;
212
- deliveredVerticalPositionOffset: number | null;
213
- deliveredVerticalPositionDatum: string | null;
214
- deliveredVerticalPositionReferencePoint: string | null;
215
- /** Water depth at the CPT location (m), when the survey was performed over water */
216
- waterDepth: number | null;
217
- /** Date vertical position was determined */
218
- verticalPositioningDate: string | null;
219
- /** Method used to determine vertical position (e.g., "onbekend", "waterpassingKlasse2") */
220
- verticalPositioningMethod: string | null;
221
- /** KvK number of the operator that determined the vertical position */
222
- verticalPositioningOperator: string | null;
223
- /** Delivery context (e.g., "publiekeTaak", "archiefoverdracht") */
224
- deliveryContext: string | null;
225
- /** Survey purpose (e.g., "waterkering", "onbekend") */
226
- surveyPurpose: string | null;
227
- /** Whether additional investigation was performed alongside the CPT */
228
- additionalInvestigationPerformed: boolean | null;
229
- cptStandard: string | null;
230
- /** CPT method used (e.g., "elektrisch", "mechanisch") */
231
- cptMethod: string | null;
232
- /** Stop criterion for the test */
233
- stopCriterion: string | null;
234
- /** Azimuth orientation of the sensor (degrees from north) */
235
- sensorAzimuth: number | null;
236
- dissipationtestPerformed: boolean | null;
237
- qualityClass: number | null;
238
- predrilledDepth: number | null;
239
- finalDepth: number | null;
240
- groundwaterLevel: number | null;
241
- /** Date of additional investigation (e.g. groundwater level measurement) */
242
- investigationDate: string | null;
243
- /** Site conditions at time of investigation */
244
- conditions: string | null;
245
- /** Description of surface at CPT location */
246
- surfaceDescription: string | null;
247
- /** Layers removed before CPT (e.g. asphalt, gravel fill) - affects depth interpretation */
248
- removedLayers: Array<RemovedLayer>;
249
- /** Date of final processing */
250
- finalProcessingDate: string | null;
251
- /** Whether signal processing was performed */
252
- signalProcessingPerformed: boolean | null;
253
- /** Whether interruption processing was performed */
254
- interruptionProcessingPerformed: boolean | null;
255
- /** Whether expert correction was performed */
256
- expertCorrectionPerformed: boolean | null;
257
- cptDescription: string | null;
258
- cptType: string | null;
259
- coneSurfaceArea: number | null;
260
- coneDiameter: number | null;
261
- coneSurfaceQuotient: number | null;
262
- coneToFrictionSleeveDistance: number | null;
263
- coneToFrictionSleeveSurfaceArea: number | null;
264
- coneToFrictionSleeveSurfaceQuotient: number | null;
265
- zlmConeResistanceBefore: number | null;
266
- zlmConeResistanceAfter: number | null;
267
- zlmInclinationEwBefore: number | null;
268
- zlmInclinationEwAfter: number | null;
269
- zlmInclinationNsBefore: number | null;
270
- zlmInclinationNsAfter: number | null;
271
- zlmInclinationResultantBefore: number | null;
272
- zlmInclinationResultantAfter: number | null;
273
- zlmLocalFrictionBefore: number | null;
274
- zlmLocalFrictionAfter: number | null;
275
- zlmPorePressureU1Before: number | null;
276
- zlmPorePressureU2Before: number | null;
277
- zlmPorePressureU3Before: number | null;
278
- zlmPorePressureU1After: number | null;
279
- zlmPorePressureU2After: number | null;
280
- zlmPorePressureU3After: number | null;
281
- /** Electrical conductivity before test (mS/m) - zero-load calibration */
282
- zlmElectricalConductivityBefore: number | null;
283
- /** Electrical conductivity after test (mS/m) - zero-load calibration */
284
- zlmElectricalConductivityAfter: number | null;
285
- data: Array<CPTMeasurement>;
286
- dissipationTests: Array<DissipationTest>;
287
- }
288
- /**
289
- * Grain shape properties for sand/gravel fractions
290
- */
291
- export interface Grainshape {
292
- /** Size fraction this shape applies to (e.g., "zand", "grind") */
293
- sizeFraction: string | null;
294
- /** Angularity of grains (e.g., "hoekig", "subhoekig", "afgerond") */
295
- angularity: string | null;
296
- /** Sphericity of grains (e.g., "bol", "plat", "langwerpig") */
297
- sphericity: string | null;
298
- /** Roughness of grains (e.g., "ruw", "glad") */
299
- roughness: string | null;
300
- }
116
+ } & Produced<typeof CPT_PRODUCER>;
301
117
  /**
302
- * Weathering degree of a rock layer (three-axis classification)
303
- */
304
- export interface RockWeatheringDegree {
305
- /** Degree of discolouration */
306
- discolouration: string | null;
307
- /** Degree of disintegration */
308
- disintegration: string | null;
309
- /** Degree of decomposition */
310
- decomposition: string | null;
311
- }
312
- /**
313
- * Rock description for a layer (BHR-GT `rock` element).
118
+ * Complete Bore data (metadata + layers).
314
119
  *
315
- * A layer describes either soil (flattened onto BHRGTLayer) or rock (this
316
- * nested object). Yes/no fields keep their raw code (e.g. "ja", "nee",
317
- * "nietWaargenomen") to preserve archive nuance.
318
- */
319
- export interface RockDescription {
320
- rockType: string | null;
321
- cementType: string | null;
322
- colour: string | null;
323
- /** Tertiary rock constituents (1 or more) */
324
- tertiaryRockConstituent: Array<string>;
325
- interbedding: string | null;
326
- /** Dispersed inhomogeneities (0-2) */
327
- dispersedInhomogeneity: Array<string>;
328
- carbonateContentClass: string | null;
329
- crossBedding: string | null;
330
- gradedBedding: string | null;
331
- voidsPresent: string | null;
332
- voidDistribution: string | null;
333
- stability: string | null;
334
- strengthClass: string | null;
335
- weathered: string | null;
336
- weatheringDegree?: RockWeatheringDegree;
337
- }
338
- /**
339
- * Post-sedimentary discontinuity in the descriptive borehole log
340
- * (e.g. a fracture or fault plane crossing the described interval)
341
- */
342
- export interface PostSedimentaryDiscontinuity {
343
- beginDepth: number;
344
- endDepth: number;
345
- /** Whether the discontinuity is in rock (raw code, e.g. "ja"/"nee") */
346
- inRock: string | null;
347
- discontinuityType: string | null;
348
- compositeDiscontinuity: string | null;
349
- /** Spacing between discontinuities (m) */
350
- spacing: number | null;
351
- smooth: string | null;
352
- apertureClass: string | null;
353
- infillMaterial: string | null;
354
- }
355
- /**
356
- * BHR-GT (Borehole Research Geotechnical) layer data
120
+ * Represents BHR-GT-BMB (Boormonsterbeschrijving — visual/textural description);
121
+ * laboratory analysis (BHR-GT-BMA) is the optional `analysis` field.
357
122
  *
358
- * Contains all fields from the BRO BHR-GT schema for a single soil layer.
359
- */
360
- /**
361
- * Fields shared by every BHR-GT described layer, regardless of whether it
362
- * describes soil or rock (they live directly on the XSD `layer` element).
123
+ * Inferred from `BORE_PRODUCER`; `meta` (parse metadata) and the optional
124
+ * user-set `alias` are the only fields not produced from the XML.
363
125
  */
364
- export interface BHRGTLayerBase {
365
- upperBoundary: number;
366
- lowerBoundary: number;
367
- upperBoundaryDetermination?: string | null;
368
- lowerBoundaryDetermination?: string | null;
369
- /** Whether the layer is anthropogenic (man-made) */
370
- anthropogenic?: boolean | null;
371
- /** Whether the layer boundary is slanted */
372
- slant?: boolean | null;
373
- /** Whether the layer is bedded/stratified */
374
- bedded?: boolean | null;
375
- /** Bedding type of the layer (e.g., "dikGelamineerd") */
376
- bedding?: string | null;
377
- /** Whether the layer is a composite layer */
378
- compositeLayer?: boolean | null;
379
- /** Human activity type observed in the layer (e.g., "nietBepaald") */
380
- activityType?: string | null;
381
- /** Whether the internal structure is intact (undisturbed) */
382
- internalStructureIntact?: boolean | null;
383
- /** Special material in the layer (e.g. anthropogenic debris) */
384
- specialMaterial?: string | null;
385
- }
386
- /**
387
- * A BHR-GT layer that describes soil (the common case).
388
- * Discriminate on `material === "soil"`.
389
- */
390
- export interface BHRGTSoilLayer extends BHRGTLayerBase {
391
- material: "soil";
392
- /** Geotechnical soil name (may be "" for IMBRO/A archive data using NEN 5104) */
393
- geotechnicalSoilName: string;
394
- /** Soil name per NEN 5104 (IMBRO/A archive data; geotechnicalSoilName is often nil there) */
395
- soilNameNEN5104?: string | null;
396
- /** Gravel content classification per NEN 5104 (IMBRO/A) */
397
- gravelContentClassNEN5104?: string | null;
398
- /** Organic matter content classification per NEN 5104 (IMBRO/A) */
399
- organicMatterContentClassNEN5104?: string | null;
400
- /** Tertiary soil constituent (e.g., "schelpMateriaal", "plantenresten") */
401
- tertiaryConstituent?: string | null;
402
- /** Soil color code */
403
- color?: string;
404
- /** Dispersed inhomogeneity presence */
405
- dispersedInhomogeneity?: boolean | null;
406
- /** Organic matter content classification */
407
- organicMatterContentClass?: string | null;
408
- /** Carbonate content classification */
409
- carbonateContentClass?: string | null;
410
- /** Sand median grain size classification */
411
- sandMedianClass?: string | null;
412
- /** Gravel median grain size classification (e.g., "fijn", "middelgrof") */
413
- gravelMedianClass?: string | null;
414
- /** Depositional characteristic of the soil (e.g., "nietBepaald") */
415
- geotechnicalDepositionalCharacteristic?: string | null;
416
- /** Interbedding of other material in the soil (e.g., "kleiWeinigDikkeLaminae") */
417
- interbedding?: string | null;
418
- /** Grain shape properties (for sand/gravel) */
419
- grainshape?: Grainshape;
420
- /** Whether the soil is mixed */
421
- mixed?: boolean | null;
422
- /** Whether the soil has mottled appearance */
423
- mottled?: boolean | null;
424
- /** Consistency of fine-grained soils (e.g., "slap", "stevig", "vast") */
425
- fineSoilConsistency?: string | null;
426
- /** Consistency of organic soils */
427
- organicSoilConsistency?: string | null;
428
- /** Texture of organic soils (e.g., "vezeligGrof", "vezeligFijn") */
429
- organicSoilTexture?: string | null;
430
- /** Tensile strength of peat */
431
- peatTensileStrength?: string | null;
432
- /** Cross bedding present (raw code) */
433
- crossBedding?: string | null;
434
- /** Graded bedding present (raw code) */
435
- gradedBedding?: string | null;
436
- /** Mixing type of the soil */
437
- mixingType?: string | null;
438
- /** Fine gravel content classification */
439
- fineGravelContentClass?: string | null;
440
- /** Medium-coarse gravel content classification */
441
- mediumCoarseGravelContentClass?: string | null;
442
- /** Very coarse gravel content classification */
443
- veryCoarseGravelContentClass?: string | null;
444
- /** Sand sorting classification per NEN 5104 */
445
- sandSortingNEN5104?: string | null;
446
- /** Peat type classification */
447
- peatType?: string | null;
448
- /** Depositional age of the layer */
449
- depositionalAge?: string | null;
450
- }
451
- /**
452
- * A BHR-GT layer that describes rock.
453
- * Discriminate on `material === "rock"`.
454
- */
455
- export interface BHRGTRockLayer extends BHRGTLayerBase {
456
- material: "rock";
457
- /** Rock description */
458
- rock: RockDescription;
459
- }
460
- /**
461
- * A BHR-GT described layer: either soil or rock.
462
- *
463
- * Narrow on the `material` discriminant:
464
- * ```ts
465
- * if (layer.material === "rock") layer.rock.rockType;
466
- * else layer.geotechnicalSoilName;
467
- * ```
468
- */
469
- export type BHRGTLayer = BHRGTSoilLayer | BHRGTRockLayer;
470
- /**
471
- * Complete Bore data (metadata + layers)
472
- *
473
- * Note: BHRGTData represents BHR-GT-BMB (Boormonsterbeschrijving - visual/textural description)
474
- * For laboratory analysis data, see the optional `analysis` field (BHR-GT-BMA)
475
- */
476
- export interface BHRGTData extends BRORegistrationObject {
477
- /**
478
- * Metadata about the parsed document (schema version, warnings)
479
- */
126
+ export type BHRGTData = {
480
127
  meta: ParseMeta;
481
- /**
482
- * User-defined identifier (not parsed from XML)
483
- *
484
- * Useful for tracking data that doesn't have a broId yet,
485
- * such as during data collection or before BRO registration.
486
- *
487
- * @example
488
- * ```typescript
489
- * const bore = parser.parseBHRGT(xmlString);
490
- * bore.alias = "Borehole 7 - North Field";
491
- * ```
492
- */
493
128
  alias?: string;
494
- researchReportDate: string | null;
495
- deliveredLocation: Location | null;
496
- standardizedLocation: Location | null;
497
- deliveredVerticalPositionOffset: number | null;
498
- deliveredVerticalPositionDatum: string | null;
499
- deliveredVerticalPositionReferencePoint: string | null;
500
- /** Soil use at the site (e.g., "akker", "grasland", "geenBodemgebruik") */
501
- soilUse: string | null;
502
- /** Position of the borehole on the ground body (e.g. "kruin", "talud") */
503
- positionOnGroundBody: string | null;
504
- /** Temporary change at the site at time of drilling (e.g. "geen") */
505
- temporaryChange: string | null;
506
- descriptionProcedure: string | null;
507
- groundwaterLevel: number | null;
508
- /** Mean highest groundwater level in m relative to local reference (GHG) */
509
- meanHighestGroundwaterLevel: number | null;
510
- /** Mean lowest groundwater level in m relative to local reference (GLG) */
511
- meanLowestGroundwaterLevel: number | null;
512
- boreRockReached: boolean | null;
513
- finalBoreDepth: number | null;
514
- finalSampleDepth: number | null;
515
- /** Final depth reached during site preparation (m) */
516
- finalDepthPreparation: number | null;
517
- /** Final depth reached by excavation (m) */
518
- finalDepthExcavation: number | null;
519
- /** Final depth reached with a temporary casing (m) */
520
- finalDepthTemporaryCasing: number | null;
521
- boreHoleCompleted: boolean | null;
522
- /** Start date of the boring operation */
523
- boringStartDate: string | null;
524
- /** End date of the boring operation */
525
- boringEndDate: string | null;
526
- /** Boring procedure standard used (e.g., "EN1997d2v2007") */
527
- boringProcedure: string | null;
528
- /** Boring technique used (e.g., "gestoken", "mechanischGestoken") */
529
- boringTechnique: string | null;
530
- /** Whether the trajectory was excavated */
531
- trajectoryExcavated: boolean | null;
532
- /** Whether the subsurface is contaminated */
533
- subsurfaceContaminated: boolean | null;
534
- /** Stop criterion for boring */
535
- stopCriterion: string | null;
536
- /** Whether a flushing medium was used during boring */
537
- flushingMediumUsed: boolean | null;
538
- /** Flushing additive used during boring (e.g. "geen"), when a flushing medium was used */
539
- flushingAdditive: string | null;
540
- /** Whether a temporary casing was used during boring */
541
- temporaryCasingUsed: boolean | null;
542
- /** Site preparation before boring (e.g., "geen") */
543
- preparation: string | null;
544
- /** KvK number of the operator that carried out the research */
545
- researchOperator: string | null;
546
- /** Type of sampler used */
547
- samplerType: string | null;
548
- /** Sampling procedure standard */
549
- samplingProcedure: string | null;
550
- /** Sampling method used */
551
- samplingMethod: string | null;
552
- /** Sampling quality assessment */
553
- samplingQuality: string | null;
554
- /** Whether the sample was orientated */
555
- orientatedSampled: boolean | null;
556
- /** Sample container diameter in mm */
557
- sampleContainerDiameter: number | null;
558
- /** Sample container length in mm */
559
- sampleContainerLength: number | null;
560
- /** Piston presence in sampler */
561
- pistonPresent: boolean | null;
562
- /** Core catcher presence */
563
- coreCatcherPresent: boolean | null;
564
- /** Stocking used in sampling */
565
- stockingUsed: boolean | null;
566
- /** Lubrication fluid used */
567
- lubricationFluidUsed: boolean | null;
568
- /** Right-angled cutting shoe */
569
- rightAngledCuttingShoe: boolean | null;
570
- /** Cutting shoe inside diameter in mm */
571
- cuttingShoeInsideDiameter: number | null;
572
- /** Cutting shoe outside diameter in mm */
573
- cuttingShoeOutsideDiameter: number | null;
574
- /** Taper angle of cutting shoe */
575
- taperAngle: number | null;
576
- /** Whether the borehole log was checked */
577
- boreholeLogChecked: boolean | null;
578
- /** Description quality assessment */
579
- descriptionQuality: string | null;
580
- /** Description location (field/lab) */
581
- descriptionLocation: string | null;
582
- /** Date of description report */
583
- descriptionReportDate: string | null;
584
- /** Described material type */
585
- describedMaterial: string | null;
586
- /** Whether sampling was continuous */
587
- continuouslySampled: boolean | null;
588
- /** Sample moistness during description */
589
- sampleMoistness: string | null;
590
- data: Array<BHRGTLayer>;
591
- analysis?: BoreholeSampleAnalysis;
592
- /** Array of bored intervals with technique and diameter */
593
- boredIntervals: Array<BoredInterval>;
594
- /** Array of sampled intervals with method and quality */
595
- sampledIntervals: Array<SampledInterval>;
596
- /** Array of completed/backfilled intervals */
597
- completedIntervals: Array<CompletedInterval>;
598
- /** Array of intervals not described (with reason) */
599
- notDescribedIntervals: Array<NotDescribedInterval>;
600
- /** Array of post-sedimentary discontinuities in the descriptive log */
601
- postSedimentaryDiscontinuities: Array<PostSedimentaryDiscontinuity>;
602
- /** Array of excavated layers (removed by excavation) */
603
- excavatedLayers: Array<ExcavatedLayer>;
604
- /** Boring velocity profile (elapsed time vs depth) */
605
- boringVelocity: Array<BoringVelocityMeasurement>;
606
- /** Fluid mud (slib) layer at the borehole, when present */
607
- fluidMudLayer?: FluidMudLayer;
608
- /** Report history with events */
609
- reportHistory: ReportHistory | null;
610
- /** Delivery context (e.g., "publiekeTaak") */
611
- deliveryContext: string | null;
612
- /** Survey purpose (e.g., "bouwwerk") */
613
- surveyPurpose: string | null;
614
- /** Discipline (e.g., "geotechniek") */
615
- discipline: string | null;
616
- /** Survey procedure standard (e.g., "EN1997d2v2007") */
617
- surveyProcedure: string | null;
618
- /** Whether site characteristics were determined */
619
- siteCharacteristicDetermined: boolean | null;
620
- }
621
- /** Munsell colour notation (BHR-G soil colour) */
622
- export interface MunsellColour {
623
- munsellHue: string | null;
624
- munsellValue: string | null;
625
- munsellChroma: string | null;
626
- }
627
- /** A constituent of the sand fraction */
628
- export interface SandConstituent {
629
- grainColour: string | null;
630
- percentageClass: string | null;
631
- archiveClass: string | null;
632
- }
633
- /** Sand fraction description (BHR-G soil) */
634
- export interface SandFraction {
635
- darkGrainContentClass: string | null;
636
- darkGrainContentClassArchive: string | null;
637
- angularity: string | null;
638
- sandMedianClass: string | null;
639
- sandSorting: string | null;
640
- variegation: string | null;
641
- anomalouslyCoarseContentClass: string | null;
642
- anomalouslyCoarseContentClassArchive: string | null;
643
- granuleContentClass: string | null;
644
- granuleContentClassArchive: string | null;
645
- estimatedMedian: number | null;
646
- sandConstituents: Array<SandConstituent>;
647
- }
648
- /** A constituent of the shell fraction */
649
- export interface ShellConstituent {
650
- shellTaxon: string | null;
651
- relativeAbundance: string | null;
652
- relativeAbundanceClass: string | null;
653
- relativeAbundanceClassArchive: string | null;
654
- }
655
- /** Shell fraction description (BHR-G soil) */
656
- export interface ShellFraction {
657
- gritContentClass: string | null;
658
- fragmentContentClass: string | null;
659
- remainsContentClass: string | null;
660
- wholeContentClass: string | null;
661
- doublets: string | null;
662
- thickWalledContentClass: string | null;
663
- thinWalledContentClass: string | null;
664
- inSitu: string | null;
665
- weatheringDegree: string | null;
666
- shellConstituents: Array<ShellConstituent>;
667
- }
668
- /** A constituent of the gravel fraction */
669
- export interface GravelConstituent {
670
- gravelType: string | null;
671
- fractionProportion: number | null;
672
- archiveClass: string | null;
673
- }
674
- /** Gravel fraction description (BHR-G soil) */
675
- export interface GravelFraction {
676
- gravelMedianClass: string | null;
677
- angularity: string | null;
678
- fineGravelContentClass: string | null;
679
- mediumCoarseGravelContentClass: string | null;
680
- veryCoarseGravelContentClass: string | null;
681
- ventifactPresent: string | null;
682
- sphericity: string | null;
683
- variegation: string | null;
684
- gravelProvenance: string | null;
685
- estimatedMedian: number | null;
686
- gravelConstituents: Array<GravelConstituent>;
687
- }
688
- /** A constituent of the peat fraction */
689
- export interface PeatConstituent {
690
- plantRemainType: string | null;
691
- percentageClass: string | null;
692
- archiveClass: string | null;
693
- }
694
- /** Peat fraction description (BHR-G soil) */
695
- export interface PeatFraction {
696
- peatType: string | null;
697
- peatConstituents: Array<PeatConstituent>;
698
- }
699
- /** A chunk (brok) of differing material within a layer */
700
- export interface Chunk {
701
- soilType: string | null;
702
- sizeClass: string | null;
703
- percentageClass: string | null;
704
- archiveClass: string | null;
705
- colour: string | null;
706
- geologicalOrigin: string | null;
707
- cemented: string | null;
708
- }
709
- /** Fine fraction distribution for organic soils (mass proportions, %) */
710
- export interface FineFractionDistributionOrganicSoil {
711
- estimatedMassProportionSand: number | null;
712
- estimatedMassProportionSilt: number | null;
713
- estimatedMassProportionLutum: number | null;
714
- }
715
- /** Fine fraction distribution for shelly soils (volume proportions, %) */
716
- export interface FineFractionDistributionShellySoil {
717
- estimatedVolumeProportionSand: number | null;
718
- estimatedVolumeProportionSilt: number | null;
719
- estimatedVolumeProportionLutum: number | null;
720
- }
721
- /** Estimated fraction distribution of a layer's soil */
722
- export interface FractionDistribution {
723
- fractionDistributionComplete: string | null;
724
- estimatedMassProportionOrganicMatter: number | null;
725
- estimatedMassProportionShellMatter: number | null;
726
- estimatedVolumeProportionShellMatter: number | null;
727
- estimatedMassProportionShell: number | null;
728
- estimatedMassProportionGravel: number | null;
729
- estimatedVolumeProportionGravel: number | null;
730
- fineFractionDistributionOrganicSoil?: FineFractionDistributionOrganicSoil;
731
- fineFractionDistributionShellySoil?: FineFractionDistributionShellySoil;
732
- }
733
- /** A mottle (vlek) in a layer */
734
- export interface Mottle {
735
- colour: string | null;
736
- density: string | null;
737
- inBands: string | null;
738
- }
739
- /** A thin stratum (laagje) interbedded in a layer */
740
- export interface ThinStratum {
741
- layerProportion: number | null;
742
- layerProportionClass: string | null;
743
- layerProportionClassArchive: string | null;
744
- stratumThicknessClass: string | null;
745
- geologicalOrigin: string | null;
746
- }
129
+ } & Produced<typeof BORE_PRODUCER>;
747
130
  /**
748
- * BHR-G (Geological Borehole) layer data
131
+ * Complete BHR-G (Geological Borehole) data (metadata + layers).
749
132
  *
750
- * Contains all fields from the BRO BHR-G schema for a single soil layer.
751
- * Soil-level fields are flattened directly onto the layer (matching the parser's
752
- * existing style); genuinely nested sub-structures (fractions, mottles, chunks,
753
- * thin strata) are modelled as nested objects/arrays.
133
+ * Inferred from `BHRG_PRODUCER`; `meta` (parse metadata) and the optional
134
+ * user-set `alias` are the only fields not produced from the XML.
754
135
  */
755
- export interface BHRGLayer {
756
- upperBoundary: number;
757
- lowerBoundary: number;
758
- upperBoundaryDetermination?: string | null;
759
- lowerBoundaryDetermination?: string | null;
760
- soilNameNEN5104: string;
761
- color?: string;
762
- /** Whether the layer is anthropogenic (man-made) - uses string codes in BHR-G (ja/nee/onbekend) */
763
- anthropogenic?: string | null;
764
- /** Whether the layer is rooted - uses string codes in BHR-G (ja/nee/onbekend) */
765
- rooted?: string | null;
766
- organicMatterContentClassNEN5104?: string | null;
767
- gravelContentClass?: string | null;
768
- carbonateContentClass?: string | null;
769
- sandMedianClass?: string | null;
770
- /** Whether a post-sedimentary change is present (raw code) */
771
- postSedimentary?: string | null;
772
- horizonCode?: string | null;
773
- humanTrace?: string | null;
774
- geologicalOrigin?: string | null;
775
- bioturbated?: string | null;
776
- /** Sedimentary structures (0-3) */
777
- structure?: Array<string>;
778
- /** Vertical trends (0-3) */
779
- verticalTrend?: Array<string>;
780
- /** Archeological constituent types (0-5) */
781
- archeologicalConstituents?: Array<string>;
782
- /** Geological soil name (lithostratigraphic) */
783
- geologicalSoilName?: string | null;
784
- /** Shell matter content classification */
785
- shellMatterContentClass?: string | null;
786
- micaContentClass?: string | null;
787
- micaContentClassArchive?: string | null;
788
- shellMatterContentClassArchive?: string | null;
789
- /** Very coarse fraction content classes (0-2) */
790
- veryCoarseFractionContentClass?: Array<string>;
791
- /** Very coarse fraction content classes, archive coding (0-2) */
792
- veryCoarseFractionContentClassArchive?: Array<string>;
793
- glauconiteContentClass?: string | null;
794
- glauconiteContentClassArchive?: string | null;
795
- sedimentaryPhenomenon?: string | null;
796
- /** Animal fossil types found in the soil (0+) */
797
- animalFossils?: Array<string>;
798
- munsellColour?: MunsellColour;
799
- sandFraction?: SandFraction;
800
- shellFraction?: ShellFraction;
801
- gravelFraction?: GravelFraction;
802
- peatFraction?: PeatFraction;
803
- fractionDistribution?: FractionDistribution;
804
- /** Chunks of differing material (0-3) */
805
- chunks?: Array<Chunk>;
806
- /** Mottles (0-3) */
807
- mottles?: Array<Mottle>;
808
- /** Thin interbedded strata (0-4) */
809
- thinStrata?: Array<ThinStratum>;
810
- }
811
- /**
812
- * Complete BHR-G (Geological Borehole) data (metadata + layers)
813
- */
814
- export interface BHRGData extends BRORegistrationObject {
815
- /**
816
- * Metadata about the parsed document (schema version, warnings)
817
- */
136
+ export type BHRGData = {
818
137
  meta: ParseMeta;
819
- /**
820
- * User-defined identifier (not parsed from XML)
821
- */
822
138
  alias?: string;
823
- researchReportDate: string | null;
824
- deliveredLocation: Location | null;
825
- standardizedLocation: Location | null;
826
- deliveredVerticalPositionOffset: number | null;
827
- deliveredVerticalPositionDatum: string | null;
828
- deliveredVerticalPositionReferencePoint: string | null;
829
- /** Water depth at the borehole location (m), when the survey was over water */
830
- waterDepth: number | null;
831
- /** Date vertical position was determined */
832
- verticalPositioningDate: string | null;
833
- /** Method used to determine vertical position */
834
- verticalPositioningMethod: string | null;
835
- /** KvK number of the operator that determined the vertical position */
836
- verticalPositioningOperator: string | null;
837
- /** Landscape element at the site */
838
- landscapeElement: string | null;
839
- /** Hydrological setting at the site */
840
- hydrologicalSetting: string | null;
841
- /** Current geomorphological process at the site */
842
- currentProcess: string | null;
843
- descriptionProcedure: string | null;
844
- /** Tool used for the sample description */
845
- utensil: string | null;
846
- boreRockReached: boolean | null;
847
- finalBoreDepth: number | null;
848
- finalSampleDepth: number | null;
849
- boreHoleCompleted: string | null;
850
- /** Start date of the boring operation */
851
- boringStartDate: string | null;
852
- /** End date of the boring operation */
853
- boringEndDate: string | null;
854
- /** Boring procedure standard used */
855
- boringProcedure: string | null;
856
- /** Boring technique used */
857
- boringTechnique: string | null;
858
- /** Whether the trajectory was excavated */
859
- trajectoryExcavated: boolean | null;
860
- /** Whether the subsurface is contaminated */
861
- subsurfaceContaminated: boolean | null;
862
- /** Stop criterion for boring */
863
- stopCriterion: string | null;
864
- /** Whether a flushing additive was used (raw code) */
865
- flushingAdditiveUsed: string | null;
866
- /** Sampling procedure standard */
867
- samplingProcedure: string | null;
868
- /** Sampling method used */
869
- samplingMethod: string | null;
870
- /** Sampling quality assessment */
871
- samplingQuality: string | null;
872
- /** Description quality assessment */
873
- descriptionQuality: string | null;
874
- /** Described samples quality */
875
- describedSamplesQuality: string | null;
876
- /** Description location (field/lab) */
877
- descriptionLocation: string | null;
878
- /** Date of description report */
879
- descriptionReportDate: string | null;
880
- /** Described material type */
881
- describedMaterial: string | null;
882
- /** Whether sampling was continuous */
883
- continuouslySampled: boolean | null;
884
- /** Sample moistness during description */
885
- sampleMoistness: string | null;
886
- data: Array<BHRGLayer>;
887
- /** Array of bored intervals with technique and diameter */
888
- boredIntervals: Array<BoredInterval>;
889
- /** Array of sampled intervals with method and quality */
890
- sampledIntervals: Array<SampledInterval>;
891
- /** Report history with events */
892
- reportHistory: ReportHistory | null;
893
- /** Delivery context (e.g., "archiefoverdracht") */
894
- deliveryContext: string | null;
895
- /** Survey purpose */
896
- surveyPurpose: string | null;
897
- /** Discipline (e.g., "geologie") */
898
- discipline: string | null;
899
- /** Survey procedure standard */
900
- surveyProcedure: string | null;
901
- /** NITG code (legacy identifier) */
902
- nitgCode: string | null;
903
- }
904
- /**
905
- * Bored interval - records boring technique and diameter at specific depth ranges
906
- */
907
- export interface BoredInterval {
908
- beginDepth: number;
909
- endDepth: number;
910
- boringTechnique: string | null;
911
- boredDiameter: number | null;
912
- }
913
- /**
914
- * Sampler equipment details within a sampled interval
915
- */
916
- export interface SamplerDetails {
917
- samplerType: string | null;
918
- sampleContainerDiameter: number | null;
919
- sampleContainerLength: number | null;
920
- cuttingShoeInsideDiameter: number | null;
921
- cuttingShoeOutsideDiameter: number | null;
922
- stockingUsed: boolean | null;
923
- rightAngledCuttingShoe: boolean | null;
924
- taperAngle: number | null;
925
- lubricationFluidUsed: boolean | null;
926
- coreCatcherPresent: boolean | null;
927
- pistonPresent: boolean | null;
928
- }
929
- /**
930
- * Core recovery measurements for a sampled interval (rock coring)
931
- */
932
- export interface CoreRecovery {
933
- /** Total core recovery (%) */
934
- totalCoreRecovery: number | null;
935
- /** Solid core recovery (%) */
936
- solidCoreRecovery: number | null;
937
- /** Rock Quality Designation (%) */
938
- rockQualityDesignation: number | null;
939
- /** Whether the core recovery was determined in the field */
940
- fieldDetermined: boolean | null;
941
- }
942
- /**
943
- * Sampled interval - records sampling method and quality at specific depth ranges
944
- */
945
- export interface SampledInterval {
946
- beginDepth: number;
947
- endDepth: number;
948
- preTreatment: string | null;
949
- samplingMethod: string | null;
950
- samplingQuality: string | null;
951
- orientatedSampled: boolean | null;
952
- sampler?: SamplerDetails;
953
- /** Core recovery measurements (rock coring), when determined */
954
- coreRecovery?: CoreRecovery;
955
- }
956
- /**
957
- * Completed interval - records how the borehole was completed/backfilled
958
- */
959
- export interface CompletedInterval {
960
- beginDepth: number;
961
- endDepth: number;
962
- permanentCasingPresent: boolean | null;
963
- /** Diameter of the permanent casing (mm) */
964
- diameterPermanentCasing: number | null;
965
- /** Material of the permanent casing */
966
- materialPermanentCasing: string | null;
967
- backfillMaterial: string | null;
968
- backfillMaterialWashed: boolean | null;
969
- backfillMaterialCertified: boolean | null;
970
- }
971
- /**
972
- * Excavated layer - a layer removed by excavation before/during boring
973
- */
974
- export interface ExcavatedLayer {
975
- upperBoundary: number;
976
- lowerBoundary: number;
977
- /** Material that was excavated */
978
- excavatedMaterial: string | null;
979
- }
980
- /**
981
- * Boring velocity measurement - drilling depth reached after a given elapsed time
982
- */
983
- export interface BoringVelocityMeasurement {
984
- /** Elapsed time (s) */
985
- elapsedTime: number | null;
986
- /** Depth reached (m) */
987
- depth: number | null;
988
- }
989
- /**
990
- * Fluid mud layer - a layer of fluid mud (slib) recorded at the borehole
991
- */
992
- export interface FluidMudLayer {
993
- /** Thickness of the fluid mud layer (m) */
994
- thickness: number | null;
995
- /** Colour of the fluid mud */
996
- colour: string | null;
997
- /** Method used to position the upper boundary */
998
- upperBoundaryPositioningMethod: string | null;
999
- /** Method used to position the lower boundary */
1000
- lowerBoundaryPositioningMethod: string | null;
1001
- }
1002
- /**
1003
- * Not described interval - records depth ranges that were not described and why
1004
- */
1005
- export interface NotDescribedInterval {
1006
- beginDepth: number;
1007
- endDepth: number;
1008
- noDescriptionReason: string | null;
1009
- }
1010
- /**
1011
- * Intermediate event in report history
1012
- */
1013
- export interface IntermediateEvent {
1014
- eventName: string | null;
1015
- eventDate: string | null;
1016
- }
1017
- /**
1018
- * Registration history - BRO administrative registration information
1019
- */
1020
- export interface RegistrationHistory {
1021
- objectRegistrationTime: string | null;
1022
- registrationStatus: string | null;
1023
- registrationCompletionTime: string | null;
1024
- /** Time of the latest correction to the registered object */
1025
- latestCorrectionTime: string | null;
1026
- /** Time of the latest addition to the registered object */
1027
- latestAdditionTime: string | null;
1028
- /** Time the object was placed under review */
1029
- underReviewTime: string | null;
1030
- /** Time the object was deregistered */
1031
- deregistrationTime: string | null;
1032
- /** Time the object was reregistered after deregistration */
1033
- reregistrationTime: string | null;
1034
- corrected: boolean | null;
1035
- underReview: boolean | null;
1036
- deregistered: boolean | null;
1037
- reregistered: boolean | null;
1038
- }
1039
- /**
1040
- * Report history - records when and how data was reported
1041
- */
1042
- export interface ReportHistory {
1043
- reportStartDate: string | null;
1044
- reportEndDate: string | null;
1045
- intermediateEvents: Array<IntermediateEvent>;
1046
- }
1047
- /**
1048
- * BHR-GT-BMA (Borehole Sample Analysis) - Laboratory Determinations
1049
- */
1050
- /**
1051
- * Water content determination result
1052
- */
1053
- export interface WaterContentDetermination {
1054
- determinationProcedure: string | null;
1055
- determinationMethod: string | null;
1056
- sampleMoistness: string | null;
1057
- removedMaterial: string | null;
1058
- waterContent: number | null;
1059
- dryingTemperature: string | null;
1060
- dryingPeriod: string | null;
1061
- saltCorrectionMethod: string | null;
1062
- }
1063
- /**
1064
- * Volumetric mass density (bulk density) determination result
1065
- */
1066
- export interface VolumetricMassDensityDetermination {
1067
- determinationProcedure: string | null;
1068
- determinationMethod: string | null;
1069
- sampleMoistness: string | null;
1070
- volumetricMassDensity: number | null;
1071
- }
1072
- /**
1073
- * Organic matter content determination result
1074
- */
1075
- export interface OrganicMatterContentDetermination {
1076
- determinationProcedure: string | null;
1077
- determinationMethod: string | null;
1078
- removedMaterial: string | null;
1079
- /** Whether a lutum (clay fraction) correction was applied to the result */
1080
- lutumCorrectionApplied: boolean | null;
1081
- organicMatterContent: number | null;
1082
- }
1083
- /**
1084
- * Carbonate content determination result
1085
- */
1086
- export interface CarbonateContentDetermination {
1087
- determinationProcedure: string | null;
1088
- determinationMethod: string | null;
1089
- removedMaterial: string | null;
1090
- carbonateContent: number | null;
1091
- }
1092
- /**
1093
- * Volumetric mass density of solids determination result
1094
- */
1095
- export interface VolumetricMassDensityOfSolidsDetermination {
1096
- determinationProcedure: string | null;
1097
- determinationMethod: string | null;
1098
- liquidUsed: string | null;
1099
- /** Volume of the sample container used (e.g., "100ml") */
1100
- sampleContainerVolume: string | null;
1101
- volumetricMassDensityOfSolids: number | null;
1102
- }
1103
- /**
1104
- * Particle size distribution determination result
1105
- * Contains detailed grain size fractions
1106
- */
1107
- export interface ParticleSizeDistributionDetermination {
1108
- determinationProcedure: string | null;
1109
- determinationMethod: string | null;
1110
- fractionDistribution: string | null;
1111
- dispersionMethod: string | null;
1112
- removedMaterial: string | null;
1113
- equivalentMassDeterminationMethod: string | null;
1114
- equivalentMass: number | null;
1115
- /** Optical model used (for laser-diffraction methods) */
1116
- usedOpticalModel?: string | null;
1117
- fractionSmaller63um: number | null;
1118
- fractionLarger63um: number | null;
1119
- fraction0to2um?: number | null;
1120
- /** 2–32 µm fraction — only present in the coarser standardDistributionFractionSmaller63um group */
1121
- fraction2to32um?: number | null;
1122
- fraction2to4um?: number | null;
1123
- fraction4to8um?: number | null;
1124
- fraction8to16um?: number | null;
1125
- fraction16to32um?: number | null;
1126
- fraction32to50um?: number | null;
1127
- fraction50to63um?: number | null;
1128
- fraction63to90um?: number | null;
1129
- fraction90to125um?: number | null;
1130
- fraction125to180um?: number | null;
1131
- fraction180to250um?: number | null;
1132
- fraction250to355um?: number | null;
1133
- fraction355to500um?: number | null;
1134
- fraction500to710um?: number | null;
1135
- fraction710to1000um?: number | null;
1136
- fraction1000to1400um?: number | null;
1137
- fraction1400umto2mm?: number | null;
1138
- fraction2to4mm?: number | null;
1139
- fraction4to8mm?: number | null;
1140
- fraction8to16mm?: number | null;
1141
- fraction16to31_5mm?: number | null;
1142
- fraction31_5to63mm?: number | null;
1143
- fractionLarger63mm?: number | null;
1144
- fraction63to75um?: number | null;
1145
- fraction75to90um?: number | null;
1146
- fraction90to106um?: number | null;
1147
- fraction106to125um?: number | null;
1148
- fraction125to150um?: number | null;
1149
- fraction150to180um?: number | null;
1150
- fraction180to212um?: number | null;
1151
- fraction212to250um?: number | null;
1152
- fraction4to5_6mm?: number | null;
1153
- fraction5_6to8mm?: number | null;
1154
- fraction8to11_2mm?: number | null;
1155
- fraction11_2to16mm?: number | null;
1156
- fraction16to20mm?: number | null;
1157
- fraction20to31_5mm?: number | null;
1158
- }
1159
- /**
1160
- * Plasticity data point for Atterberg limits test
1161
- * Used to construct the plasticity curve (Casagrande)
1162
- */
1163
- export interface PlasticityAtSpecificWaterContent {
1164
- waterContent: number;
1165
- numberOfFalls: number;
1166
- /** Cone penetration depth in mm (fall-cone method) */
1167
- penetrationDepth?: number | null;
1168
- }
1169
- /**
1170
- * Consistency limits determination (Atterberg limits)
1171
- * Used to determine soil plasticity characteristics
1172
- */
1173
- export interface ConsistencyLimitsDetermination {
1174
- determinationProcedure: string | null;
1175
- determinationMethod: string | null;
1176
- fractionLarger500um: number | null;
1177
- usedMedium: string | null;
1178
- performanceIrregularity: string | null;
1179
- /** Fall-cone apparatus type used (e.g., "zweedseConus30graden") */
1180
- conusType: string | null;
1181
- liquidLimit: number | null;
1182
- plasticLimit: number | null;
1183
- plasticityIndex: number | null;
1184
- plasticityAtSpecificWaterContent: Array<PlasticityAtSpecificWaterContent>;
1185
- }
1186
- /**
1187
- * Height measurement at specific time during settlement test
1188
- * Used to construct compression/consolidation curves
1189
- */
1190
- export interface HeightAtSpecificTime {
1191
- time: number;
1192
- height: number;
1193
- }
1194
- /**
1195
- * Stress/strain measurement at a specific time during a settlement step
1196
- * Columns of the StressAtSpecificSettlement time-series (oedometer/consolidation).
1197
- */
1198
- export interface StressAtSpecificSettlement {
1199
- elapsedTime: number;
1200
- verticalStrain: number;
1201
- excessPoreWaterPressure: number | null;
1202
- verticalEffectiveStress: number | null;
1203
- horizontalEffectiveStress: number | null;
1204
- }
1205
- /**
1206
- * Single loading step in settlement characteristics test
1207
- * Represents one stress increment in oedometer/consolidation test
1208
- */
1209
- export interface SettlementDeterminationStep {
1210
- stepNumber: number;
1211
- wetPerformed: boolean | null;
1212
- swellObserved: boolean | null;
1213
- strainPoint24hours: number | null;
1214
- stepType: string | null;
1215
- verticalStress: number | null;
1216
- heightChangeDuringSettlement: Array<HeightAtSpecificTime>;
1217
- /** Stress/strain time-series for the step (alternative to heightChangeDuringSettlement) */
1218
- stressChangeDuringSettlement?: Array<StressAtSpecificSettlement>;
1219
- }
1220
- /**
1221
- * Saturation stage preceding compression in the oedometer/settlement test
1222
- * Documents how the specimen was saturated before loading.
1223
- */
1224
- export interface SaturationStageAtCompression {
1225
- porousDiscWet: boolean | null;
1226
- usedMedium: string | null;
1227
- backPressure: number | null;
1228
- constantHeight: boolean | null;
1229
- specimenHeightAfterwards: number | null;
1230
- disturbanceInduced: boolean | null;
1231
- /** Maximum stress difference during saturation (kPa) */
1232
- maximumStressDifference: number | null;
1233
- /** Maximum strain during saturation (%) */
1234
- maximumStrain: number | null;
1235
- }
1236
- /**
1237
- * Settlement characteristics determination (oedometer/consolidation test)
1238
- * Used to determine soil compressibility and consolidation behavior
1239
- */
1240
- export interface SettlementCharacteristicsDetermination {
1241
- determinationProcedure: string | null;
1242
- determinationMethod: string | null;
1243
- ringDiameter: number | null;
1244
- sampleMoistness: string | null;
1245
- filterPaperUsed: boolean | null;
1246
- temperature: number | null;
1247
- wallFrictionCorrectionMethod: string | null;
1248
- apparatusDeformationApplied: boolean | null;
1249
- bearingFrictionCorrectionApplied: boolean | null;
1250
- irregularResult: boolean | null;
1251
- /** Saturation stage performed before compression (optional) */
1252
- saturationStageAtCompression?: SaturationStageAtCompression;
1253
- determinationSteps: Array<SettlementDeterminationStep>;
1254
- }
1255
- /**
1256
- * Permeability at specific density measurement
1257
- */
1258
- export interface SaturatedPermeabilityAtSpecificDensity {
1259
- dryVolumetricMassDensity: number | null;
1260
- saturatedPermeability: number | null;
1261
- }
1262
- /**
1263
- * Permeability at specific load measurement
1264
- */
1265
- export interface SaturatedPermeabilityAtSpecificLoad {
1266
- load: number | null;
1267
- saturatedPermeability: number | null;
1268
- }
1269
- /**
1270
- * Saturated permeability determination (hydraulic conductivity)
1271
- * Used to determine water flow characteristics through soil
1272
- */
1273
- export interface SaturatedPermeabilityDetermination {
1274
- determinationProcedure: string | null;
1275
- determinationMethod: string | null;
1276
- specimenMade: boolean | null;
1277
- saturatedWithCO2: boolean | null;
1278
- verticallyDetermined: boolean | null;
1279
- currentDownwards: boolean | null;
1280
- usedMedium: string | null;
1281
- waterDegassed: boolean | null;
1282
- temperature: number | null;
1283
- maximumGradient: number | null;
1284
- /** Whether the confining ring was water-repellent (raw code) */
1285
- ringWaterRepellent: string | null;
1286
- /** Water content after the test (%) */
1287
- waterContentAfterwards: number | null;
1288
- /** Material irregularities observed (0-2 codes) */
1289
- materialIrregularity: Array<string>;
1290
- saturatedPermeabilityAtSpecificDensity: Array<SaturatedPermeabilityAtSpecificDensity>;
1291
- saturatedPermeabilityAtSpecificLoad: Array<SaturatedPermeabilityAtSpecificLoad>;
1292
- }
1293
- /**
1294
- * Membrane correction data for triaxial test
1295
- * Corrects for membrane stiffness effects during testing
1296
- */
1297
- export interface MembraneCorrection {
1298
- correctionMethod: string | null;
1299
- thickness: number | null;
1300
- stiffnessClass: string | null;
1301
- }
1302
- /**
1303
- * Drainage strip correction data for triaxial test
1304
- * Corrects for drainage strip effects during testing
1305
- */
1306
- export interface DrainageStripCorrection {
1307
- correctionMethod: string | null;
1308
- orientation: string | null;
1309
- coverage: string | null;
1310
- }
1311
- /**
1312
- * Saturation stage data for triaxial test
1313
- * Documents sample saturation process before testing
1314
- */
1315
- export interface SaturationStageAtLoading {
1316
- porousDiscWet: boolean | null;
1317
- porousDiscRough: boolean | null;
1318
- usedMedium: string | null;
1319
- constantHeight: boolean | null;
1320
- cellPressureAutomaticallyControlled: boolean | null;
1321
- backPressure: number | null;
1322
- effectivePressure: number | null;
1323
- skemptonBCoefficient: number | null;
1324
- disturbanceInduced: boolean | null;
1325
- /** Stress difference during saturation (kPa) */
1326
- stressDifference: number | null;
1327
- }
1328
- /**
1329
- * Volume change measurement at specific time during consolidation
1330
- */
1331
- export interface VolumeChangeAtSpecificTime {
1332
- time: number;
1333
- volumeChange: number;
1334
- }
1335
- /**
1336
- * Consolidation stage data for triaxial test
1337
- * Documents specimen consolidation under specified stresses
1338
- */
1339
- export interface ConsolidationStageAtLoading {
1340
- drainageTwoSided: boolean | null;
1341
- consolidationMethod: string | null;
1342
- verticalConsolidationStress: number | null;
1343
- horizontalConsolidationStress: number | null;
1344
- verticalStrain: number | null;
1345
- lateralEarthPressureCoefficient: number | null;
1346
- volumeChangeDuringConsolidation: Array<VolumeChangeAtSpecificTime>;
1347
- }
1348
- /**
1349
- * Shear stress measurement at specific strain during loading
1350
- * Used to construct stress-strain curves for soil strength analysis
1351
- */
1352
- export interface ShearStressAtSpecificStrain {
1353
- time: number;
1354
- axialStrain: number;
1355
- deviatorStress: number;
1356
- cellPressure: number;
1357
- porePressure?: number | null;
1358
- volumeChange?: number | null;
1359
- }
1360
- /**
1361
- * Reconstituted/remoulded specimen preparation for a triaxial loading test
1362
- * Present when the specimen was made in the lab rather than taken intact.
1363
- */
1364
- export interface SpecimenMadeForLoading {
1365
- makingMethod: string | null;
1366
- dryVolumetricMassDensity: number | null;
1367
- }
1368
- /**
1369
- * Load stage data for triaxial test
1370
- * Documents the shearing/loading phase of the test
1371
- */
1372
- export interface LoadStage {
1373
- deformationRate: number | null;
1374
- specimenShape: string | null;
1375
- shearStressChangeDuringLoading: Array<ShearStressAtSpecificStrain>;
1376
- }
1377
- /**
1378
- * Shear stress change during loading determination (triaxial/direct shear test)
1379
- * ISO 17892-9 (triaxial) or ISO 17892-10 (direct shear)
1380
- *
1381
- * Measures soil shear strength and stress-strain behavior under controlled loading.
1382
- * Common test types:
1383
- * - CU: Consolidated Undrained (belastenGeconsolideerdOngedraineerd)
1384
- * - CD: Consolidated Drained (belastenGeconsolideerdGedraineerd)
1385
- * - UU: Unconsolidated Undrained (belastenOngeconsolideerdOngedraineerd)
1386
- */
1387
- export interface ShearStressChangeDuringLoadingDetermination {
1388
- determinationProcedure: string | null;
1389
- determinationMethod: string | null;
1390
- specimenDisturbed: boolean | null;
1391
- specimenTrimmed: boolean | null;
1392
- sampleMoistness: string | null;
1393
- beginDiameter: number | null;
1394
- beginHeight: number | null;
1395
- topCapTiltable: boolean | null;
1396
- filterPaperUsed: boolean | null;
1397
- drainageStripsUsed: boolean | null;
1398
- membraneSaturatedBefore: boolean | null;
1399
- apparatusDeformationApplied: boolean | null;
1400
- cellDeformationApplied: boolean | null;
1401
- stopCriterion: string | null;
1402
- membraneCorrection?: MembraneCorrection;
1403
- drainageStripCorrection?: DrainageStripCorrection;
1404
- madeSpecimenForLoading?: SpecimenMadeForLoading;
1405
- saturationStageAtLoading?: SaturationStageAtLoading;
1406
- consolidationStageAtLoading?: ConsolidationStageAtLoading;
1407
- loadStage?: LoadStage;
1408
- }
1409
- /**
1410
- * Maximum undrained shear strength determination (vane shear test)
1411
- * ISO 14688-2 - Measures peak undrained shear strength using hand vane
1412
- */
1413
- export interface MaximumUndrainedShearStrengthDetermination {
1414
- determinationProcedure: string | null;
1415
- determinationMethod: string | null;
1416
- determinationDiameter: string | null;
1417
- verticallyDetermined: boolean | null;
1418
- sampleMoistness: string | null;
1419
- maximumUndrainedShearStrength: number | null;
1420
- /** Lowest measured maximum undrained shear strength (kPa) */
1421
- lowestMaximumUndrainedShearStrength: number | null;
1422
- /** Highest measured maximum undrained shear strength (kPa) */
1423
- highestMaximumUndrainedShearStrength: number | null;
1424
- }
1425
- /**
1426
- * Height measurement at specific time during consolidation in horizontal deformation test
1427
- */
1428
- export interface HeightAtSpecificConsolidationTime {
1429
- time: number;
1430
- height: number;
1431
- }
1432
- /**
1433
- * Single consolidation step in horizontal deformation test
1434
- */
1435
- export interface ConsolidationStepAtHorizontalDeformation {
1436
- stepNumber: number | null;
1437
- verticalStress: number | null;
1438
- heightChangeDuringConsolidation: Array<HeightAtSpecificConsolidationTime>;
1439
- }
1440
- /**
1441
- * Consolidation stage for horizontal deformation (direct shear) test
1442
- */
1443
- export interface ConsolidationStageAtHorizontalDeformation {
1444
- pedestalFixed: boolean | null;
1445
- consolidationSteps: Array<ConsolidationStepAtHorizontalDeformation>;
1446
- }
1447
- /**
1448
- * Shear stress measurement at specific deformation during horizontal shearing
1449
- */
1450
- export interface HorizontalDeformationDataPoint {
1451
- time: number;
1452
- horizontalDisplacement: number;
1453
- shearStress: number;
1454
- verticalStress: number;
1455
- heightChange?: number | null;
1456
- }
1457
- /**
1458
- * Shear stage for horizontal deformation (direct shear) test
1459
- */
1460
- export interface ShearStageAtHorizontalDeformation {
1461
- deformationRate: number | null;
1462
- activeHeightControl: boolean | null;
1463
- shearStressChangeDuringHorizontalDeformation: Array<HorizontalDeformationDataPoint>;
1464
- }
1465
- /**
1466
- * Shear stress change during horizontal deformation determination (direct shear test)
1467
- * ASTM D6528 - Measures soil shear strength under horizontal deformation
1468
- */
1469
- export interface ShearStressChangeDuringHorizontalDeformationDetermination {
1470
- determinationProcedure: string | null;
1471
- determinationMethod: string | null;
1472
- specimenDisturbed: boolean | null;
1473
- sampleMoistness: string | null;
1474
- specimenWaterSaturated: boolean | null;
1475
- porousDiscWet: boolean | null;
1476
- drained: boolean | null;
1477
- lateralSupport: string | null;
1478
- beginDiameter: number | null;
1479
- beginHeight: number | null;
1480
- stopCriterion: string | null;
1481
- membraneCorrectionApplied: boolean | null;
1482
- apparatusDeformationApplied: boolean | null;
1483
- bearingFrictionCorrectionApplied: boolean | null;
1484
- consolidationStageAtHorizontalDeformation?: ConsolidationStageAtHorizontalDeformation;
1485
- shearStage?: ShearStageAtHorizontalDeformation;
1486
- }
1487
- /**
1488
- * Investigated interval with laboratory determinations
1489
- * Each interval represents a depth range with analysis results
1490
- */
1491
- export interface InvestigatedInterval {
1492
- beginDepth: number;
1493
- endDepth: number;
1494
- sampleQuality: string | null;
1495
- analysisType: string | null;
1496
- waterContentDetermined: boolean | null;
1497
- organicMatterContentDetermined: boolean | null;
1498
- carbonateContentDetermined: boolean | null;
1499
- volumetricMassDensityDetermined: boolean | null;
1500
- volumetricMassDensitySolidsDetermined: boolean | null;
1501
- described: boolean | null;
1502
- waterContentDetermination?: WaterContentDetermination;
1503
- organicMatterContentDetermination?: OrganicMatterContentDetermination;
1504
- carbonateContentDetermination?: CarbonateContentDetermination;
1505
- volumetricMassDensityDetermination?: VolumetricMassDensityDetermination;
1506
- volumetricMassDensityOfSolidsDetermination?: VolumetricMassDensityOfSolidsDetermination;
1507
- particleSizeDistributionDetermination?: ParticleSizeDistributionDetermination;
1508
- consistencyLimitsDetermination?: ConsistencyLimitsDetermination;
1509
- settlementCharacteristicsDetermination?: SettlementCharacteristicsDetermination;
1510
- saturatedPermeabilityDetermination?: SaturatedPermeabilityDetermination;
1511
- shearStressChangeDuringLoadingDetermination?: Array<ShearStressChangeDuringLoadingDetermination>;
1512
- maximumUndrainedShearStrengthDetermination?: MaximumUndrainedShearStrengthDetermination;
1513
- shearStressChangeDuringHorizontalDeformationDetermination?: Array<ShearStressChangeDuringHorizontalDeformationDetermination>;
1514
- }
1515
- /**
1516
- * Borehole sample analysis data (BHR-GT-BMA)
1517
- * Contains laboratory test results for soil samples
1518
- */
1519
- export interface BoreholeSampleAnalysis {
1520
- analysisReportDate: string | null;
1521
- analysisProcedure: string | null;
1522
- investigatedIntervals: Array<InvestigatedInterval>;
1523
- }
1524
- /**
1525
- * Configuration for determination type parsing in registry pattern
1526
- */
1527
- export interface DeterminationConfig<T> {
1528
- xpath: string;
1529
- propertyName: keyof InvestigatedInterval;
1530
- parser: (node: Node, adapter: XMLAdapter, namespaces: Namespaces) => T;
1531
- }
139
+ } & Produced<typeof BHRG_PRODUCER>;
1532
140
  /**
1533
141
  * Union type for all BRO data types
1534
142
  *
@@ -1540,11 +148,33 @@ export interface DeterminationConfig<T> {
1540
148
  * }
1541
149
  * ```
1542
150
  */
1543
- export type BROData = CPTData | BHRGTData | BHRGData;
151
+ export type BROData = CPTData | BHRGTData | BHRGData | GMWData | GLDData;
1544
152
  /**
1545
153
  * BRO file type identifier
1546
154
  */
1547
- export type BROFileType = "CPT" | "BHR-GT" | "BHR-G";
155
+ export type BROFileType = "CPT" | "BHR-GT" | "BHR-G" | "GMW" | "GLD";
156
+ /**
157
+ * Complete GLD (groundwater level research) data.
158
+ *
159
+ * Inferred from `GLD_PRODUCER`; `meta` (parse metadata) and the optional
160
+ * user-set `alias` are the only fields not produced from the XML.
161
+ */
162
+ export type GLDData = {
163
+ meta: ParseMeta;
164
+ alias?: string;
165
+ } & Produced<typeof GLD_PRODUCER>;
166
+ /**
167
+ * Complete GMW (groundwater monitoring well) data.
168
+ *
169
+ * The registration object carries well-level metadata plus one or more
170
+ * monitoring tubes. Inferred from `GMW_PRODUCER`; `meta` (parse
171
+ * metadata) and the optional user-set `alias` are the only fields not produced
172
+ * from the XML.
173
+ */
174
+ export type GMWData = {
175
+ meta: ParseMeta;
176
+ alias?: string;
177
+ } & Produced<typeof GMW_PRODUCER>;
1548
178
  /**
1549
179
  * Parse error with context
1550
180
  */