Skip to main content

boring_parser/
boring_structs_300.rs

1use serde::{Deserialize, Serialize};
2
3// v2.10の構造体を流用
4use crate::boring_structs_210::*;
5use crate::classification::{ClassificationInfo, Constituent, RockGroupCode, RockGroupInfo};
6use crate::types::FreeInfo;
7
8// ============================================================================
9// ルート構造体
10// ============================================================================
11
12#[derive(Debug, Serialize, Deserialize)]
13#[serde(rename = "ボーリング情報")]
14pub struct Boring300 {
15    #[serde(rename = "@DTD_version")]
16    pub dtd_version: Option<String>,
17    #[serde(rename = "標題情報")]
18    pub title: Title300,
19    #[serde(rename = "コア情報")]
20    pub core: Core300,
21}
22
23// ============================================================================
24// 標題情報 - v2.10と同じ構造だが、BasicSurvey300を使用
25// ============================================================================
26
27#[derive(Debug, Serialize, Deserialize)]
28pub struct Title300 {
29    #[serde(rename = "調査基本情報")]
30    pub basic_info: BasicSurvey300,
31    #[serde(rename = "経度緯度情報")]
32    pub longitude_latitude: LngLat210,
33    #[serde(default, rename = "ローカル座標")]
34    pub local_coordinates: Vec<LocalCoordinate210>,
35    #[serde(rename = "調査位置")]
36    pub survey_position: SurveyPosition210,
37    #[serde(rename = "発注機関")]
38    pub order_institution: OrderInstitution210,
39    #[serde(rename = "調査期間")]
40    pub survey_period: SurveyPeriod210,
41    #[serde(rename = "調査会社")]
42    pub survey_company: SurveyCompany210,
43    #[serde(rename = "ボーリング基本情報")]
44    pub boring_basic_info: BoringBasicInfo210,
45    #[serde(rename = "試錐機")]
46    pub drilling_machine: DrillingMachine210,
47    #[serde(rename = "エンジン")]
48    pub engine: Engine210,
49    #[serde(default, rename = "ハンマー落下用具")]
50    pub hammer_drop_tool: Option<HammerDropTool210>,
51    #[serde(default, rename = "N値記録用具")]
52    pub n_value_recorder: Option<NValueRecorder210>,
53    #[serde(rename = "ポンプ")]
54    pub pump: Pump210,
55    #[serde(default, rename = "櫓種類")]
56    pub tower_type: Option<TowerType210>,
57}
58
59// ============================================================================
60// 調査基本情報 - v3.00で適用規格が追加
61// ============================================================================
62
63#[derive(Debug, Serialize, Deserialize)]
64pub struct BasicSurvey300 {
65    #[serde(default, rename = "事業工事名")]
66    pub project_name: Option<String>,
67    #[serde(rename = "調査名")]
68    pub survey_name: Option<String>,
69    #[serde(rename = "調査目的")]
70    pub survey_purpose: Option<String>,
71    #[serde(rename = "調査対象")]
72    pub survey_target: Option<String>,
73    #[serde(rename = "ボーリング名")]
74    pub boring_name: Option<String>,
75    #[serde(rename = "ボーリング総数")]
76    pub total_boring: Option<String>,
77    #[serde(rename = "ボーリング連番")]
78    pub boring_serial: Option<String>,
79}
80
81// ============================================================================
82// コア情報 - 岩石土区分を使用、その他はv2.10を再利用
83// ============================================================================
84
85#[derive(Debug, Serialize, Deserialize)]
86pub struct Core300 {
87    #[serde(rename = "岩石土区分")] // v3.00で名称変更
88    pub rock_soil_classifications: Vec<RockSoilClassification300>,
89    #[serde(default, rename = "色調")]
90    pub colors: Vec<Color210>,
91    #[serde(default, rename = "観察記事")]
92    pub observational_articles: Vec<ObservationalArticle210>,
93    #[serde(default, rename = "観察記事枠線")]
94    pub observational_article_frames: Vec<ObservationalArticleFrame210>,
95    #[serde(default, rename = "標準貫入試験")]
96    pub standard_penetration_tests: Vec<StandardPenetrationTest210>,
97    #[serde(default, rename = "標準貫入試験詳細データ")]
98    pub standard_penetration_test_details: Vec<StandardPenetrationTestDetail210>,
99    #[serde(default, rename = "ルジオン試験")]
100    pub lugeon_tests: Vec<LugeonTest210>,
101    #[serde(default, rename = "ルジオン試験詳細データ")]
102    pub lugeon_test_details: Vec<LugeonTestDetail210>,
103    #[serde(default, rename = "相対密度稠度")]
104    pub relative_density_consistency: Vec<RelativeDensityConsistency210>,
105    #[serde(default, rename = "硬軟区分判定表")]
106    pub hardness_classification_table: Vec<HardnessClassificationTable210>,
107    #[serde(default, rename = "硬軟区分")]
108    pub hardness_classifications: Vec<HardnessClassification300>, // v3.00で内部フィールドがオプション化
109    #[serde(default, rename = "コア形状区分判定表")]
110    pub core_shape_classification_table: Vec<CoreShapeClassificationTable210>,
111    #[serde(default, rename = "コア形状区分")]
112    pub core_shape_classifications: Vec<CoreShapeClassification300>, // v3.00で内部フィールドがオプション化
113    #[serde(default, rename = "割れ目区分判定表")]
114    pub fracture_classification_table: Vec<FractureClassificationTable210>,
115    #[serde(default, rename = "割れ目区分")]
116    pub fracture_classifications: Vec<FractureClassification300>, // v3.00で内部フィールドがオプション化
117    #[serde(default, rename = "風化区分判定表")]
118    pub weathering_classification_table: Vec<WeatheringClassificationTable210>,
119    #[serde(default, rename = "風化区分")]
120    pub weathering_classifications: Vec<WeatheringClassification300>, // v3.00で内部フィールドがオプション化
121    #[serde(default, rename = "変質区分判定表")]
122    pub alteration_classification_table: Vec<AlterationClassificationTable210>,
123    #[serde(default, rename = "変質区分")]
124    pub alteration_classifications: Vec<AlterationClassification300>, // v3.00で内部フィールドがオプション化
125    #[serde(default, rename = "孔内水平載荷試験")]
126    pub borehole_horizontal_load_tests: Vec<BoreholeHorizontalLoadTest210>,
127    #[serde(default, rename = "透水試験")]
128    pub permeability_tests: Vec<PermeabilityTest210>,
129    #[serde(default, rename = "P波試験")]
130    pub p_wave_tests: Vec<PWaveTest210>,
131    #[serde(default, rename = "S波試験")]
132    pub s_wave_tests: Vec<SWaveTest210>,
133    #[serde(default, rename = "その他原位置試験")]
134    pub other_in_situ_tests: Vec<OtherInSituTest210>,
135    #[serde(default, rename = "試料採取")]
136    pub sample_collections: Vec<SampleCollection210>,
137    #[serde(default, rename = "地盤材料の工学的分類")]
138    pub ground_material_classifications: Vec<GroundMaterialClassification210>,
139    #[serde(default, rename = "地質時代")]
140    pub geological_ages: Vec<GeologicalAge300>, // v3.00で構造変更
141    #[serde(default, rename = "地層岩体区分")]
142    pub stratum_rock_classifications: Vec<StratumRockClassification210>,
143    #[serde(default, rename = "孔内水位")]
144    pub borehole_water_levels: Vec<BoreholeWaterLevel210>,
145    #[serde(default, rename = "掘削工程")]
146    pub drilling_processes: Vec<DrillingProcess210>,
147    #[serde(default, rename = "孔径孔壁保護")]
148    pub borehole_diameter_protections: Vec<BoreholeDiameterProtection210>,
149    #[serde(default, rename = "掘進速度")]
150    pub drilling_speeds: Vec<DrillingSpeed210>,
151    #[serde(default, rename = "コアチューブビット")]
152    pub core_tube_bits: Vec<CoreTubeBit210>,
153    #[serde(default, rename = "給圧条件")]
154    pub pressure_conditions: Vec<PressureCondition210>,
155    #[serde(default, rename = "回転数")]
156    pub rotation_speeds: Vec<RotationSpeed210>,
157    #[serde(default, rename = "送水条件")]
158    pub water_supply_conditions: Vec<WaterSupplyCondition210>,
159    #[serde(default, rename = "断層破砕帯区分")]
160    pub fault_fracture_zone_classifications: Vec<FaultFractureZoneClassification210>,
161    #[serde(default, rename = "コア採取率")]
162    pub core_recovery_rates: Vec<CoreRecoveryRate300>, // v3.00で内部フィールドがオプション化
163    #[serde(default, rename = "最大コア長")]
164    pub maximum_core_lengths: Vec<MaximumCoreLength300>, // v3.00で内部フィールドがオプション化
165    #[serde(default, rename = "RQD")]
166    pub rqds: Vec<RQD210>,
167    #[serde(default, rename = "岩級区分判定表")]
168    pub rock_class_classification_table: Vec<RockClassClassificationTable210>,
169    #[serde(default, rename = "岩級区分")]
170    pub rock_class_classifications: Vec<RockClassClassification300>, // v3.00で内部フィールドがオプション化
171    #[serde(default, rename = "保孔管")]
172    pub casing_pipes: Vec<CasingPipe210>,
173    #[serde(default, rename = "計測機器")]
174    pub measuring_instruments: Vec<MeasuringInstrument210>,
175    #[serde(default, rename = "地下水検層試験")]
176    pub groundwater_logging_tests: Vec<GroundwaterLoggingTest210>,
177    #[serde(default, rename = "地下水検層試験詳細データ")]
178    pub groundwater_logging_test_details: Vec<GroundwaterLoggingTestDetail210>,
179    #[serde(default, rename = "地下水検層試験判定結果")]
180    pub groundwater_logging_test_results: Vec<GroundwaterLoggingTestResult210>,
181    #[serde(default, rename = "備考")]
182    pub remarks: Vec<Remark210>,
183    #[serde(default, rename = "フリー情報")]
184    pub free_info: Vec<FreeInfo>,
185}
186
187// ============================================================================
188// 岩石土区分 - v3.00で大きく構造変更
189// DTD: <!ELEMENT 岩石土区分 (岩石土区分_下端深度, 岩石土区分_岩石土名,
190//      岩石土区分_岩石土記号?, 岩石土区分_岩石群+)>
191// ============================================================================
192
193#[derive(Debug, Serialize, Deserialize)]
194pub struct RockSoilClassification300 {
195    #[serde(rename = "岩石土区分_下端深度")]
196    pub depth: Option<String>,
197    #[serde(rename = "岩石土区分_岩石土名")]
198    pub rock_soil_name: Option<String>,
199    #[serde(default, rename = "岩石土区分_岩石土記号")]
200    pub rock_soil_symbol: Option<String>,
201    #[serde(rename = "岩石土区分_岩石群")] // + (1回以上)
202    pub rock_groups: Vec<RockGroup300>,
203}
204
205// ============================================================================
206// 岩石土区分_岩石群
207// DTD: <!ELEMENT 岩石土区分_岩石群 (岩石土区分_岩石群コード, 岩石土区分_岩石土コード+)>
208// ============================================================================
209
210#[derive(Debug, Serialize, Deserialize)]
211pub struct RockGroup300 {
212    #[serde(rename = "岩石土区分_岩石群コード")]
213    pub rock_group_code: Option<String>,
214    #[serde(rename = "岩石土区分_岩石土コード")] // + (1回以上)
215    pub rock_soil_codes: Vec<RockSoilCode300>,
216}
217
218// ============================================================================
219// 岩石土区分_岩石土コード
220// DTD: <!ELEMENT 岩石土区分_岩石土コード (岩石土区分_岩相?, 岩石土区分_岩石?,
221//      岩石土区分_変成岩岩相?, 岩石土区分_変成岩岩石?)>
222// ============================================================================
223
224#[derive(Debug, Serialize, Deserialize)]
225pub struct RockSoilCode300 {
226    #[serde(default, rename = "岩石土区分_岩相")]
227    pub lithofacies: Option<String>,
228    #[serde(default, rename = "岩石土区分_岩石")]
229    pub rock: Option<String>,
230    #[serde(default, rename = "岩石土区分_変成岩岩相")]
231    pub metamorphic_rock_lithofacies: Option<String>,
232    #[serde(default, rename = "岩石土区分_変成岩岩石")]
233    pub metamorphic_rock: Option<String>,
234}
235
236// ============================================================================
237// 地質時代 - v3.00で構造変更
238// DTD: <!ELEMENT 地質時代 (地質時代_上端深度, 地質時代_下端深度, 地質時代_地質時代名,
239//      地質時代_形成年代上限?, 地質時代_形成年代下限?, 地質時代_変成年代上限?, 地質時代_変成年代下限?)>
240// ============================================================================
241
242#[derive(Debug, Serialize, Deserialize)]
243pub struct GeologicalAge300 {
244    #[serde(rename = "地質時代_上端深度")]
245    pub start_depth: Option<String>,
246    #[serde(rename = "地質時代_下端深度")]
247    pub end_depth: Option<String>,
248    #[serde(rename = "地質時代_地質時代名")] // v2.10の「地質時代_時代名」から変更
249    pub geological_age_name: Option<String>,
250    #[serde(default, rename = "地質時代_形成年代上限")] // v3.00で追加
251    pub formation_age_upper_limit: Option<String>,
252    #[serde(default, rename = "地質時代_形成年代下限")] // v3.00で追加
253    pub formation_age_lower_limit: Option<String>,
254    #[serde(default, rename = "地質時代_変成年代上限")] // v3.00で追加
255    pub metamorphic_age_upper_limit: Option<String>,
256    #[serde(default, rename = "地質時代_変成年代下限")] // v3.00で追加
257    pub metamorphic_age_lower_limit: Option<String>,
258}
259
260// ============================================================================
261// 硬軟区分 - v3.00で「硬軟区分_硬軟区分」がオプション化
262// DTD: <!ELEMENT 硬軟区分 (硬軟区分_下端深度, 硬軟区分_硬軟区分?)>
263// ============================================================================
264
265#[derive(Debug, Serialize, Deserialize)]
266pub struct HardnessClassification300 {
267    #[serde(rename = "硬軟区分_下端深度")]
268    pub depth: Option<String>,
269    #[serde(default, rename = "硬軟区分_硬軟区分")] // v3.00でオプション化
270    pub classification: Option<String>,
271}
272
273// ============================================================================
274// コア形状区分 - v3.00で「コア形状区分_コア形状区分」がオプション化
275// DTD: <!ELEMENT コア形状区分 (コア形状区分_下端深度, コア形状区分_コア形状区分?)>
276// ============================================================================
277
278#[derive(Debug, Serialize, Deserialize)]
279pub struct CoreShapeClassification300 {
280    #[serde(rename = "コア形状区分_下端深度")]
281    pub depth: Option<String>,
282    #[serde(default, rename = "コア形状区分_コア形状区分")] // v3.00でオプション化
283    pub classification: Option<String>,
284}
285
286// ============================================================================
287// 割れ目区分 - v3.00で「割れ目区分_割れ目区分」がオプション化
288// DTD: <!ELEMENT 割れ目区分 (割れ目区分_下端深度, 割れ目区分_割れ目区分?)>
289// ============================================================================
290
291#[derive(Debug, Serialize, Deserialize)]
292pub struct FractureClassification300 {
293    #[serde(rename = "割れ目区分_下端深度")]
294    pub depth: Option<String>,
295    #[serde(default, rename = "割れ目区分_割れ目区分")] // v3.00でオプション化
296    pub classification: Option<String>,
297}
298
299// ============================================================================
300// 風化区分 - v3.00で「風化区分_風化区分」がオプション化
301// DTD: <!ELEMENT 風化区分 (風化区分_下端深度, 風化区分_風化区分?)>
302// ============================================================================
303
304#[derive(Debug, Serialize, Deserialize)]
305pub struct WeatheringClassification300 {
306    #[serde(rename = "風化区分_下端深度")]
307    pub depth: Option<String>,
308    #[serde(default, rename = "風化区分_風化区分")] // v3.00でオプション化
309    pub classification: Option<String>,
310}
311
312// ============================================================================
313// 変質区分 - v3.00で「変質区分_変質区分」がオプション化
314// DTD: <!ELEMENT 変質区分 (変質区分_下端深度, 変質区分_変質区分?)>
315// ============================================================================
316
317#[derive(Debug, Serialize, Deserialize)]
318pub struct AlterationClassification300 {
319    #[serde(rename = "変質区分_下端深度")]
320    pub depth: Option<String>,
321    #[serde(default, rename = "変質区分_変質区分")] // v3.00でオプション化
322    pub classification: Option<String>,
323}
324
325// ============================================================================
326// コア採取率 - v3.00で「コア採取率_採取率」がオプション化
327// DTD: <!ELEMENT コア採取率 (コア採取率_下端深度, コア採取率_採取率?)>
328// ============================================================================
329
330#[derive(Debug, Serialize, Deserialize)]
331pub struct CoreRecoveryRate300 {
332    #[serde(rename = "コア採取率_下端深度")]
333    pub depth: Option<String>,
334    #[serde(default, rename = "コア採取率_採取率")] // v3.00でオプション化
335    pub recovery_rate: Option<String>,
336}
337
338// ============================================================================
339// 最大コア長 - v3.00で「最大コア長_コア長」がオプション化
340// DTD: <!ELEMENT 最大コア長 (最大コア長_下端深度, 最大コア長_コア長?)>
341// ============================================================================
342
343#[derive(Debug, Serialize, Deserialize)]
344pub struct MaximumCoreLength300 {
345    #[serde(rename = "最大コア長_下端深度")]
346    pub depth: Option<String>,
347    #[serde(default, rename = "最大コア長_コア長")] // v3.00でオプション化
348    pub core_length: Option<String>,
349}
350
351// ============================================================================
352// 岩級区分 - v3.00で「岩級区分_岩級区分」がオプション化
353// DTD: <!ELEMENT 岩級区分 (岩級区分_下端深度, 岩級区分_岩級区分?)>
354// ============================================================================
355
356#[derive(Debug, Serialize, Deserialize)]
357pub struct RockClassClassification300 {
358    #[serde(rename = "岩級区分_下端深度")]
359    pub depth: Option<String>,
360    #[serde(default, rename = "岩級区分_岩級区分")] // v3.00でオプション化
361    pub classification: Option<String>,
362}
363
364// ============================================================================
365// ClassificationInfo trait implementation
366// ============================================================================
367
368impl ClassificationInfo for RockSoilClassification300 {
369    fn rock_groups(&self) -> Vec<RockGroupInfo> {
370        self.rock_groups
371            .iter()
372            .map(|g| {
373                let code = g
374                    .rock_group_code
375                    .as_deref()
376                    .and_then(RockGroupCode::from_code)
377                    .unwrap_or(RockGroupCode::Single);
378
379                let constituents = g
380                    .rock_soil_codes
381                    .iter()
382                    .map(|c| Constituent::Coded {
383                        lithofacies: c.lithofacies.clone(),
384                        rock: c.rock.clone(),
385                        metamorphic_rock_lithofacies: c.metamorphic_rock_lithofacies.clone(),
386                        metamorphic_rock: c.metamorphic_rock.clone(),
387                    })
388                    .collect();
389
390                RockGroupInfo { code, constituents }
391            })
392            .collect()
393    }
394}