ageraustine commited on
Commit
3e2cadd
·
verified ·
1 Parent(s): d6b0b7a

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +26 -0
  2. README.md +547 -279
  3. datasets/bdcavites/cavite_localisee.geojson +3 -0
  4. datasets/bdcharm50/GEO050K_HARM_027.zip +3 -0
  5. datasets/bdcharm50/GEO050K_HARM_028.zip +3 -0
  6. datasets/bdcharm50/GEO050K_HARM_061.zip +3 -0
  7. datasets/bdcharm50/dept_027/Descriptif des cartes géologiques à 1_50 000 vecteur.pdf +3 -0
  8. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.dbf +0 -0
  9. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.lyr +0 -0
  10. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.prj +1 -0
  11. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.qml +2 -0
  12. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.shp +0 -0
  13. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.shx +0 -0
  14. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.dbf +3 -0
  15. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.lyr +0 -0
  16. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.prj +1 -0
  17. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.qml +2 -0
  18. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.shp +3 -0
  19. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.shx +3 -0
  20. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.dbf +0 -0
  21. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.lyr +0 -0
  22. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.prj +1 -0
  23. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.qml +2 -0
  24. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.shp +0 -0
  25. datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.shx +0 -0
  26. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.dbf +3 -0
  27. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.lyr +0 -0
  28. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.prj +1 -0
  29. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.qml +2 -0
  30. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.shp +3 -0
  31. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.shx +0 -0
  32. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.dbf +0 -0
  33. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.lyr +0 -0
  34. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.prj +1 -0
  35. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.qml +2 -0
  36. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.shp +0 -0
  37. datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.shx +0 -0
  38. datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.dbf +3 -0
  39. datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.lyr +3 -0
  40. datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.prj +1 -0
  41. datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.qml +2 -0
  42. datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.shp +3 -0
  43. datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.shx +0 -0
  44. datasets/bdcharm50/dept_028/Descriptif des cartes géologiques à 1_50 000 vecteur.pdf +3 -0
  45. datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.dbf +3 -0
  46. datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.lyr +0 -0
  47. datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.prj +1 -0
  48. datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.qml +2 -0
  49. datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.shp +3 -0
  50. datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.shx +0 -0
.gitattributes CHANGED
@@ -187,3 +187,29 @@ datasets/draft/era5_2009.nc filter=lfs diff=lfs merge=lfs -text
187
  datasets/draft/era5_2010.nc filter=lfs diff=lfs merge=lfs -text
188
  datasets/draft/era5_2011.nc filter=lfs diff=lfs merge=lfs -text
189
  datasets/draft/era5_2012.nc filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  datasets/draft/era5_2010.nc filter=lfs diff=lfs merge=lfs -text
188
  datasets/draft/era5_2011.nc filter=lfs diff=lfs merge=lfs -text
189
  datasets/draft/era5_2012.nc filter=lfs diff=lfs merge=lfs -text
190
+ datasets/bdcavites/cavite_localisee.geojson filter=lfs diff=lfs merge=lfs -text
191
+ datasets/bdcharm50/dept_027/Descriptif[[:space:]]des[[:space:]]cartes[[:space:]]géologiques[[:space:]]à[[:space:]]1_50[[:space:]]000[[:space:]]vecteur.pdf filter=lfs diff=lfs merge=lfs -text
192
+ datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.dbf filter=lfs diff=lfs merge=lfs -text
193
+ datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.shp filter=lfs diff=lfs merge=lfs -text
194
+ datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.shx filter=lfs diff=lfs merge=lfs -text
195
+ datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.dbf filter=lfs diff=lfs merge=lfs -text
196
+ datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.shp filter=lfs diff=lfs merge=lfs -text
197
+ datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.dbf filter=lfs diff=lfs merge=lfs -text
198
+ datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.lyr filter=lfs diff=lfs merge=lfs -text
199
+ datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.shp filter=lfs diff=lfs merge=lfs -text
200
+ datasets/bdcharm50/dept_028/Descriptif[[:space:]]des[[:space:]]cartes[[:space:]]géologiques[[:space:]]à[[:space:]]1_50[[:space:]]000[[:space:]]vecteur.pdf filter=lfs diff=lfs merge=lfs -text
201
+ datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.dbf filter=lfs diff=lfs merge=lfs -text
202
+ datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.shp filter=lfs diff=lfs merge=lfs -text
203
+ datasets/bdcharm50/dept_028/GEO050K_HARM_028_S_FGEOL_2154.dbf filter=lfs diff=lfs merge=lfs -text
204
+ datasets/bdcharm50/dept_028/GEO050K_HARM_028_S_FGEOL_2154.shp filter=lfs diff=lfs merge=lfs -text
205
+ datasets/bdcharm50/dept_061/Descriptif[[:space:]]des[[:space:]]cartes[[:space:]]géologiques[[:space:]]à[[:space:]]1_50[[:space:]]000[[:space:]]vecteur.pdf filter=lfs diff=lfs merge=lfs -text
206
+ datasets/bdcharm50/dept_061/GEO050K_HARM_061_L_FGEOL_2154.dbf filter=lfs diff=lfs merge=lfs -text
207
+ datasets/bdcharm50/dept_061/GEO050K_HARM_061_L_FGEOL_2154.shp filter=lfs diff=lfs merge=lfs -text
208
+ datasets/bdcharm50/dept_061/GEO050K_HARM_061_L_FGEOL_2154.shx filter=lfs diff=lfs merge=lfs -text
209
+ datasets/bdcharm50/dept_061/GEO050K_HARM_061_L_STRUCT_2154.dbf filter=lfs diff=lfs merge=lfs -text
210
+ datasets/bdcharm50/dept_061/GEO050K_HARM_061_L_STRUCT_2154.shp filter=lfs diff=lfs merge=lfs -text
211
+ datasets/bdcharm50/dept_061/GEO050K_HARM_061_P_DIVERS_2154.dbf filter=lfs diff=lfs merge=lfs -text
212
+ datasets/bdcharm50/dept_061/GEO050K_HARM_061_P_STRUCT_2154.dbf filter=lfs diff=lfs merge=lfs -text
213
+ datasets/bdcharm50/dept_061/GEO050K_HARM_061_S_FGEOL_2154.dbf filter=lfs diff=lfs merge=lfs -text
214
+ datasets/bdcharm50/dept_061/GEO050K_HARM_061_S_FGEOL_2154.lyr filter=lfs diff=lfs merge=lfs -text
215
+ datasets/bdcharm50/dept_061/GEO050K_HARM_061_S_FGEOL_2154.shp filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -13,8 +13,10 @@ pinned: true
13
 
14
  A physics-informed graph neural network that predicts streamflow (discharge,
15
  water level) at gauged and ungauged points along two Normandy rivers, La Eure
16
- and La Risle, treated as two separate surface-hydrology graphs with
17
- station-level covariates pulled from half a dozen independent data sources.
 
 
18
 
19
  ```mermaid
20
  flowchart LR
@@ -22,29 +24,31 @@ flowchart LR
22
  ades["ADES<br/>groundwater levels"]
23
  era5["Copernicus ERA5<br/>climate reanalysis"]
24
  otd["Open Topo Data<br/>station elevation"]
25
- brgm["BRGM<br/>IDPR"]
26
- bdtopo["IGN BD TOPO<br/>river centerline geometry"]
27
-
28
- hubeau --> loaders
29
- ades --> loaders
30
- era5 --> loaders
31
- otd --> loaders
32
- brgm --> loaders
33
- bdtopo --> loaders
34
-
35
- loaders["src/data/loaders/"] --> nf["node_features.py<br/>one row per station<br/>inputs kept separate from targets"]
36
- loaders --> bg["build_graph.py<br/>surface edges, ordered by<br/>real river course"]
37
-
38
- nf --> pyg
39
- bg --> pyg["build_pyg_graphs_per_basin"]
40
-
41
- pyg --> eure["La Eure graph"]
42
- pyg --> risle["La Risle graph"]
43
-
44
- eure --> app["src/app.py<br/>Streamlit explorer"]
45
- risle --> app
46
- eure --> testsuite["test_build_graph.py<br/>validation"]
47
- risle --> testsuite
 
 
48
  ```
49
 
50
  ---
@@ -53,20 +57,29 @@ flowchart LR
53
 
54
  ```
55
  PoC_v1/
56
- ├── scripts/ # one-off download / extraction scripts
57
  │ ├── download_hubeau.py # discharge + water level, Hub'Eau API v2
58
  │ ├── download_elevation.py # point elevations, Open Topo Data
59
  │ ├── download_era5_sample.py # ERA5 sanity-check pull (Jan 2020 only)
60
  │ ├── download_era5_full.py # ERA5 1960–2026, split instant/accum vars
61
  │ ├── extract_era5.py # unzips CDS API's zipped NetCDF output
62
- │ ├── download_catchment_area.py # Hub'Eau referentiel/sites -> surface_bv
63
  │ ├── download_bdtopo_hydro.py # IGN WFS -> tronçons, surfaces, catchments
64
  │ ├── analyze_bdtopo_hydro.py # centerline export + karst check
65
  │ ├── run_bdtopo_checks.py # karst + catchment cross-check, one shot
66
- ── cross_check_catchments.py # spatial join: station -> containing polygon
 
 
 
 
 
 
 
 
 
67
 
68
  ├── src/
69
- │ ├── app.py # Streamlit river explorer (main UI)
70
  │ ├── generate_plots.py # batch plot generation across all loaders
71
  │ ├── test_build_graph.py # graph-construction test/validation suite
72
  │ ├── extract_river_centerline.py # digitizes a traced map image into a centerline
@@ -76,7 +89,7 @@ PoC_v1/
76
  │ │ │ ├── base.py # BaseDataLoader — shared load()/get_metadata()
77
  │ │ │ ├── hydrometric.py # discharge & water level (Hub'Eau)
78
  │ │ │ ├── ades.py # groundwater levels (ADES)
79
- │ │ │ ├── safran.py # ERA5 reanalysis, interpolated to stations
80
  │ │ │ ├── idpr.py # infiltration/runoff tendency (BRGM)
81
  │ │ │ ├── catchment.py # per-station catchment area (Hub'Eau)
82
  │ │ │ ├── bdtopo_hydro.py # IGN BD TOPO hydrography (GeoJSON)
@@ -88,8 +101,10 @@ PoC_v1/
88
  │ │ └── river_centerline.py # real-centerline interpolation + gauge snapping
89
  │ │
90
  │ └── graph/
91
- │ ├── build_graph.py # surface edges + PyTorch Geometric conversion
92
- ── node_features.py # pulls every loader into one feature table
 
 
93
 
94
  ├── datasets/ # not checked in; populated by the scripts above
95
  │ ├── station_list.csv # raw station roster (X, Y, names, INSEE, etc.)
@@ -100,10 +115,13 @@ PoC_v1/
100
  │ ├── hydrometric/
101
  │ ├── safran/
102
  │ ├── bdtopo_hydro/
103
- ── centerlines/
 
 
 
104
  ```
105
 
106
- `scripts/` talks to the outside world (APIs, WFS);
107
  `src/` doesn't — nothing under `src/` makes a network call, and a script
108
  under `src/` that wants one is a bug. Most of `src/data/loaders/` predates
109
  the graph work — general-purpose readers/plotters for each dataset, with
@@ -115,82 +133,200 @@ way around.
115
  ## 2. The graph
116
 
117
  This is the part everything else in the repo exists to feed. Two graphs, one
118
- per river — `H4xx…` stations feed the La Eure graph (196 km of real BD TOPO
119
- course), `H6xx…` feed La Risle (150 km) — built with no edge between them,
120
- because there's no surface connection between the two basins to model.
121
 
122
- ![La Eure and its ADES wells, real BD TOPO course, elevation-colored gauges](docs/images/eure_overview.png)
 
 
 
 
 
 
123
 
124
- ![La Risle, same view — note the tight cluster of gauges around the karst bétoire stretch](docs/images/risle_full.png)
125
 
126
- ### 2.1 Nodes
127
 
128
- A node is one hydrometric station. The full feature set, as of the last
129
- `test_build_graph.py` run against real data, is 16 columns wide across all 27
130
- stations combined (15 per basin, once `basin_id` is dropped — see §2.3):
131
-
132
- | Feature | Source | What it is |
133
  |---|---|---|
134
- | `latitude`, `longitude` | `station_elevations.csv` | station coordinates |
135
- | `elevation_m` | Open Topo Data (`scripts/download_elevation.py`) | point elevation at the station |
136
- | `idpr_value` | BRGM IDPR | infiltration-vs-runoff tendency; direct ID join, not interpolated, for this dataset |
137
- | `avg_groundwater_level_m`, `avg_groundwater_depth_m` | ADES, radius-averaged | nearest-well groundwater condition |
138
- | `n_nearby_wells` | ADES | how many wells contributed to the average above — worth checking before trusting the groundwater value, since some stations have zero |
139
- | `climate_temp_C`, `climate_wind_speed_ms`, `climate_solar_Wm2`, `climate_precip_mm`, `climate_evap_mm`, `climate_snow_mm`, `climate_runoff_mm` | ERA5, interpolated to the station point | mean/sum over the record, by variable |
140
- | `avg_groundwater_level_m__was_missing`, `avg_groundwater_depth_m__was_missing`, (and similarly for any other feature with real gaps) | auto-generated | 1 if that station had no data for the column before mean-filling, 0 otherwise |
141
-
142
- `basin_id` is also computed but excluded from each per-basin graph's own
143
- feature set, since it's constant there and would just be a zero-variance
144
- column sitting in `x` for no reason.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
 
146
- **Targets are not features.** `target_discharge_m3s_mean/std/count` and
147
- `target_waterlevel_mm_mean/std/count` exist on the enriched table but never
148
- enter `x` — they're pulled out into `data.y` separately. A model that could
149
- see these as inputs would be reading the answer off the label, not learning
150
- anything.
 
151
 
152
- **The missingness flags aren't decorative.** A station with zero nearby wells
153
- gets its groundwater value silently filled with the basin mean without the
154
- flag, that looks identical to a station whose real groundwater level happens
155
- to be close to average. Given how unevenly some of these datasets cover the
156
- two basins (the Eure's southern reach has essentially no ADES wells within
157
- range at all), pretending "filled with the mean" and "actually near the mean"
158
- are the same thing would be a real information loss, not just tidiness.
159
 
160
- ### 2.2 Edges
 
 
161
 
162
- An edge is "these two gauges are consecutive along the river," in the
163
- direction water actually flows — upstream to downstream. Three attributes per
164
- edge:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
 
166
  | Feature | Meaning |
167
  |---|---|
168
- | `distance_km` | along-river distance between the two stations |
169
- | `elevation_drop_m` | elevation difference, upstream minus downstream (should be positive; negative would flag a real problem) |
170
- | `verified_continuous` | `False` for any edge deliberately flagged via `known_losing_reaches` |
171
-
172
- That last one exists because of a specific, real finding: two stations on La
173
- Risle are named *"[amont bétoire]"* and *"[aval bétoire]"* in Hub'Eau's own
174
- data *bétoire* being the Normandy term for a karst swallow-hole, where a
175
- river can vanish underground and resurface downstream. Three consecutive
176
- edges spanning that stretch (`H605641101 → H605022010 → H605641401 →
177
- H605641201`) are flagged `verified_continuous=False` rather than the graph
178
- silently assuming water flows continuously through a reach that might not
179
- carry it at the surface at all. An edge existing in this graph means "these
180
- stations are sequential along the mapped course," not "surface flow between
181
- them is guaranteed."
182
-
183
- Ordering within a basin comes from the station's position along the real
184
- digitized river course where one's available (both basins now have real BD
185
- TOPO-derived centerlines see §3.8), falling back to elevation or latitude
186
- otherwise. Every edge is built between *consecutive* stations in that order,
187
- which means each basin is currently a single chain, not a branching network.
188
- Tributaries aren't represented. That's the single biggest structural
189
- simplification in the graph as it stands see §6.
190
-
191
- ![La Risle, position at 50% along its 150 km real course, reading elevation and estimated groundwater level](docs/images/risle_detail.png)
192
-
193
- ### 2.3 Two graphs, not one
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
 
195
  `build_pyg_graphs_per_basin()` returns `{0: eure_graph, 1: risle_graph}`,
196
  each with its own local `0..n-1` node indexing, rather than one merged `Data`
@@ -200,26 +336,15 @@ PyTorch Geometric's own batching (`Batch.from_data_list`) expects a list of
200
  separate small graphs — building two graphs from the start matches that
201
  convention directly.
202
 
203
- ### 2.4 What actually goes into `x`
204
 
205
- `build_pyg_graph()` auto-detects feature columns from whatever table it's
206
- given, so it works whether that's the plain 4-column base table or the fully
207
- enriched one. Every column gets z-scored (mean 0, unit variance verified in
208
- `test_build_graph.py`, including a check that this used the same `ddof=1`
209
- convention as the pandas `.std()` call that actually does the standardizing,
210
- since numpy's default `ddof=0` gives a spuriously "wrong-looking" answer for
211
- small station counts that isn't actually a bug). Missingness flags, described
212
- above, get appended after standardization so they stay honest 0/1 values
213
- rather than being z-scored into something less interpretable.
214
-
215
- ### 2.5 What it looks like
216
-
217
- The Streamlit explorer (`src/app.py`) renders both graphs directly — real
218
- course geometry, gauges colored by elevation, ADES wells layered underneath
219
- for context. Clicking anywhere on the line resolves to the nearest gauge and
220
- pulls up its actual discharge/water-level/rating-curve plots:
221
-
222
- ![Clicking along La Risle resolves to the nearest gauge (H605022010, 1.7 km away) and shows its real water level record back to 1972](docs/images/station_timeseries.png)
223
 
224
  ---
225
 
@@ -230,18 +355,20 @@ materially affect what the data means.
230
 
231
  ### 3.1 Station roster (`station_list.csv`, `station_elevations.csv`)
232
 
233
- 27 stations across the two basins, split roughly by Hub'Eau code prefix
234
- (`H4xx…` for La Eure, `H6xx…` for La Risle this is a heuristic based on
235
- observed codes, not a documented rule, so it's worth re-checking if new
236
- stations show up outside that pattern). Elevation comes from Open Topo Data's
 
 
237
  `eudem25m` endpoint (`scripts/download_elevation.py`), queried per station
238
- coordinate — it's a point lookup, not a raster, so there's no slope or
239
- catchment information hiding in it.
240
 
241
  The row order in `station_list.csv` does **not** follow the river's course —
242
  verified directly, it jumps around in both latitude and elevation. Anything
243
  that needs upstream/downstream ordering has to derive it from elevation,
244
- latitude, or real centerline position; never from file order.
245
 
246
  Not every station in this list is actively gauged. Cross-referencing station
247
  names against the hydrometric data turned up three categories worth knowing
@@ -255,9 +382,10 @@ about:
255
  - Everything else with no data is unexplained from the name alone and worth a
256
  direct check on Hub'Eau's site before assuming it's just a gap.
257
 
258
- In total, **14 of the 27 stations have no discharge or water-level records at
259
- all** in the current Hub'Eau export. That's not a bug in the loader it's
260
- confirmed against the raw files, not just the merged table.
 
261
 
262
  ### 3.2 Hydrometric data (`hydrometric/`, via `scripts/download_hubeau.py`)
263
 
@@ -269,6 +397,15 @@ has `HIXnJ`/`HIXM` (water-level codes) sitting right alongside `QmnJ`
269
  down to its intended `grandeur` code explicitly (`QmnJ` from the discharge
270
  file, `HIXnJ` from the water-level file) rather than trusting the filename.
271
 
 
 
 
 
 
 
 
 
 
272
  Only 8 of the 27 stations have any `QmnJ` (daily mean discharge) rows at all.
273
  Several others report water level only. This isn't evenly distributed and
274
  matters a lot for anything downstream that assumes "gauged" means "has both
@@ -283,18 +420,28 @@ merges the levels file against the stations file on `code_bss` and renames
283
  `x`/`y` to `lon`/`lat` — those columns are already in degrees in this dataset,
284
  not a projected CRS, so no reprojection happens or is needed.
285
 
286
- Groundwater is used as a **station-level input covariate** (radius-averaged via
287
- `aggregate_to_stations`), not as a graph edge. Well proximity alone isn't
288
- sufficient grounds for a subsurface/karst connectivity edge between the two
289
- basins two wells being close together doesn't mean they're hydraulically
290
- connected. That would need either correlated well hydrographs over time or a
291
- shared BDLISA aquifer-unit code (the `groundwater_stations.csv` file has a
292
- `codes_bdlisa` column available for exactly this kind of check).
 
 
 
 
 
 
 
 
 
 
 
293
 
294
  Well coverage is not uniform across the two basins. The Eure's southern reach
295
  (south of roughly 48.68°N, toward Chartres) has essentially zero wells within
296
- range in this extract — any groundwater estimate south of there will come back
297
- empty, and that's a property of the source data, not a bug in the interpolation.
298
 
299
  ### 3.4 Climate (`safran/`, via `download_era5_sample.py` / `download_era5_full.py`)
300
 
@@ -305,107 +452,203 @@ instantaneous variables (temperature, wind) from accumulated ones
305
  (precipitation, evaporation, radiation, snowfall, runoff) at the API level —
306
  `download_era5_full.py` downloads each set separately per year and merges them,
307
  because the CDS API rejects mixed requests. The full pull spans 1960–2026 and
308
- is genuinely slow (a `time.sleep` and per-year retry loop is in there for a
309
- reason).
310
 
311
- `SAFRANLoader` interpolates the ERA5 grid to each station's coordinate
312
- (nearest or linear, configurable) rather than requiring stations to sit
313
- exactly on a grid cell this is standard practice for reanalysis data at
314
- 0.25° resolution, not an approximation specific to this project.
 
 
 
 
315
 
316
  ### 3.5 IDPR (`idpr.csv`)
317
 
318
  BRGM's *Indice de Développement et de Persistance des Réseaux* — an
319
  infiltration-vs-runoff tendency index, and the closest thing this project has
320
- to a real soil/drainage covariate. The actual file used here is already
321
- one row per station (`station_id` matching `station_code` exactly, verified
322
- 1:1 against all 27 stations, no duplicates, no nulls), not a raw spatial point
323
- cloud. `node_features.py` checks for this and does a direct ID join when
324
- possible rather than nearest-neighbor search nearest-neighbor is only the
325
- fallback path for a generic IDPR export that doesn't come pre-matched to
326
- stations.
327
-
328
- There is no soil texture, permeability, or hydraulic conductivity dataset in
329
- this project. IDPR is a tendency index, not a texture measurement — worth
330
- keeping that distinction in mind if it ever gets described as "soil data" in a
331
- writeup.
332
-
333
- ### 3.6 Catchment area (`catchment_area.csv`, via `scripts/download_catchment_area.py`)
334
-
335
- Hub'Eau publishes catchment (drainage basin) area on the **site** referentiel,
336
- not the station referentiel `surface_bv` on `hydrometrie/referentiel/sites`,
337
- in km². Since one site can have several stations, the download script does two
338
- passes: station → `code_site`, then `code_site` → `surface_bv`, and joins them
339
- back. 16 of 27 stations have a value; Hub'Eau simply doesn't publish this field
340
- for every site, and the missing ones correlate with the observer/SEBV stations
341
- from §3.1 but aren't identical to that set.
342
-
 
 
 
343
  This number is **cumulative** — the total catchment area draining to that
344
- point, all the way to the source. That distinction matters once you bring BD
345
- TOPO into the picture (§3.7), because BD TOPO's catchment polygons are the
346
- opposite: incremental, reach-by-reach areas. Comparing the two directly without
347
- accounting for that gives area ratios that look like measurement error but
348
- aren't a spatial join between the 27 stations and the 135 BD TOPO polygons
349
- gave ratios from about 0.015 near the river mouth up to 0.67 near the source,
350
- which is exactly the pattern you'd expect from cumulative-vs-incremental, not
351
- a data quality problem.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
352
 
353
  ### 3.7 BD TOPO hydrography (`bdtopo_hydro/`, via `scripts/download_bdtopo_hydro.py`)
354
 
355
  IGN's BD TOPO / BD TOPAGE hydrographic network, pulled from the Geoplateforme
356
  WFS (`https://data.geopf.fr/wfs`) rather than downloaded as a national bulk
357
  file — the download script queries a bounding box around the two basins
358
- instead. Three layers, all scoped to that bbox:
359
-
360
- - `troncon_hydrographique.geojson` — river centerline reaches. 30,045 features
361
- in the current pull, which sounds like a lot for two rivers because it
362
- includes every stream, ditch, and canal in the box, not just the Eure and
363
- Risle.
 
 
364
  - `surface_hydrographique.geojson` — hydrographic surfaces, including a
365
  `Nature` attribute that's supposed to flag karst-influenced reaches. IGN
366
- documents this attribute as **provisional and incomplete** — filled in with
367
- a limited, sometimes-default set of values pending refinement by the water
368
- agencies. A negative karst search here is not strong evidence of anything;
369
- it may just mean that stretch hasn't been annotated yet.
370
  - `bassin_versant_topographique.geojson` — catchment polygons, incremental
371
- (see §3.6). 135 polygons in the current bbox.
372
-
373
- **WFS axis order**: when a `BBOX` parameter's CRS is given via the URN form
374
- (`urn:ogc:def:crs:EPSG::4326`), the OGC spec requires latitude, longitude axis
375
- order — the opposite of the lon,lat order most GIS tools use by default.
376
- Getting this backwards doesn't raise an error; it silently matches zero real
377
- features, which looks identical to "no data in this area." `download_bdtopo_hydro.py`
378
- tries lon,lat first and automatically retries with the axes swapped if that
379
- comes back empty — for this project's bounding box, lat,lon is the order that
380
- returns real data.
381
-
382
- **Z-coordinate in tronçon geometry**: `troncon_hydrographique` geometries
383
- carry a third coordinate real altitude at every vertex — not just lon/lat.
384
- Code handling this data needs to account for 3D coordinates explicitly (e.g.
385
- slicing to the first two values before building a 2-column DataFrame from
386
- `geometry.coords`). This altitude data doubles as a genuinely useful
387
- fine-grained elevation profile along the river, denser than anything
388
- derivable from the 27 gauge points alone (`BDTopoHydroLoader.get_elevation_profile`).
 
 
 
 
 
389
 
390
  **The bétoire finding**: two stations in the roster are explicitly named
391
  *"[amont bétoire]"* and *"[aval bétoire]"* in Hub'Eau's own site names —
392
- *bétoire* being the Normandy dialect term for a karst swallow-hole. That's
393
- independent, deliberate naming from the data provider, not a guess. It's the
394
- strongest evidence in this project for a real losing reach on La Risle around
395
- Grosley-sur-Risle/Ajou (`H605641101` `H605641201`), even though the BD TOPO
396
- karst layer doesn't currently confirm it (see the provisional-attribute note
397
- above). `build_surface_edges`'s `known_losing_reaches` parameter exists
398
- specifically for this the current recommendation is to flag all three edges
399
- spanning that stretch as `verified_continuous=False`, not just guess at one.
400
-
401
- Also worth knowing: filtering the 30,045 tronçons down to a named river and
402
- building a graph from their endpoints does **not** give one connected line.
403
- For "Risle," 1,195 name-matched tronçons split into 132 disconnected
404
- components; the extraction keeps only the largest. That's a real topology gap
405
- in the source data (tile boundaries, tributaries sharing a base name without
406
- literally connecting), not a bug in the graph-walking code.
407
-
408
- ### 3.8 Centerline generation
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
409
 
410
  `centerlines/eure_centerline.csv` and `centerlines/risle_centerline.csv` — the
411
  geometry `build_surface_edges` orders stations against — are generated by
@@ -433,80 +676,82 @@ vector source isn't available, not the method used for the current
433
 
434
  ## 4. Applications
435
 
436
- Click-to-explore UI over the river network (`src/app.py`, Streamlit): pick a
 
 
437
  river, click (or slide) along its course, see interpolated elevation,
438
  estimated groundwater level, and — for whichever real gauge is nearest that
439
  point — water level, discharge, and rating-curve plots pulled directly from
440
  `HydrometricLoader`'s own plotting methods rather than reimplemented.
441
 
442
  Click support uses Streamlit's native chart-selection
443
- (`st.plotly_chart(..., on_select="rerun")`, requires `plotly` alongside
444
- `streamlit`), not a third-party click-handling package. The click handler and
445
- the position slider share a single source of truth by design: Streamlit only
446
- honors a slider's `value=` argument the first time that widget is created, and
447
- on every later rerun returns whatever's stored under that widget's own
448
- session-state key — so the click handler writes directly into the slider's
449
- own key before it's instantiated, rather than a separate key, keeping the two
450
- controls in sync. It also de-duplicates incoming click events, since
451
  Streamlit's chart-selection state persists across reruns caused by *other*
452
- widgets and would otherwise re-fire on every unrelated interaction, not just
453
- the click that caused it.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
454
 
455
  ---
456
 
457
  ## 5. Testing (`src/test_build_graph.py`)
458
 
459
- Not a unit test suite in the pytest sense — a single script that runs the full
460
- `node_features build_surface_edges build_pyg_graph(s)` pipeline against
461
- real data under `--data-root` and checks the result is actually sane: no
462
- NaN/Inf in the feature tensor, no accidental cross-basin edges, targets
463
- genuinely excluded from the model input, edge indices within bounds,
464
- bidirectional edge count exactly double the directed count, per-basin node
465
- counts summing to the combined total, standardized features actually landing
466
- near zero mean / unit variance, and the `known_losing_reaches` flag actually
467
- taking effect on the edge it's supposed to.
468
-
469
- It also prints mean/max `snap_distance_km` per basin against whatever
470
- centerline is currently in `centerlines/` — this is the number that would
471
- catch "one basin got a real BD TOPO centerline and the other is still on the
472
- old digitized approximation" without anyone having to notice by eye. As of the
473
- last run, that threshold is deliberately loose (2 km) so it won't hard-fail on
474
- a legitimately-imperfect-but-usable centerline; it's a reported number to
475
- watch, not yet an enforced standard. Worth tightening once both basins are on
476
- real geometry.
477
-
478
- Exits 0 on a clean pass, 1 otherwise, so it's usable as a pre-commit or CI
479
- gate if that's ever set up.
480
-
481
- ---
482
-
483
- ## 6. Known limitations and open questions
484
-
485
- - **Each basin is modeled as a single chain, not a branching network.** Tributaries
486
- aren't represented. Fixing this means pulling BD TOPO's confluence-node
487
- layer and reworking `build_surface_edges`'s core assumption, not a small
488
- patch.
489
- - **The karst losing-reach flag is based on naming evidence, not a confirmed
490
- BD TOPO classification.** The provisional state of the `Nature` attribute
491
- means this may firm up (or not) as IGN's data matures — it's not something
492
- this project can resolve unilaterally.
493
- - **Catchment area exists in two incompatible forms** (Hub'Eau cumulative vs.
494
- BD TOPO incremental) and nothing currently derives a true independent
495
- cumulative catchment from BD TOPO alone by summing incremental polygons
496
- upstream of each gauge. Doable, not done.
497
- - **13 of 27 stations have some hydrometric data; 8 have discharge
498
- specifically.** Any model trained on discharge as a target has a real,
499
- uneven gauge-density problem to contend with, not just a "some nodes are
500
- unlabeled" abstraction.
501
- - **No true soil or permeability dataset.** IDPR is a tendency index, useful
502
- but not a substitute.
503
- - **The groundwater-well BDLISA aquifer-unit field is unused.** If a
504
- subsurface connectivity edge is ever justified with real evidence rather
505
- than proximity, this is the first place to look.
506
 
507
  ---
508
 
509
- ## 7. Running things
510
 
511
  Data acquisition (from repo root, in roughly dependency order):
512
 
@@ -515,12 +760,35 @@ python -m scripts.download_hubeau
515
  python -m scripts.download_elevation
516
  python -m scripts.download_era5_full # slow; download_era5_sample.py first if just testing
517
  python -m scripts.extract_era5
518
- python -m scripts.download_catchment_area
519
  python -m scripts.download_bdtopo_hydro --check # verify typeNames before the real pull
520
  python -m scripts.download_bdtopo_hydro
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
521
  ```
522
 
523
- Validate the graph pipeline against whatever's actually in `datasets/`:
524
 
525
  ```bash
526
  python -m src.test_build_graph --data-root datasets
 
13
 
14
  A physics-informed graph neural network that predicts streamflow (discharge,
15
  water level) at gauged and ungauged points along two Normandy rivers, La Eure
16
+ and La Risle each modeled as a real reach-based network (confluences,
17
+ braided splits/rejoins, ~4,500 nodes per basin including virtual infill
18
+ points), not a single chain of gauges, with covariates pulled from nine
19
+ independent data sources.
20
 
21
  ```mermaid
22
  flowchart LR
 
24
  ades["ADES<br/>groundwater levels"]
25
  era5["Copernicus ERA5<br/>climate reanalysis"]
26
  otd["Open Topo Data<br/>station elevation"]
27
+ brgm["BRGM<br/>IDPR · BD Charm-50 geology"]
28
+ bdtopo["IGN BD TOPO<br/>real reach topology + catchment polygons"]
29
+ bdcav["Géorisques<br/>BDCavités (sinkholes)"]
30
+ wc["ESA WorldCover<br/>landcover · NDVI"]
31
+
32
+ bdtopo --> brg["build_reach_graph.py<br/>real confluences, splits/rejoins,<br/>gauge snapping"]
33
+ brg --> brgs["build_reach_graphs.py<br/>~4,500 nodes/basin"]
34
+
35
+ hubeau --> nf
36
+ ades --> nf
37
+ era5 --> nf
38
+ otd --> nf
39
+ brgm --> nf
40
+ bdcav --> nf
41
+ wc --> nf
42
+ brgs --> nf["node_features.py /<br/>enrich_reach_graph.py<br/>date-filtered 2013-2026"]
43
+
44
+ bdtopo --> cc["compute_cumulative_catchment.py<br/>graph-wide catchment area"]
45
+ cc --> nf
46
+
47
+ nf --> pyg["build_pyg_graph<br/>x_static / x_dynamic split"]
48
+ pyg --> phys["physics_losses.py<br/>confluence · split-rejoin ·<br/>routing · water balance"]
49
+
50
+ pyg --> app["src/app.py<br/>Streamlit explorer +<br/>network validation view"]
51
+ pyg --> testsuite["test_build_graph.py<br/>validation"]
52
  ```
53
 
54
  ---
 
57
 
58
  ```
59
  PoC_v1/
60
+ ├── scripts/ # one-off download / extraction / build scripts
61
  │ ├── download_hubeau.py # discharge + water level, Hub'Eau API v2
62
  │ ├── download_elevation.py # point elevations, Open Topo Data
63
  │ ├── download_era5_sample.py # ERA5 sanity-check pull (Jan 2020 only)
64
  │ ├── download_era5_full.py # ERA5 1960–2026, split instant/accum vars
65
  │ ├── extract_era5.py # unzips CDS API's zipped NetCDF output
66
+ │ ├── download_catchment.py # Hub'Eau referentiel/sites -> surface_bv
67
  │ ├── download_bdtopo_hydro.py # IGN WFS -> tronçons, surfaces, catchments
68
  │ ├── analyze_bdtopo_hydro.py # centerline export + karst check
69
  │ ├── run_bdtopo_checks.py # karst + catchment cross-check, one shot
70
+ ── cross_check_catchments.py # spatial join: station -> containing polygon
71
+ │ ├── build_reach_graphs.py # real reach-based topology, both basins
72
+ │ ├── enrich_reach_graph.py # runs node_features.py against the reach graph
73
+ │ ├── compute_cumulative_catchment.py # graph-wide catchment area from BD TOPO polygons
74
+ │ ├── diagnose_confluences.py # verify real vs. artifact confluences
75
+ │ ├── download_bdcavites.py # Géorisques BDCavités (sinkhole/cavity inventory)
76
+ │ ├── download_bdcharm.py # BRGM BD Charm-50 harmonized geology, per department
77
+ │ ├── fetch_idpr_brgm.py # (unused — see §3.5) live IDPR re-fetch attempt
78
+ │ ├── fetch_landcover.py # ESA WorldCover landcover class, real gauges
79
+ │ └── fetch_worldcover_ndvi.py # ESA WorldCover NDVI percentile composite
80
 
81
  ├── src/
82
+ │ ├── app.py # Streamlit river explorer + network validation view
83
  │ ├── generate_plots.py # batch plot generation across all loaders
84
  │ ├── test_build_graph.py # graph-construction test/validation suite
85
  │ ├── extract_river_centerline.py # digitizes a traced map image into a centerline
 
89
  │ │ │ ├── base.py # BaseDataLoader — shared load()/get_metadata()
90
  │ │ │ ├── hydrometric.py # discharge & water level (Hub'Eau)
91
  │ │ │ ├── ades.py # groundwater levels (ADES)
92
+ │ │ │ ├── safran.py # ERA5 reanalysis, vectorized station interpolation
93
  │ │ │ ├── idpr.py # infiltration/runoff tendency (BRGM)
94
  │ │ │ ├── catchment.py # per-station catchment area (Hub'Eau)
95
  │ │ │ ├── bdtopo_hydro.py # IGN BD TOPO hydrography (GeoJSON)
 
101
  │ │ └── river_centerline.py # real-centerline interpolation + gauge snapping
102
  │ │
103
  │ └── graph/
104
+ │ ├── build_graph.py # PyG conversion: x_static/x_dynamic split, structural columns
105
+ ── build_reach_graph.py # real reach topology: confluences, splits/rejoins, MultiDiGraph
106
+ │ ├── node_features.py # pulls every loader into one feature table
107
+ │ └── physics_losses.py # confluence/split-rejoin/routing/water-balance loss terms
108
 
109
  ├── datasets/ # not checked in; populated by the scripts above
110
  │ ├── station_list.csv # raw station roster (X, Y, names, INSEE, etc.)
 
115
  │ ├── hydrometric/
116
  │ ├── safran/
117
  │ ├── bdtopo_hydro/
118
+ ── bdcavites/
119
+ │ ├── bdcharm50/
120
+ │ ├── centerlines/
121
+ │ └── reach_graph/ # {eure,risle}_{nodes,edges}.csv, _nodes_enriched.csv
122
  ```
123
 
124
+ `scripts/` talks to the outside world (APIs, WFS, S3);
125
  `src/` doesn't — nothing under `src/` makes a network call, and a script
126
  under `src/` that wants one is a bug. Most of `src/data/loaders/` predates
127
  the graph work — general-purpose readers/plotters for each dataset, with
 
133
  ## 2. The graph
134
 
135
  This is the part everything else in the repo exists to feed. Two graphs, one
136
+ per river — `H4xx…` stations feed the La Eure graph, `H6xx…` feed La Risle
137
+ built with no edge between them, because there's no surface connection
138
+ between the two basins to model.
139
 
140
+ The graph is now built from **real reach topology**, not a single ordered
141
+ chain of gauges. `build_reach_graph.py` constructs it directly from BD TOPO's
142
+ own tronçon-to-node linkage (`lien_vers_noeud_hydrographique_ini/fin`) — the
143
+ NEXT_DOWN-equivalent approach — rather than inferring station order from
144
+ position along a digitized line. That means real branching, real confluences,
145
+ and real braided-channel structure fall directly out of the data instead of
146
+ needing to be modeled separately.
147
 
148
+ ### 2.1 Node types
149
 
150
+ Four kinds of node, not one:
151
 
152
+ | Type | What it is | Column |
 
 
 
 
153
  |---|---|---|
154
+ | Real gauge | one of the 27 hydrometric stations | `is_gauged` |
155
+ | Real confluence | a genuinely different, independently-sourced river joins | `is_confluence` |
156
+ | Split / rejoin | a channel divides and later recombines (braiding, an anabranch) — same water, no new mass | `is_split_point` / `is_rejoin_point`, paired via `braid_id` |
157
+ | Virtual (infill) | inserted along long confluence-free stretches so "predict at any point" has real spatial resolution | none of the above |
158
+
159
+ A **confluence** requires more than a shared node with in-degree 2 BD
160
+ TOPO's fine tronçon segmentation produces plenty of same-river multi-inflow
161
+ points with no real branching involved (confirmed against real data:
162
+ incoming-edge distances as short as 4.6 m at some falsely-flagged
163
+ "confluences"). The real test (`find_real_confluences` in
164
+ `build_reach_graph.py`) requires (a) more than one distinct *normalized* river
165
+ name among the incoming edges — river-name normalization strips articles,
166
+ parenthetical qualifiers, and "bras de/du/d'" (arm-of) prefixes, since a named
167
+ secondary channel of the same river ("Bras de la Charentonne") isn't a
168
+ different river — and (b) that those branches don't trace back to a common
169
+ upstream **split** within 15 km, which would mean it's a rejoin, not a
170
+ confluence. Splits themselves need no such disambiguation: out-degree ≥ 2 is
171
+ an unambiguous physical definition on its own, since a split by construction
172
+ has exactly one thing flowing in.
173
+
174
+ Real branching topology also meant the underlying graph had to move from a
175
+ plain `DiGraph` to a `MultiDiGraph` — two distinct tronçons directly
176
+ connecting the same two hydrographic nodes (exactly the shape a short braid
177
+ takes) is real data, not a collision, and a plain `DiGraph` was silently
178
+ **overwriting** the second such edge's data on `add_edge` rather than keeping
179
+ both. Confirmed as a real bug with real impact, not just a synthetic-test
180
+ concern: fixing it recovered dozens of previously-invisible parallel edges
181
+ per basin on the actual data.
182
+
183
+ ### 2.2 Node and edge features
184
+
185
+ The feature set now spans several independent sources, each merged onto the
186
+ node table by `node_features.py`'s `add_*_features` functions. Every column
187
+ lands in exactly one of four places once `build_pyg_graph` processes it:
188
 
189
+ ```mermaid
190
+ flowchart TD
191
+ raw["Enriched node table<br/>(node_features.py)"]
192
+
193
+ raw --> struct{"structural /<br/>graph-role column?"}
194
+ struct -->|"is_gauged, is_confluence,<br/>is_split_point, is_rejoin_point,<br/>braid_id, snap_distance_km"| structout["data.is_gauged, data.is_confluence, ...<br/>own Data attribute — never in x"]
195
 
196
+ raw --> tgt{"target_* column?"}
197
+ tgt -->|"target_discharge_m3s_*<br/>target_waterlevel_mm_*"| y["data.y<br/>never in xlabel leakage otherwise"]
 
 
 
 
 
198
 
199
+ raw --> feat{"real model input"}
200
+ feat -->|"static: elevation_m, idpr_*,<br/>catchment_area_km2, landcover_*,<br/>geology_*, cavites distance/count"| xstatic["data.x_static"]
201
+ feat -->|"dynamic: climate_*,<br/>avg_groundwater_*, ndvi_*<br/>(period-aggregate, not a real series yet)"| xdynamic["data.x_dynamic"]
202
 
203
+ xstatic --> x["data.x full combined tensor,<br/>z-scored"]
204
+ xdynamic --> x
205
+
206
+ edges["Edge table<br/>(build_reach_graph_tables)"] --> eattr{"numeric edge<br/>attribute?"}
207
+ eattr -->|"distance_km,<br/>elevation_drop_m,<br/>verified_continuous"| edgeattr["data.edge_attr<br/>[n_edges, 3]"]
208
+ eattr -->|"toponym, cleabs<br/>(diagnostic metadata)"| meta["not used by build_pyg_graph —<br/>stays in edges_df only"]
209
+ ```
210
+
211
+ **Node features:**
212
+
213
+ | Feature | Source | Coverage |
214
+ |---|---|---|
215
+ | `latitude`, `longitude`, `elevation_m` | station coords / real BD TOPO tronçon Z | every node |
216
+ | `idpr_value`, `idpr_nearest_point_distance` | BRGM IDPR | every node (spatial fallback for non-gauge codes) |
217
+ | `catchment_area_km2` | Hub'Eau, cumulative, real gauges only | 27 stations |
218
+ | `cumulative_catchment_area_km2` | BD TOPO incremental polygons, summed upstream via real graph topology | graph-wide (~98% of nodes) |
219
+ | `landcover_*` (one-hot) | ESA WorldCover 10 m classification | real gauges only, for now |
220
+ | `ndvi_p10`, `ndvi_p50`, `ndvi_p90` | ESA WorldCover NDVI percentile composite | real gauges only, for now |
221
+ | `geology_*` (one-hot) | BRGM BD Charm-50, point-in-polygon | real gauges only, for now |
222
+ | `distance_to_nearest_cavity_km`, `n_cavities_within_20km` | Géorisques BDCavités, KD-tree + haversine | real gauges only, for now |
223
+ | `avg_groundwater_level_m`, `avg_groundwater_depth_m`, `n_nearby_wells` | ADES, radius-averaged, KD-tree + exact haversine | every node |
224
+ | `climate_*` (temp/wind/solar/precip/evap/snow/runoff) | ERA5, vectorized station interpolation | every node (needs `safran_path`) |
225
+ | `{col}__was_missing` | auto-generated | any feature column with real gaps |
226
+
227
+ **Edge features** — three numeric attributes per edge, from
228
+ `build_reach_graph.py`'s `build_reach_graph_tables`:
229
 
230
  | Feature | Meaning |
231
  |---|---|
232
+ | `distance_km` | along-river distance between the two endpoint nodes |
233
+ | `elevation_drop_m` | elevation difference, upstream minus downstream negated on the reverse edge when `bidirectional=True` |
234
+ | `verified_continuous` | `False` for any edge deliberately flagged via `known_losing_reaches` (the bétoire stretch — §3.7) |
235
+
236
+ `toponym` and `cleabs` also live on the real edges table (the tronçon's river
237
+ name and unique BD TOPO ID) but are diagnostic metadata, not model input —
238
+ `build_pyg_graph` selects `edge_attr` columns by explicit name, so extra
239
+ columns like these pass through harmlessly rather than needing to be
240
+ stripped out first.
241
+
242
+ **Structural columns never enter `x`.** `is_gauged`, `is_confluence`,
243
+ `is_split_point`, `is_rejoin_point`, `snap_distance_km`, `braid_id` describe
244
+ node *role*, not a physical covariate `build_pyg_graph`'s auto-detection
245
+ excludes them explicitly (confirmed as a real, not hypothetical, bug once:
246
+ pandas treats `bool` as a numeric dtype, so without this exclusion these
247
+ columns were being silently z-scored and fed to the model as if they were
248
+ elevation or precipitation). They're still attached to the returned `Data`
249
+ object as their own typed attributes, for masking supervised loss to gauged
250
+ nodes and for the physics-loss index builders.
251
+
252
+ **Landcover and geology are one-hot, not a raw class code.** Both are
253
+ nominal categories (10 = Tree cover, 50 = Built-up; a geological formation
254
+ code), not an ordered quantity — leaving either as a raw integer would let
255
+ auto-detection z-score it as if one category were numerically "more" than
256
+ another, the same class of error as the structural-column bug, just subtler
257
+ since these *are* meant to be real model input.
258
+
259
+ **Targets are not features.** `target_discharge_m3s_mean/std/count` and
260
+ `target_waterlevel_mm_mean/std/count` exist on the enriched table but never
261
+ enter `x` — they're pulled out into `data.y` separately, and attach only to
262
+ real gauge rows (verified: gauge codes, BD TOPO hydrographic node IDs, and
263
+ virtual-node marker strings occupy structurally distinct namespaces, so a
264
+ left-merge on `station_code` can never mislabel a confluence or virtual node).
265
+
266
+ ### 2.3 Static vs. dynamic features
267
+
268
+ `build_pyg_graph` also splits every feature by physical temporal nature:
269
+
270
+ - **`data.x_static`** / **`data.static_feature_names`** — genuinely
271
+ time-invariant: elevation, IDPR, catchment area, landcover, coordinates.
272
+ - **`data.x_dynamic`** / **`data.dynamic_feature_names`** — physically
273
+ time-varying quantities: climate, groundwater level/depth, NDVI.
274
+
275
+ `data.x` remains the full combined tensor unchanged; the split is additional,
276
+ not a replacement. **Important limitation, stated plainly**: "dynamic" here
277
+ still means *one period-aggregated number per node* (mean/sum over the whole
278
+ date range, or a single well reading), not a real `[n_nodes, T]` time series.
279
+ The split makes the physical distinction explicit and gives a clean seam for
280
+ a future temporal pipeline to slot into, but building that pipeline — genuine
281
+ daily/whatever-resolution series per node, aligned across sources — is
282
+ separate, larger, unbuilt work. `physics_losses.py`'s `routing_consistency_loss`
283
+ specifically needs that real time dimension and has nothing to consume yet.
284
+
285
+ ### 2.4 Date-range filtering
286
+
287
+ `build_node_features`/`enrich_reach_graph.py` accept a `date_range` applied
288
+ to every time-varying source (groundwater, climate, hydrometric targets)
289
+ together, so all three describe the same period rather than each silently
290
+ aggregating over its own full, differently-shaped history (ADES wells
291
+ reporting from the 1970s to 2026 on wildly different schedules; ERA5 spanning
292
+ 1960–2026; hydrometric records with their own per-station ranges entirely).
293
+
294
+ Default: **2013-01-01 to 2026-12-31** — computed, not guessed, via a
295
+ brute-force interval-overlap check across all 8 discharge-gauged stations'
296
+ real date ranges. This is the window that maximizes simultaneous station
297
+ coverage: 6 of 8 stations, **8,923 real, quality-filtered observations**
298
+ (`code_qualification >= 16`, the same threshold `HydrometricLoader` itself
299
+ applies — a naive raw count that skips this filter gives 13,084, which is
300
+ what an earlier pass at this analysis originally reported before the
301
+ discrepancy was traced and corrected). Two stations (`H403301101`: 1969–1985,
302
+ `H605022010`: 1970–1980) are permanently excluded by any reasonable window —
303
+ a ~35–40 year dead gap separates them from every other station's record, so
304
+ including them would mean spanning six mostly-empty decades, not a genuine
305
+ improvement.
306
+
307
+ ### 2.5 Physics-informed loss terms (`physics_losses.py`)
308
+
309
+ Four constraints, each tied to real graph structure, not generic:
310
+
311
+ | Term | Constraint | Applies to |
312
+ |---|---|---|
313
+ | `confluence_mass_balance_loss` | `Q_confluence ≈ sum(Q_upstream_branches)` — new mass genuinely enters | `is_confluence` nodes |
314
+ | `split_rejoin_conservation_loss` | `Q_split ≈ Q_rejoin` — same water, no new mass | paired `braid_id` nodes |
315
+ | `routing_consistency_loss` | `Q_downstream[t] ≈ Q_upstream[t - lag]`, lag from real `distance_km`/slope | every edge (needs `[n_nodes, T]` — see §2.3) |
316
+ | `water_balance_loss` | `P - ET - Q - ΔS ≈ 0` in volume terms | nodes with `cumulative_catchment_area_km2` |
317
+
318
+ Confluence and split/rejoin are deliberately different constraints, not one
319
+ generic "conserve mass everywhere" rule — a model that only learned "sum the
320
+ inflows" would get a split/rejoin wrong, since a rejoin's two branches
321
+ together should equal the *split's* value, not add something new on top.
322
+ All four apply graph-wide, not just at the 27 labeled gauges — that's the
323
+ actual mechanism by which sparse supervision generalizes to the ~4,500
324
+ ungauged nodes, not an incidental detail. `ΔS` (storage change) defaults to
325
+ zero, a named steady-state approximation — this project has no direct
326
+ basin-wide storage measurement, only sparse well *levels*, which aren't the
327
+ same thing.
328
+
329
+ ### 2.6 Two graphs, not one
330
 
331
  `build_pyg_graphs_per_basin()` returns `{0: eure_graph, 1: risle_graph}`,
332
  each with its own local `0..n-1` node indexing, rather than one merged `Data`
 
336
  separate small graphs — building two graphs from the start matches that
337
  convention directly.
338
 
339
+ ### 2.7 What it looks like
340
 
341
+ The Streamlit explorer (`src/app.py`) has two views. "Explore" renders the
342
+ original click-to-read interface over real course geometry. "Network
343
+ validation" renders the full reach graph confluences as diamonds, gauges as
344
+ elevation-colored circles, every edge as one line trace regardless of edge
345
+ count (verified fast at real scale: 0.29s to build a figure for ~2,900
346
+ edges) specifically for visually confirming the topology looks like a real
347
+ river network before trusting it as model input.
 
 
 
 
 
 
 
 
 
 
 
348
 
349
  ---
350
 
 
355
 
356
  ### 3.1 Station roster (`station_list.csv`, `station_elevations.csv`)
357
 
358
+ 27 stations across the two basins, spanning three French departments
359
+ verified directly against the real roster: 12 in Eure (27), 10 in
360
+ Eure-et-Loir (28, the Eure's southern tributaries near Chartres/Dreux — Voise,
361
+ Drouette, and others), 2 in Orne (61). Split roughly by Hub'Eau code prefix
362
+ (`H4xx…` for La Eure, `H6xx…` for La Risle — a heuristic based on observed
363
+ codes, not a documented rule). Elevation comes from Open Topo Data's
364
  `eudem25m` endpoint (`scripts/download_elevation.py`), queried per station
365
+ coordinate — a point lookup, not a raster, so there's no slope or catchment
366
+ information hiding in it.
367
 
368
  The row order in `station_list.csv` does **not** follow the river's course —
369
  verified directly, it jumps around in both latitude and elevation. Anything
370
  that needs upstream/downstream ordering has to derive it from elevation,
371
+ latitude, or real centerline/graph position; never from file order.
372
 
373
  Not every station in this list is actively gauged. Cross-referencing station
374
  names against the hydrometric data turned up three categories worth knowing
 
382
  - Everything else with no data is unexplained from the name alone and worth a
383
  direct check on Hub'Eau's site before assuming it's just a gap.
384
 
385
+ Of the 8 stations with any `QmnJ` discharge data at all, only **6 have real
386
+ observations within the project's 2013–2026 date window** (§2.4)worth
387
+ knowing before assuming "8 gauged stations" translates directly into training
388
+ examples.
389
 
390
  ### 3.2 Hydrometric data (`hydrometric/`, via `scripts/download_hubeau.py`)
391
 
 
397
  down to its intended `grandeur` code explicitly (`QmnJ` from the discharge
398
  file, `HIXnJ` from the water-level file) rather than trusting the filename.
399
 
400
+ `HydrometricLoader` also filters on Hub'Eau's own `code_qualification` field,
401
+ keeping only `>= 16` (their "acceptable"/"good" threshold) and dropping lower-
402
+ quality/provisional readings. This is real and meaningful, not a rounding
403
+ detail — traced directly against the raw discharge file for the 2013–2026
404
+ window (§2.4): 13,084 raw `QmnJ` rows in range, of which 4,022 have
405
+ `code_qualification == 12` (below the threshold) and get correctly excluded,
406
+ leaving 8,923. Any manual read of the raw CSVs that skips this filter will
407
+ overcount real usable observations by close to a third.
408
+
409
  Only 8 of the 27 stations have any `QmnJ` (daily mean discharge) rows at all.
410
  Several others report water level only. This isn't evenly distributed and
411
  matters a lot for anything downstream that assumes "gauged" means "has both
 
420
  `x`/`y` to `lon`/`lat` — those columns are already in degrees in this dataset,
421
  not a projected CRS, so no reprojection happens or is needed.
422
 
423
+ `node_features.py`'s `add_groundwater_features` does **not** use
424
+ `ADESLoader.aggregate_to_stations` that method loops per station and does a
425
+ full haversine `.apply()` over the entire groundwater dataframe for each one.
426
+ At 27 stations against ~272k readings that's slow but tolerable; at the reach
427
+ graph's ~4,500 nodes it's over a billion row-wise Python calls, confirmed as a
428
+ genuine, not hypothetical, multi-hour hang. The fix (reduce to each well's
429
+ latest reading first, then a KD-tree coarse prefilter + exact haversine on the
430
+ small candidate set) turned out to also fix a real accuracy bug: the old
431
+ method required wells to share the *exact same reporting date* before
432
+ averaging, but real wells report on wildly different schedules (18 real
433
+ wells within 20 km of one station spanned 13 different "latest dates," one
434
+ from 1972) — silently discarding most real coverage every time.
435
+
436
+ Groundwater is used as a **station-level input covariate**, not as a graph
437
+ edge. Well proximity alone isn't sufficient grounds for a subsurface/karst
438
+ connectivity edge — that would need either correlated well hydrographs over
439
+ time or a shared BDLISA aquifer-unit code (`groundwater_stations.csv` has a
440
+ `codes_bdlisa` column available for exactly this kind of check; still unused).
441
 
442
  Well coverage is not uniform across the two basins. The Eure's southern reach
443
  (south of roughly 48.68°N, toward Chartres) has essentially zero wells within
444
+ range in this extract.
 
445
 
446
  ### 3.4 Climate (`safran/`, via `download_era5_sample.py` / `download_era5_full.py`)
447
 
 
452
  (precipitation, evaporation, radiation, snowfall, runoff) at the API level —
453
  `download_era5_full.py` downloads each set separately per year and merges them,
454
  because the CDS API rejects mixed requests. The full pull spans 1960–2026 and
455
+ is genuinely slow.
 
456
 
457
+ `SAFRANLoader` interpolates the ERA5 grid to every station **in one
458
+ vectorized xarray call per file**, not one `.sel()` + `.to_dataframe()` call
459
+ per station the per-station loop version does real per-call work (an index
460
+ lookup, then a full DataFrame conversion) that's tolerable at 27 stations
461
+ (~1,800 calls across ~67 year-files) but was confirmed to actually hang at the
462
+ reach graph's ~4,500 nodes (~193,000 calls). Vectorized indexing with
463
+ DataArray indexers sharing a `station` dimension does every station in one
464
+ call per file instead.
465
 
466
  ### 3.5 IDPR (`idpr.csv`)
467
 
468
  BRGM's *Indice de Développement et de Persistance des Réseaux* — an
469
  infiltration-vs-runoff tendency index, and the closest thing this project has
470
+ to a real soil/drainage covariate (see §3.9 for why it's standing in for soil
471
+ data specifically, not just conveniently similar). The file used here is
472
+ already one row per station (`station_id` matching `station_code` exactly,
473
+ verified 1:1 against all 27 stations), so `node_features.py` does a direct ID
474
+ join when possible rather than nearest-neighbor search, falling back to
475
+ spatial nearest-neighbor for any station code that isn't an exact match
476
+ (which is every non-gauge reach-graph node, and — a real, minor precision
477
+ trade-off worth knowing — every gauge too, once the table also contains
478
+ non-gauge codes, since the exact-match path requires the *entire* table to
479
+ match IDPR's station list).
480
+
481
+ A live re-fetch from BRGM's own geoservice (`scripts/fetch_idpr_brgm.py`,
482
+ `geoservices.brgm.fr/geologie`, `GetFeatureInfo` point queries against the
483
+ `IDPR_50M` raster layer) was attempted, to get fresher values and eventually
484
+ cover the full reach graph rather than just the 27 gauges. **It failed** in
485
+ testing and the project is currently using the original, already-uploaded
486
+ `idpr.csv` instead — not resolved further, since the existing file already
487
+ gives real, usable IDPR coverage for every gauge.
488
+
489
+ ### 3.6 Catchment area two independent sources
490
+
491
+ **Hub'Eau (`catchment_area.csv`, via `scripts/download_catchment.py`)**:
492
+ published on the **site** referentiel, not the station referentiel —
493
+ `surface_bv` on `hydrometrie/referentiel/sites`, in km². Since one site can
494
+ have several stations, the download script does two passes: station →
495
+ `code_site`, then `code_site` → `surface_bv`. 16 of 27 stations have a value.
496
  This number is **cumulative** — the total catchment area draining to that
497
+ point, all the way to the source.
498
+
499
+ **BD TOPO, graph-wide (`cumulative_catchment_area_km2`, via
500
+ `scripts/compute_cumulative_catchment.py`)**: sums BD TOPO's incremental
501
+ catchment polygons upstream of any node, via the real graph topology
502
+ distinct polygons counted once even when many nodes/edges share the same
503
+ coarse polygon (verified with a hand-computed test case specifically checking
504
+ this). Covers ~98% of nodes graph-wide, not just the 27 gauges — the actual
505
+ fix for the "confluences and virtual nodes have no catchment area at all" gap.
506
+
507
+ **Cross-checked against Hub'Eau's real values on real gauges — and there's a
508
+ real, identified bias, not a clean match.** Ratio (BD-TOPO-summed ÷ Hub'Eau)
509
+ runs from about 0.75 to 1.25 for smaller catchments (< ~800 km², plausibly
510
+ normal polygon-boundary/digitization precision) but drops to 0.75–0.89 for
511
+ the largest catchments (> ~3,500 km²) — a clean, monotonic pattern, not noise.
512
+ Most likely cause: **bounding-box truncation** — the original BD TOPO pull
513
+ bbox had only a 9.6 km margin on its southern edge (the tightest of all four
514
+ directions, and south is exactly where the Eure's longest upstream
515
+ tributaries run, toward Chartres/Dreux), not a safe margin for real watershed
516
+ extent. The bbox in `download_bdtopo_hydro.py` was widened afterward (from
517
+ `(0.3, 48.3, 1.7, 49.5)` to `(-0.1, 47.7, 2.1, 49.9)`, ~2.9x the area) — the
518
+ full `download_bdtopo_hydro.py → build_reach_graphs.py → enrich_reach_graph.py
519
+ → compute_cumulative_catchment.py` chain needs re-running against the wider
520
+ box to actually resolve this, which had not yet happened as of the last
521
+ verified run in this project.
522
 
523
  ### 3.7 BD TOPO hydrography (`bdtopo_hydro/`, via `scripts/download_bdtopo_hydro.py`)
524
 
525
  IGN's BD TOPO / BD TOPAGE hydrographic network, pulled from the Geoplateforme
526
  WFS (`https://data.geopf.fr/wfs`) rather than downloaded as a national bulk
527
  file — the download script queries a bounding box around the two basins
528
+ instead (see §3.6 for why that box was widened). Three layers, all scoped to
529
+ that bbox:
530
+
531
+ - `troncon_hydrographique.geojson` river centerline reaches, now the
532
+ primary source for graph *topology* too (§2), via `lien_vers_noeud_
533
+ hydrographique_ini/fin` and `sens_de_l_ecoulement`. Real per-vertex
534
+ altitude data doubles as a fine-grained elevation profile, denser than
535
+ anything derivable from the 27 gauge points alone.
536
  - `surface_hydrographique.geojson` — hydrographic surfaces, including a
537
  `Nature` attribute that's supposed to flag karst-influenced reaches. IGN
538
+ documents this attribute as **provisional and incomplete**.
 
 
 
539
  - `bassin_versant_topographique.geojson` — catchment polygons, incremental
540
+ (see §3.6).
541
+
542
+ **WFS axis order**: when a `BBOX` parameter's CRS is given via the URN form,
543
+ the OGC spec requires latitude, longitude axis order — the opposite of the
544
+ lon,lat order most GIS tools use by default. Getting this backwards doesn't
545
+ raise an error; it silently matches zero real features. `download_bdtopo_hydro.py`
546
+ and `scripts/download_bdcavites.py` both try lon,lat first and automatically
547
+ retry with the axes swapped if that comes back empty.
548
+
549
+ **Real branching topology fixed a naive assumption.** Filtering 30,045
550
+ tronçons down to a single named river and building a graph from their
551
+ endpoints does **not** give one connected line — for "Risle" alone, 1,195
552
+ name-matched tronçons split into 132 disconnected components. Broadening the
553
+ name filter to include known tributaries (§2.1) initially made this *worse*
554
+ (487/214 components), traced to short/generic tributary names ("Bec", "Avre")
555
+ matching unrelated streams elsewhere within the ~100×130 km bbox — fixed by
556
+ requiring every name-matched tronçon to also fall within a real distance of a
557
+ known gauge (`load_troncons_for_basin`'s `anchor_radius_km`), and by selecting
558
+ the connected component actually containing the most real gauges rather than
559
+ the component with the most raw tronçons (`best_component_for_stations`) —
560
+ proven to matter, not just theoretically: a synthetic adversarial test showed
561
+ the naive "biggest component" approach picking a larger but entirely
562
+ unrelated decoy network over the real one.
563
 
564
  **The bétoire finding**: two stations in the roster are explicitly named
565
  *"[amont bétoire]"* and *"[aval bétoire]"* in Hub'Eau's own site names —
566
+ *bétoire* being the Normandy dialect term for a karst swallow-hole. Three
567
+ edges spanning that stretch on La Risle (`H605641101 H605022010
568
+ H605641401 H605641201`) are flagged `verified_continuous=False`. BD TOPO's
569
+ own karst attribute doesn't currently confirm it (see the provisional-
570
+ attribute note above) `scripts/download_bdcavites.py` (§3.8) exists
571
+ specifically to get an independent, purpose-built second check on this,
572
+ rather than relying only on naming inference.
573
+
574
+ ### 3.8 BDCavités (`bdcavites/`, via `scripts/download_bdcavites.py`)
575
+
576
+ BRGM's national underground cavity inventory (sinkholes, quarries, natural
577
+ cavities), via Géorisques' WFS (`georisques.gouv.fr/services`, typeName
578
+ `CAVITE_LOCALISEE`, confirmed live and GeoJSON-capable directly against the
579
+ real service). Built specifically as an independent check on the bétoire
580
+ finding (§3.7) a purpose-built cavity dataset, not inference from station
581
+ naming or a provisional BD TOPO attribute. One real caveat: departments
582
+ 75/78/91/92/93/94/95 (Paris region, unrelated to this project) are excluded
583
+ from BDCavités entirely, and the Eure department's own inventory was among
584
+ the later batches of the national 2001–2013 completion program — worth
585
+ checking coverage density before treating a sparse result as a negative
586
+ finding rather than incomplete data.
587
+
588
+ ### 3.9 Geology (`bdcharm50/`, via `scripts/download_bdcharm.py`)
589
+
590
+ BRGM's BD Charm-50, harmonized 1:50,000 geological maps — free, open
591
+ (Licence Ouverte), no authentication, direct per-department ZIP download from
592
+ InfoTerre (a genuinely different access pattern than the WFS sources
593
+ elsewhere in this project: fixed URL per department, no bbox query, no axis-
594
+ order ambiguity). Departments **27 (Eure), 28 (Eure-et-Loir), 61 (Orne)** —
595
+ verified directly against the real, complete station roster (§3.1), not
596
+ guessed. A separate, CIGAL-membership-gated distribution of similar data
597
+ exists for at least one other French region; this project only uses the free
598
+ InfoTerre path.
599
+
600
+ ### 3.10 Landcover and NDVI (`scripts/fetch_landcover.py`, `scripts/fetch_worldcover_ndvi.py`)
601
+
602
+ ESA WorldCover, sampled at real gauge points from the public AWS S3 Cloud-
603
+ Optimized GeoTIFFs — **not** the Terrascope WMS, which a source dated within
604
+ the last month of this project's active development reported actively resets
605
+ connections from non-browser HTTP clients (TLS fingerprinting, confirmed
606
+ across multiple tools and User-Agents, not a coding problem to work around),
607
+ and separately was slated for full phase-out already past by the time this
608
+ was checked.
609
+
610
+ Landcover classification uses the product's 3°×3° tile grid; every real
611
+ station coordinate falls inside exactly one tile (`N48E000`), verified
612
+ directly against all 27 real coordinates. NDVI uses the *annual composites'*
613
+ 1°×1° tile grid instead — genuinely different from the classification grid,
614
+ looked up per-station via VITO's own authoritative tile-index grid file
615
+ (`esa_worldcover_grid_composites.fgb`) rather than a second hand-guessed S3
616
+ key pattern. Both need `AWS_NO_SIGN_REQUEST=YES` for `s3://`-scheme tile URLs
617
+ specifically — a plain HTTPS URL to the same public bucket needs no signing
618
+ at all, which is why the landcover script (HTTPS) worked without this while
619
+ the NDVI grid's returned URLs (`s3://`) initially failed on AWS credential
620
+ errors despite the bucket being fully public.
621
+
622
+ Both currently cover only the 27 real gauges (exact `station_code` match),
623
+ same limitation as Hub'Eau's `catchment_area_km2` before the cumulative-BD-
624
+ TOPO fix (§3.6) — extending either script to the full reach graph is
625
+ unstarted work, not a design decision.
626
+
627
+ ### 3.11 What was tried and didn't work
628
+
629
+ **SoilGrids (ISRIC)** — confirmed non-functional directly, not from a stale
630
+ search result: even a bare `lon`/`lat` query to the live REST API returned
631
+ `422` consistently, consistent with ISRIC's own currently-posted "temporarily
632
+ paused" service notice.
633
+
634
+ **INRAE's national soil survey (RRP/BDGSF)** — not a uniformly-accessible
635
+ source at all. Access is explicitly described as depending on regional/
636
+ departmental "référents" (varies by department, sometimes needs a formal
637
+ agreement with the regional chamber of agriculture), and INRAE's own
638
+ documentation states outright that the more detailed scale "n'est pas encore
639
+ en accès libre." IDPR (§3.5) and BD Charm-50 geology (§3.9) are this
640
+ project's actual substitutes for the hydrologically-relevant part of what
641
+ soil data would otherwise provide — not literal soil texture data, but IDPR
642
+ specifically is an *integrated hydrological behavior* indicator (infiltration
643
+ tendency), arguably more directly useful for a streamflow model than a raw
644
+ soil property map would be on its own.
645
+
646
+ ### 3.12 Centerline generation
647
+
648
+ **Only relevant to the older single-chain pipeline** (`build_surface_edges`,
649
+ still available for direct comparison/debugging) — the reach graph (§2)
650
+ derives its topology directly from BD TOPO's own node linkage and doesn't use
651
+ these centerline files at all.
652
 
653
  `centerlines/eure_centerline.csv` and `centerlines/risle_centerline.csv` — the
654
  geometry `build_surface_edges` orders stations against — are generated by
 
676
 
677
  ## 4. Applications
678
 
679
+ `src/app.py` (Streamlit) has two views, selected by a radio at the top:
680
+
681
+ **Explore** — the original click-to-read UI over real course geometry: pick a
682
  river, click (or slide) along its course, see interpolated elevation,
683
  estimated groundwater level, and — for whichever real gauge is nearest that
684
  point — water level, discharge, and rating-curve plots pulled directly from
685
  `HydrometricLoader`'s own plotting methods rather than reimplemented.
686
 
687
  Click support uses Streamlit's native chart-selection
688
+ (`st.plotly_chart(..., on_select="rerun")`), not a third-party click-handling
689
+ package. The click handler and the position slider share a single source of
690
+ truth by design: Streamlit only honors a slider's `value=` argument the first
691
+ time that widget is created, and on every later rerun returns whatever's
692
+ stored under that widget's own session-state key — so the click handler
693
+ writes directly into the slider's own key before it's instantiated, rather
694
+ than a separate key. It also de-duplicates incoming click events, since
 
695
  Streamlit's chart-selection state persists across reruns caused by *other*
696
+ widgets and would otherwise re-fire on every unrelated interaction.
697
+
698
+ **Network validation** — renders the full reach graph (§2): every edge as one
699
+ Plotly line trace regardless of edge count (a trace-per-edge approach doesn't
700
+ hold up at ~5,000+ edges; verified fast at real scale — 0.29s to build a
701
+ figure for ~2,900 edges), real confluences as diamond markers, real gauges as
702
+ elevation-colored circles. Metrics card reports node/edge/confluence/gauge
703
+ counts and, when available, IDPR and cumulative-catchment coverage. Virtual
704
+ infill nodes are deliberately not drawn individually — at ~2,400 per basin,
705
+ markers for each would bury the actual validation signal (do confluences sit
706
+ where a tributary visibly joins the line? do gauges sit on the network, not
707
+ offset from it?) rather than help it. Reads directly from `reach_graph/
708
+ {basin}_nodes_enriched.csv`, keyed on file modification time so a re-run of
709
+ `build_reach_graphs.py`/`enrich_reach_graph.py` is picked up automatically —
710
+ `st.cache_data` otherwise keys purely on function arguments, not file
711
+ contents, and this was confirmed to actually cause stale numbers once during
712
+ development, not just a theoretical risk.
713
 
714
  ---
715
 
716
  ## 5. Testing (`src/test_build_graph.py`)
717
 
718
+ Not a unit test suite in the pytest sense — a script with two independent
719
+ sections, both run from `main()`.
720
+
721
+ **`run_checks`** the original single-chain pipeline: runs `node_features
722
+ build_surface_edges build_pyg_graph(s)` against real data and checks the
723
+ result is sane no NaN/Inf in the feature tensor, no accidental cross-basin
724
+ edges, targets genuinely excluded from the model input, edge indices within
725
+ bounds, bidirectional edge count exactly double the directed count, per-basin
726
+ node counts summing to the combined total, standardized features actually
727
+ landing near zero mean / unit variance, the `known_losing_reaches` flag
728
+ actually taking effect, and mean/max `snap_distance_km` per basin against
729
+ whatever centerline is currently in `centerlines/`.
730
+
731
+ **`run_reach_graph_checks`** the reach graph pipeline, gracefully skipped
732
+ (not a failure) if `reach_graph/` doesn't exist yet. Mostly regression tests
733
+ for three bugs found and fixed during development, kept here specifically so
734
+ they can't silently reintroduce themselves:
735
+
736
+ - structural columns (`is_gauged`/`is_confluence`/etc.) never leak into
737
+ `feature_names`, but remain accessible as their own `Data` attributes
738
+ - target values never attach to a non-gauge node, and target coverage never
739
+ exceeds the real gauge count
740
+ - `edge_attr` stays exactly 3 columns despite extra edge metadata
741
+ (`toponym`, `cleabs`) sitting on the real edges table
742
+ - `physics_losses.py`'s `build_confluence_index`/`build_braid_index` produce
743
+ counts matching `is_confluence`/`is_rejoin_point` sums, with every index
744
+ within node bounds and every confluence having 2 upstream branches
745
+ - IDPR and `cumulative_catchment_area_km2` presence/coverage are reported
746
+ explicitly (the latter compared against the Hub'Eau-only baseline it's
747
+ meant to exceed)
748
+
749
+ Exits 0 on a clean pass across both sections, 1 otherwise — usable as a
750
+ pre-commit or CI gate if that's ever set up.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
751
 
752
  ---
753
 
754
+ ## 6. Running things
755
 
756
  Data acquisition (from repo root, in roughly dependency order):
757
 
 
760
  python -m scripts.download_elevation
761
  python -m scripts.download_era5_full # slow; download_era5_sample.py first if just testing
762
  python -m scripts.extract_era5
763
+ python -m scripts.download_catchment
764
  python -m scripts.download_bdtopo_hydro --check # verify typeNames before the real pull
765
  python -m scripts.download_bdtopo_hydro
766
+ python -m scripts.download_bdcavites --check
767
+ python -m scripts.download_bdcavites
768
+ python -m scripts.download_bdcharm
769
+ ```
770
+
771
+ Build and validate the reach graph:
772
+
773
+ ```bash
774
+ python -m scripts.build_reach_graphs --data-root datasets
775
+ python -m scripts.enrich_reach_graph --data-root datasets # --skip-climate if that step hangs
776
+ python -m scripts.compute_cumulative_catchment --data-root datasets
777
+ python -m scripts.diagnose_confluences --data-root datasets --basin eure
778
+ python -m scripts.diagnose_confluences --data-root datasets --basin risle
779
+ ```
780
+
781
+ Landcover / NDVI, real gauges only (needs `rasterio`, and `geopandas` for NDVI's
782
+ tile lookup):
783
+
784
+ ```bash
785
+ python -m scripts.fetch_landcover --check
786
+ python -m scripts.fetch_landcover
787
+ python -m scripts.fetch_worldcover_ndvi --check
788
+ python -m scripts.fetch_worldcover_ndvi
789
  ```
790
 
791
+ Validate everything against whatever's actually in `datasets/`:
792
 
793
  ```bash
794
  python -m src.test_build_graph --data-root datasets
datasets/bdcavites/cavite_localisee.geojson ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d9ad0770c09a15992f31f3ece16afeb9097f3a048f66c431379a78c9305bc204
3
+ size 24931685
datasets/bdcharm50/GEO050K_HARM_027.zip ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ef28692e01362400bb0201d0fa5940f1a20f7630f90b9258f4d99bc0744ea944
3
+ size 16009427
datasets/bdcharm50/GEO050K_HARM_028.zip ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4d486b6bea0b24b2004adad79afc7be2ddef86b67567467b015cf663ddeadeb7
3
+ size 21530663
datasets/bdcharm50/GEO050K_HARM_061.zip ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c900e51ff795863b505c3545f8bd8068aa7591f039d69f7e3b135812b35f0947
3
+ size 24293693
datasets/bdcharm50/dept_027/Descriptif des cartes géologiques à 1_50 000 vecteur.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d1c5773cc3af2552b4a21629d05bed2195293a7b924a5d696e1d0e250fbf3e86
3
+ size 465834
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.dbf ADDED
Binary file (47.1 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.lyr ADDED
Binary file (9.22 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.prj ADDED
@@ -0,0 +1 @@
 
 
1
+ PROJCS["RGF93_Lambert_93",GEOGCS["GCS_RGF_1993",DATUM["D_RGF_1993",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",700000.0],PARAMETER["False_Northing",6600000.0],PARAMETER["Central_Meridian",3.0],PARAMETER["Standard_Parallel_1",44.0],PARAMETER["Standard_Parallel_2",49.0],PARAMETER["Latitude_Of_Origin",46.5],UNIT["Meter",1.0]]
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.qml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ <?xml version='1.0' encoding='utf8'?>
2
+ <qgis hasScaleBasedVisibilityFlag="0" maximumScale="1000000000" minimumScale="0" version="3.4.10-Madeira" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><transparencyLevelInt>255</transparencyLevelInt><renderer-v2 symbollevels="0" type="RuleRenderer"><rules><rule filter="CODE='1'" label="1, Front de taille d'exploitation à ciel ouvert, carrière de grande dimension à ciel ouvert, gravière" symbol="0" /><rule filter="CODE='7'" label="7, Niveau-repère lithologique" symbol="1" /><rule filter="CODE='10'" label="10, Direction de l'écoulement par gravité dans cône de déjection" symbol="2" /><rule filter="CODE='21'" label="21, Limite d'extension de formation lithostratigraphique, limite d'épandage détritique" symbol="3" /><rule filter="ELSE" symbol="4" /></rules><symbols><symbol alpha="1" clip_to_extent="1" name="0" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer><layer class="MarkerLine" locked="0" pass="0"><prop k="interval" v="1.2" /><prop k="interval_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_along_line" v="0" /><prop k="offset_along_line_unit" v="MM" /><prop k="offset_along_line_unit" v="MM" /><prop k="offset_unit" v="MM" /><prop k="placement" v="interval" /><prop k="rotate" v="1" /><symbol alpha="1" clip_to_extent="1" name="@0@1" outputUnit="MM" type="marker"><layer class="SvgMarker" locked="0" pass="0"><prop k="angle" v="0" /><prop k="color" v="0,0,0,255" /><prop k="horizontal_anchor_point" v="1" /><prop k="name" v="/P04_002E.svg" /><prop k="offset" v="0.375, -0.375" /><prop k="offset_unit" v="MM" /><prop k="scale_method" v="diameter" /><prop k="size" v="0.75" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="1" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="1" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="0.6;0.6" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="1" /><prop k="joinstyle" v="bevel" /><prop k="color" v="255,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="2" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="3" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="0.36;0.36" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="1" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></symbols></renderer-v2></qgis>
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.shp ADDED
Binary file (44.7 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_DIVERS_2154.shx ADDED
Binary file (940 Bytes). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.dbf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7919155134fb9c8fcce3ba7f4a4e47a75a6d02499efb82215bc9375ed8a67d34
3
+ size 6620665
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.lyr ADDED
Binary file (8.7 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.prj ADDED
@@ -0,0 +1 @@
 
 
1
+ PROJCS["RGF93_Lambert_93",GEOGCS["GCS_RGF_1993",DATUM["D_RGF_1993",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",700000.0],PARAMETER["False_Northing",6600000.0],PARAMETER["Central_Meridian",3.0],PARAMETER["Standard_Parallel_1",44.0],PARAMETER["Standard_Parallel_2",49.0],PARAMETER["Latitude_Of_Origin",46.5],UNIT["Meter",1.0]]
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.qml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ <?xml version='1.0' encoding='utf8'?>
2
+ <qgis hasScaleBasedVisibilityFlag="0" maximumScale="1000000000" minimumScale="0" version="3.4.10-Madeira" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><transparencyLevelInt>255</transparencyLevelInt><renderer-v2 symbollevels="0" type="RuleRenderer"><rules><rule filter="CODE='1'" label="1, Limite de la carte ou du projet" symbol="0" /><rule filter="CODE='3'" label="3, Limite réseau hydrographique (lacs, canaux ou rivières délimitant une zone)" symbol="1" /><rule filter="CODE='11'" label="11, Contour géologique observé, visible" symbol="2" /><rule filter="CODE='12'" label="12, Contour géologique supposé, probable, masqué" symbol="3" /><rule filter="CODE='20'" label="20, Elément linéaire structural (contour géologique superposé à une faille)" symbol="4" /><rule filter="CODE='21'" label="21, Elément linéaire divers (contour géologique superposé à un élément linéaire divers)" symbol="5" /><rule filter="CODE='26'" label="26, Limite de faciès, limite de biozone, passage progressif entre deux faciès (sédimentaire, magmatique, etc)" symbol="6" /><rule filter="ELSE" symbol="7" /></rules><symbols><symbol alpha="1" clip_to_extent="1" name="0" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="76,76,76,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="1" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,127,255,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="2" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="3" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="0;0.6;1.8;0" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="1" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="4" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="255,255,255,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="5" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="255,255,255,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="6" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="0.5;1" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="1" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></symbols></renderer-v2></qgis>
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.shp ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:15626b809bc52ed27ba554c0c6ebae2933d42f4795f2ae4fd0bb7e5974f0d380
3
+ size 7438780
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_FGEOL_2154.shx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:573e2b4d674d42526cbf89a2295f2571cdf4ac7fe1615f308bea04bf5ec66564
3
+ size 154060
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.dbf ADDED
Binary file (30.7 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.lyr ADDED
Binary file (10.8 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.prj ADDED
@@ -0,0 +1 @@
 
 
1
+ PROJCS["RGF93_Lambert_93",GEOGCS["GCS_RGF_1993",DATUM["D_RGF_1993",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",700000.0],PARAMETER["False_Northing",6600000.0],PARAMETER["Central_Meridian",3.0],PARAMETER["Standard_Parallel_1",44.0],PARAMETER["Standard_Parallel_2",49.0],PARAMETER["Latitude_Of_Origin",46.5],UNIT["Meter",1.0]]
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.qml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ <?xml version='1.0' encoding='utf8'?>
2
+ <qgis hasScaleBasedVisibilityFlag="0" maximumScale="1000000000" minimumScale="0" version="3.4.10-Madeira" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><transparencyLevelInt>255</transparencyLevelInt><renderer-v2 symbollevels="0" type="RuleRenderer"><rules><rule filter="CODE='1'" label="1, Faille observée, visible, de nature non distinguée" symbol="0" /><rule filter="CODE='2'" label="2, Faille supposée, masquée, hypothétique, de nature non distinguée" symbol="1" /><rule filter="CODE='3'" label="3, Axe anticlinal ou antiforme, cartographique" symbol="2" /><rule filter="CODE='4'" label="4, Axe synclinal ou synforme, cartographique" symbol="3" /><rule filter="CODE='5'" label="5, Flexure" symbol="4" /><rule filter="CODE='6'" label="6, Faille profonde" symbol="5" /><rule filter="ELSE" symbol="6" /></rules><symbols><symbol alpha="1" clip_to_extent="1" name="0" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="1" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="0;1;3;0" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="1" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="2" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="1;4;1;1" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="1" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.16" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer><layer class="MarkerLine" locked="0" pass="0"><prop k="interval" v="7.0" /><prop k="interval_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_along_line" v="2" /><prop k="offset_along_line_unit" v="MM" /><prop k="offset_along_line_unit" v="MM" /><prop k="offset_unit" v="MM" /><prop k="placement" v="interval" /><prop k="rotate" v="1" /><symbol alpha="1" clip_to_extent="1" name="@0@3" outputUnit="MM" type="marker"><layer class="SvgMarker" locked="0" pass="0"><prop k="angle" v="0" /><prop k="color" v="0,0,0,255" /><prop k="horizontal_anchor_point" v="1" /><prop k="name" v="/P01_007E.svg" /><prop k="offset" v="1.0, -0" /><prop k="offset_unit" v="MM" /><prop k="scale_method" v="diameter" /><prop k="size" v="2.0" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="1" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="3" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="1;4;1;1" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="1" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.16" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer><layer class="MarkerLine" locked="0" pass="0"><prop k="interval" v="7.0" /><prop k="interval_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_along_line" v="2" /><prop k="offset_along_line_unit" v="MM" /><prop k="offset_along_line_unit" v="MM" /><prop k="offset_unit" v="MM" /><prop k="placement" v="interval" /><prop k="rotate" v="1" /><symbol alpha="1" clip_to_extent="1" name="@0@4" outputUnit="MM" type="marker"><layer class="SvgMarker" locked="0" pass="0"><prop k="angle" v="0" /><prop k="color" v="0,0,0,255" /><prop k="horizontal_anchor_point" v="1" /><prop k="name" v="/P05_004E.svg" /><prop k="offset" v="1.0, -0" /><prop k="offset_unit" v="MM" /><prop k="scale_method" v="diameter" /><prop k="size" v="2.0" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="1" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="4" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="joinstyle" v="bevel" /><prop k="line_style" v="no" /><prop k="line_color" v="255,0,255,255" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /></layer><layer class="MarkerLine" locked="0" pass="0"><prop k="interval" v="2.5" /><prop k="interval_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_along_line" v="0" /><prop k="offset_along_line_unit" v="MM" /><prop k="offset_along_line_unit" v="MM" /><prop k="offset_unit" v="MM" /><prop k="placement" v="interval" /><prop k="rotate" v="1" /><symbol alpha="1" clip_to_extent="1" name="@0@5" outputUnit="MM" type="marker"><layer class="SvgMarker" locked="0" pass="0"><prop k="angle" v="0" /><prop k="color" v="0,0,0,255" /><prop k="horizontal_anchor_point" v="1" /><prop k="name" v="/P06_002E.svg" /><prop k="offset" v="1.2, -0" /><prop k="offset_unit" v="MM" /><prop k="scale_method" v="diameter" /><prop k="size" v="2.4" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="1" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="5" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="4;1;0.5;1" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="1" /><prop k="joinstyle" v="bevel" /><prop k="color" v="255,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></symbols></renderer-v2></qgis>
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.shp ADDED
Binary file (52.9 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_L_STRUCT_2154.shx ADDED
Binary file (812 Bytes). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.dbf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d7f9f02aa66fdd0a0df715a6ff43d48fd3030dc42895747976c584edff25d196
3
+ size 3125317
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.lyr ADDED
Binary file (19.5 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.prj ADDED
@@ -0,0 +1 @@
 
 
1
+ PROJCS["RGF93_Lambert_93",GEOGCS["GCS_RGF_1993",DATUM["D_RGF_1993",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",700000.0],PARAMETER["False_Northing",6600000.0],PARAMETER["Central_Meridian",3.0],PARAMETER["Standard_Parallel_1",44.0],PARAMETER["Standard_Parallel_2",49.0],PARAMETER["Latitude_Of_Origin",46.5],UNIT["Meter",1.0]]
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.qml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ <?xml version='1.0' encoding='utf8'?>
2
+ <qgis hasScaleBasedVisibilityFlag="0" maximumScale="1000000000" minimumScale="0" version="3.4.10-Madeira" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><transparencyLevelInt>255</transparencyLevelInt><renderer-v2 symbollevels="0" type="RuleRenderer"><rules><rule filter="CODE='1'" label="1, Gîte fossilifère" symbol="0" /><rule filter="CODE='2'" label="2, Gisement, indice de microfossiles" symbol="1" /><rule filter="CODE='4'" label="4, Carrière à ciel ouvert" symbol="2" /><rule filter="CODE='8'" label="8, Gouffre, aven" symbol="3" /><rule filter="CODE='9'" label="9, Mardelle, bétoire, doline, fontis" symbol="4" /><rule filter="CODE='10'" label="10, Puits de mine" symbol="5" /><rule filter="CODE='12'" label="12, Exploitation souterraine, ancienne mine, ou cave" symbol="6" /><rule filter="CODE='13'" label="13, Source" symbol="7" /><rule filter="CODE='14'" label="14, Source captée" symbol="8" /><rule filter="CODE='15'" label="15, Menhir" symbol="9" /><rule filter="CODE='32'" label="32, Minéralisation disséminée" symbol="10" /><rule filter="CODE='33'" label="33, Indication ponctuelle de formation affleurante, ou de niveau lithologique interstratifié, niveau-repère, faciès, etc." symbol="11" /><rule filter="CODE='35'" label="35, Entonnoir, puits d'absorpsion" symbol="12" /><rule filter="CODE='41'" label="41, Carrière souterraine" symbol="13" /><rule filter="CODE='50'" label="50, Localisation d'un point de cote NGF (isobathe, isohypse) ou d'épaisseur (isopaque, en m) d'une formation" symbol="14" /><rule filter="CODE='69'" label="69, Exploitation par dragage, carrière noyée, ballastière, etc." symbol="15" /><rule filter="CODE='77'" label="77, Site préhistorique paléolithique" symbol="16" /><rule filter="CODE='79'" label="79, Substances utiles non métalliques, matériaux" symbol="17" /><rule filter="CODE='91'" label="91, Haldes, déblais d'exploitation minière" symbol="18" /><rule filter="ELSE" symbol="19" /></rules><symbols><symbol alpha="1" clip_to_extent="1" name="0" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="!" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="1" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="&quot;" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="2" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="$" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,-0.352778" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="3" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="(" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.352778" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="4" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v=")" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="5" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="*" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="6" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="," /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.6350004" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="7" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="-" /><prop k="color" v="0,112,255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="8" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="." /><prop k="color" v="0,112,255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="9" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="/" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,1.76389" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="10" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="@" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="11" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="v" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="12" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="B" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="13" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="&amp;" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.6350004" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="14" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="y" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="15" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="T" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="16" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="17" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="#" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.0" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="18" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="a" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PDivers" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,0.352778" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol></symbols></renderer-v2></qgis>
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.shp ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e7696bc4eeeaf7d2b499040cba69508aca65b5493e7ab9c99b7bd41c44c9a35a
3
+ size 153064
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_DIVERS_2154.shx ADDED
Binary file (43.8 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.dbf ADDED
Binary file (21 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.lyr ADDED
Binary file (7.68 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.prj ADDED
@@ -0,0 +1 @@
 
 
1
+ PROJCS["RGF93_Lambert_93",GEOGCS["GCS_RGF_1993",DATUM["D_RGF_1993",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",700000.0],PARAMETER["False_Northing",6600000.0],PARAMETER["Central_Meridian",3.0],PARAMETER["Standard_Parallel_1",44.0],PARAMETER["Standard_Parallel_2",49.0],PARAMETER["Latitude_Of_Origin",46.5],UNIT["Meter",1.0]]
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.qml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ <?xml version='1.0' encoding='utf8'?>
2
+ <qgis hasScaleBasedVisibilityFlag="0" maximumScale="1000000000" minimumScale="0" version="3.4.10-Madeira" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><transparencyLevelInt>255</transparencyLevelInt><renderer-v2 symbollevels="0" type="RuleRenderer"><rules><rule filter="CODE='1'" label="1, Stratification So avec pendage (polarité normale ou indéterminée)" symbol="0" /><rule filter="ELSE" symbol="1" /></rules><symbols><symbol alpha="1" clip_to_extent="1" name="0" outputUnit="MM" type="marker"><layer class="FontMarker" locked="0" pass="0"><prop k="angle" v="0.0" /><prop k="angle_dd_active" v="1" /><prop k="angle_dd_expression" /><prop k="angle_dd_field" v="AZIMUT" /><prop k="angle_dd_useexpr" v="0" /><prop k="chr" v="!" /><prop k="color" v="-255,-255,-255,255" /><prop k="font" v="BRGM_PStruct" /><prop k="horizontal_anchor_point" v="1" /><prop k="offset" v="0.0,-0.5291669999999999" /><prop k="offset_unit" v="MM" /><prop k="size" v="3.52778" /><prop k="size_unit" v="MM" /><prop k="vertical_anchor_point" v="2" /></layer></symbol></symbols></renderer-v2></qgis>
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.shp ADDED
Binary file (1.05 kB). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_P_STRUCT_2154.shx ADDED
Binary file (372 Bytes). View file
 
datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.dbf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c1da5e6b0d60c08a41862a83b94606d31ef06ec729883a7a0f2ce465fb923443
3
+ size 3622421
datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.lyr ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0874de865d408583ecfc7048837e63bb65046e6eb3b5892e3f2fb4272744a8f6
3
+ size 143360
datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.prj ADDED
@@ -0,0 +1 @@
 
 
1
+ PROJCS["RGF93_Lambert_93",GEOGCS["GCS_RGF_1993",DATUM["D_RGF_1993",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",700000.0],PARAMETER["False_Northing",6600000.0],PARAMETER["Central_Meridian",3.0],PARAMETER["Standard_Parallel_1",44.0],PARAMETER["Standard_Parallel_2",49.0],PARAMETER["Latitude_Of_Origin",46.5],UNIT["Meter",1.0]]
datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.qml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ <?xml version='1.0' encoding='utf8'?>
2
+ <qgis hasScaleBasedVisibilityFlag="0" maximumScale="1000000000" minimumScale="0" version="3.4.10-Madeira" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><transparencyLevelInt>255</transparencyLevelInt><renderer-v2 symbollevels="0" type="RuleRenderer"><rules><rule filter="CODE_LEG='1'" label="X, Dépôts anthropiques et remblais divers - 1" symbol="0" /><rule filter="CODE_LEG='2'" label="qE, Eboulis - 2" symbol="1" /><rule filter="CODE_LEG='3'" label="Fz, Alluvions récentes : silts argileux, sables, argiles, tourbes - 3" symbol="2" /><rule filter="CODE_LEG='4'" label="Fy-z, Alluvions anciennes de fond de vallées (Fy) et récentes (Fz) . Silex et graviers, limons et sables - 4" symbol="3" /><rule filter="CODE_LEG='5'" label="F, Alluvions anciennes indifférenciées : silts argileux, sables, graviers et galets - 5" symbol="4" /><rule filter="CODE_LEG='6'" label="Fyd, Alluvions anciennes de basse terrasse (1 à 15 m) - 6" symbol="5" /><rule filter="CODE_LEG='7'" label="Fyc-d, Alluvions anciennes, basse et moyenne terrasses : galets, graviers, sables, blocs de grès et meulières - 7" symbol="6" /><rule filter="CODE_LEG='8'" label="Fyc, Alluvions anciennes de moyenne terrasse (20 à 30 m) - 8" symbol="7" /><rule filter="CODE_LEG='9'" label="Fyb-c, Alluvions anciennes de moyenne et haute terrasse - 9" symbol="8" /><rule filter="CODE_LEG='10'" label="Fyb, Alluvions anciennes de haute terrasse (40 à 50 m) - 10" symbol="9" /><rule filter="CODE_LEG='11'" label="Fya, Alluvions anciennes de très haute terrasse (55 m ou plus). - 11" symbol="10" /><rule filter="CODE_LEG='12'" label="qU, Tufs - 12" symbol="11" /><rule filter="CODE_LEG='13'" label="qOE, Limons des plateaux - 13" symbol="12" /><rule filter="CODE_LEG='14'" label="qOEV, Limons de pentes et de bas-versants - 14" symbol="13" /><rule filter="CODE_LEG='15'" label="qC, Colluvions diverses : limons, sables, argiles, fragments de silex et de craie - 15" symbol="14" /><rule filter="CODE_LEG='16'" label="FC, Colluvions de fonds de vallons - 16" symbol="15" /><rule filter="CODE_LEG='17'" label="qCRS, Colluvions alimentées principalement par les formations résiduelles à silex - 17" symbol="16" /><rule filter="CODE_LEG='18'" label="RS, Formations résiduelles à silex : silex anguleux, argiles et sables. Souvent solifluée sur les versants - 18" symbol="17" /><rule filter="CODE_LEG='19'" label="ReP, Cailloutis des régions de Gisors et de Mesnil-Verclives : galets, silex, matrice argilo-sableuse - 19" symbol="18" /><rule filter="CODE_LEG='20'" label="Rm-pAM, Argile brune, limoneuse et sableuse, à dalles et plaquettes silicifiées résiduelles, rarement fossilifères - 20" symbol="19" /><rule filter="CODE_LEG='21'" label="Rg1SF, Zone riche en poches de lambeaux résiduels de sables et grès de Fontainebleau (Oligocène probable, résiduel) - 21" symbol="20" /><rule filter="CODE_LEG='23'" label="Rg1CBr, Formation de Brie résiduelle (meulières, calcaires et marnes) sur Stampien inférieur argileux - 23" symbol="21" /><rule filter="CODE_LEG='24'" label="RPe-g, Galets marins résiduels (Stampien possible ou Yprésien) - 24" symbol="22" /><rule filter="CODE_LEG='25'" label="Re6-g1, Formation résiduelle à meulière et grès, Stampien et Bartonien : fragments ou blocs de meulières et de grès, matrice argilo-sableuse brune à brun-noir - 25" symbol="23" /><rule filter="CODE_LEG='26'" label="Re4P, Galets résiduels issus de l'Yprésien inférieur : galets de silex avellanaires dans matrice argilo-sableuse - 26" symbol="24" /><rule filter="CODE_LEG='27'" label="Re3P, Galets résiduels issus du Thanétien - 27" symbol="25" /><rule filter="CODE_LEG='28'" label="pSLo, Sables de Lozère : sables argileux grossiers ou fins (Pliocène). - 28" symbol="26" /><rule filter="CODE_LEG='29'" label="g1SF, Sables de Fontainebleau (Stampien), 50m. - 29" symbol="27" /><rule filter="CODE_LEG='30'" label="g1CBr, Formation de Brie (meulières, calcaires et marnes, 1 à 5 m) et calcaire de Sannois. Stampien inférieur, Sannoisien - 30" symbol="28" /><rule filter="CODE_LEG='31'" label="g1S, Stampien inférieur &quot;faciès Sannoisien&quot; : Argile verte de Romainville et, calcaires et meulière de Brie - 31" symbol="29" /><rule filter="CODE_LEG='32'" label="g1AvR, Argiles vertes de Romainville et Marnes supragypseuses. Ludien à Stampien inférieur (Sannoisien). - 32" symbol="30" /><rule filter="CODE_LEG='33'" label="e7-g1CSept, Calcaire de Septeuil (ou de Champigny), de 0 à 12 m d'épaisseur. Sépiolites supérieures et&quot; Marnes à Pholadomyes&quot; (calcaires et marnes, 0 à 6 m). Ludien (Eocène supérieur) - 33" symbol="31" /><rule filter="CODE_LEG='34'" label="e6, Bartonien moyen et supérieur non différencié - 34" symbol="32" /><rule filter="CODE_LEG='35'" label="e6S, Bartonien moyen = Marinésien : Sables de Mortefontaine. Bartonien inférieur = Auversien : Sables de Beauchamps - 35" symbol="33" /><rule filter="CODE_LEG='36'" label="e6CS-O, Marinésien : Calcaires et marnes de Saint-Ouen, de 0 à 15 m d'épaisseur. Auversien : calcaires marins, saumâtres ou lacustres, Sables et grès de Beauchamp, Sépiolites inférieures (1 à 5 m). - 36" symbol="34" /><rule filter="CODE_LEG='37'" label="e5C, Calcaires à Cérithes, Marnes et caillasses. Calcaire grossier supérieur - 37" symbol="35" /><rule filter="CODE_LEG='38'" label="e5b, Poudingue de Thionville-sur-Opton, Glauconie de base et calcaires grossiers (sables calcaires et calcaires bioclastiques) - 38" symbol="36" /><rule filter="CODE_LEG='39'" label="e5CG, Calcaire grossier (Lutétien), marnes et caillasses. - 39" symbol="37" /><rule filter="CODE_LEG='40'" label="e4SCui, Yprésien supérieur-Cuisien : Sables de Cuise - 40" symbol="38" /><rule filter="CODE_LEG='41'" label="e1-4, Yprésien indifférencié : Argile plastique et argiles à silex (&quot;Sparnacien&quot;), de 0 à 30 m d'épaisseur, et Sables de Cuise ou assimilés (0 à 10 m), du Cuisien - 41" symbol="39" /><rule filter="CODE_LEG='42'" label="e4A, Yprésien inférieur-Sparnacien : Argile plastique et Argiles à silex - 42" symbol="40" /><rule filter="CODE_LEG='43'" label="e3-4A-S, Sparnacien et Thanétien indifférenciés. Sparnacien e3 : argile plastique grise ; Thanétien e2 : sable gris, grès et poudingue - 43" symbol="41" /><rule filter="CODE_LEG='44'" label="e3-4S, Thanétien à Yprésien basal, 0 à 7 m : sables fins, parfois argileux, gris, beiges ou verdâtres ; sables fins à grossiers, à éclats de silex et galets, sables fins, argileux, beiges ou verdâtres, et silex &quot;verdis&quot;. - 44" symbol="42" /><rule filter="CODE_LEG='45'" label="e3P, Thanétien : sable gris, grès et poudingue - 45" symbol="43" /><rule filter="CODE_LEG='46'" label="e1-2CBr, Dano-Montien, 0 à 15 m : calcaires argileux supérieur de Bray et Lû. Calcaire jaunâtre grossier de Bray et Lû et d'Ambleville - 46" symbol="44" /><rule filter="CODE_LEG='47'" label="eS, Sables, grès, argiles éocènes indifférenciées - 47" symbol="45" /><rule filter="CODE_LEG='48'" label="c5Cr, Campanien : craie blanche à silex parfois dolomitisée, biozone de foraminifères g, h, i - 48" symbol="46" /><rule filter="CODE_LEG='49'" label="c4-5Cr, Santonien-Campanien : craie blanche à silex - 49" symbol="47" /><rule filter="CODE_LEG='50'" label="c4-5CrD, Santonien-Campanien : craie dolomitisée à silex - 50" symbol="48" /><rule filter="CODE_LEG='51'" label="c4Cr, Santonien : craie blanche à silex, parfois indurée. Biozone de foraminifères d, e, f - 51" symbol="49" /><rule filter="CODE_LEG='52'" label="c3-4Cr, Coniacien-Santonien : craie blanche à silex parfois indurée, biozone de foraminifères - 52" symbol="50" /><rule filter="CODE_LEG='53'" label="c3Cr, Coniacien : craie blanche à silex, localement indurée, biozone de foraminifères a, b, c - 53" symbol="51" /><rule filter="CODE_LEG='54'" label="c2-3Cr, Turonien inférieur à Coniacien inférieur : craie souvent indurée, petits silex gris-noirs - 54" symbol="52" /><rule filter="CODE_LEG='55'" label="c2Cr, Turonien : craie grise, marneuse, pauvre en silex - 55" symbol="53" /><rule filter="CODE_LEG='57'" label="c1CrG, Cénomanien : craie glauconieuse à silex gris et noirs - 57" symbol="54" /><rule filter="CODE_LEG='58'" label="c1G, Glauconie sableuse d'Eauplet. Sables glauconieux à lits d'argiles vertes et granules de Qz. Au sommet bancs durcis perforés et nodules phosphatés. - 58" symbol="55" /><rule filter="CODE_LEG='59'" label="n6MS, Albien : Marnes silteuses et sables ferrugineux - 59" symbol="56" /><rule filter="CODE_LEG='60'" label="j6AC, Kimméridgien : argile et calcaire marneux - 60" symbol="57" /><rule filter="CODE_LEG='61'" label="j5AV, Argiles de Villerville ou de Cricqueboeuf - 61" symbol="58" /><rule filter="CODE_LEG='62'" label="j5SGl, Oxfordien supérieur. Sables de Glos - 62" symbol="59" /><rule filter="CODE_LEG='999'" label="hydro, Réseau hydrologique - 999" symbol="60" /><rule filter="ELSE" symbol="61" /></rules><symbols><symbol alpha="1" clip_to_extent="1" name="0" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="315" /><prop k="svgFile" v="/S01_002.svg" /><prop k="svgFillColor" v="0,0,0,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="19.6" /><symbol alpha="1" clip_to_extent="1" name="@0@1" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="1" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="178,178,178,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="2" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="229,255,229,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="3" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="191,229,229,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="4" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S10_011.svg" /><prop k="svgFillColor" v="127,191,191,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="17.80" /><symbol alpha="1" clip_to_extent="1" name="@0@5" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="5" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="191,255,229,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="6" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="127,255,229,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="7" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="127,229,229,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="8" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="0,255,229,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="9" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S10_011.svg" /><prop k="svgFillColor" v="0,229,229,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="17.80" /><symbol alpha="1" clip_to_extent="1" name="@0@10" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="10" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S10_011.svg" /><prop k="svgFillColor" v="0,191,229,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="17.80" /><symbol alpha="1" clip_to_extent="1" name="@0@11" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="11" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S05_003.svg" /><prop k="svgFillColor" v="255,0,0,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="12.50" /><symbol alpha="1" clip_to_extent="1" name="@0@12" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="12" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,191,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="13" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,229,191,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="14" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="229,229,191,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S05_003.svg" /><prop k="svgFillColor" v="255,0,0,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="12.50" /><symbol alpha="1" clip_to_extent="1" name="@0@15" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="15" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="229,229,191,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S05_003.svg" /><prop k="svgFillColor" v="0,0,255,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="12.50" /><symbol alpha="1" clip_to_extent="1" name="@0@16" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="16" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="229,229,191,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S05_002.svg" /><prop k="svgFillColor" v="255,0,0,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="18.40" /><symbol alpha="1" clip_to_extent="1" name="@0@17" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="17" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,191,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="18" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S02_011.svg" /><prop k="svgFillColor" v="229,191,191,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="14.00" /><symbol alpha="1" clip_to_extent="1" name="@0@19" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="19" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,191,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S01_002.svg" /><prop k="svgFillColor" v="255,0,0,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="19.6" /><symbol alpha="1" clip_to_extent="1" name="@0@20" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="20" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S02_011.svg" /><prop k="svgFillColor" v="255,127,229,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="14.00" /><symbol alpha="1" clip_to_extent="1" name="@0@21" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="21" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S02_011.svg" /><prop k="svgFillColor" v="191,255,0,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="14.00" /><symbol alpha="1" clip_to_extent="1" name="@0@22" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="22" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S02_011.svg" /><prop k="svgFillColor" v="63,191,0,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="14.00" /><symbol alpha="1" clip_to_extent="1" name="@0@23" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="23" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S02_011.svg" /><prop k="svgFillColor" v="255,191,191,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="14.00" /><symbol alpha="1" clip_to_extent="1" name="@0@24" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="24" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S02_011.svg" /><prop k="svgFillColor" v="255,178,76,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="14.00" /><symbol alpha="1" clip_to_extent="1" name="@0@25" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="25" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer><layer class="SVGFill" locked="0" pass="0"><prop k="angle" v="0" /><prop k="svgFile" v="/S02_011.svg" /><prop k="svgFillColor" v="255,127,0,255" /><prop k="svgOutlineColor" v="#000000" /><prop k="svgOutlineWidth" v="1" /><prop k="width" v="14.00" /><symbol alpha="1" clip_to_extent="1" name="@0@26" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="joinstyle" v="bevel" /><prop k="use_custom_dash" v="0" /><prop k="line_color" v="0,0,0,255" /><prop k="line_style" v="no" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></layer></symbol><symbol alpha="1" clip_to_extent="1" name="26" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,76,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="27" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,127,229,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="28" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="191,255,0,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="29" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="0,255,127,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="30" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="0,229,127,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="31" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="229,153,76,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="32" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="229,102,76,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="33" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,229,76,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="34" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="63,191,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="35" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="229,191,0,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="36" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="191,191,0,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="37" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,191,0,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="38" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,229,127,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="39" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,178,76,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="40" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,191,127,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="41" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,153,76,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="42" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="229,127,191,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="43" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,63,127,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="44" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,127,0,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="45" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="191,63,127,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="46" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="191,255,127,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="47" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="191,229,127,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="48" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="127,255,127,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="49" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="127,229,127,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="50" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="204,255,76,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="51" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="63,229,0,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="52" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="127,229,0,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="53" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="0,255,0,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="54" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="63,191,0,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="55" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="0,229,0,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="56" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="127,229,191,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="57" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="191,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="58" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="127,127,229,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="59" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="63,229,229,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="60" outputUnit="MM" type="fill"><layer class="SimpleFill" locked="0" pass="0"><prop k="color" v="255,255,255,255" /><prop k="color_border" v="0,0,0,255" /><prop k="offset" v="0,0" /><prop k="style" v="solid" /><prop k="style_border" v="no" /><prop k="width_border" v="1" /></layer></symbol></symbols></renderer-v2></qgis>
datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.shp ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:06a8f10eee38b43494ed457c05c416cbbf07e024911858815ee1151d1068e802
3
+ size 12602632
datasets/bdcharm50/dept_027/GEO050K_HARM_027_S_FGEOL_2154.shx ADDED
Binary file (64.2 kB). View file
 
datasets/bdcharm50/dept_028/Descriptif des cartes géologiques à 1_50 000 vecteur.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d1c5773cc3af2552b4a21629d05bed2195293a7b924a5d696e1d0e250fbf3e86
3
+ size 465834
datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.dbf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:869d8ce6ca5b251aa03cb61066ffdba2325874bd785dc9755bfb0821bfe53c2f
3
+ size 3912353
datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.lyr ADDED
Binary file (8.19 kB). View file
 
datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.prj ADDED
@@ -0,0 +1 @@
 
 
1
+ PROJCS["RGF93_Lambert_93",GEOGCS["GCS_RGF_1993",DATUM["D_RGF_1993",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",700000.0],PARAMETER["False_Northing",6600000.0],PARAMETER["Central_Meridian",3.0],PARAMETER["Standard_Parallel_1",44.0],PARAMETER["Standard_Parallel_2",49.0],PARAMETER["Latitude_Of_Origin",46.5],UNIT["Meter",1.0]]
datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.qml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ <?xml version='1.0' encoding='utf8'?>
2
+ <qgis hasScaleBasedVisibilityFlag="0" maximumScale="1000000000" minimumScale="0" version="3.4.10-Madeira" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><transparencyLevelInt>255</transparencyLevelInt><renderer-v2 symbollevels="0" type="RuleRenderer"><rules><rule filter="CODE='1'" label="1, Limite de la carte ou du projet" symbol="0" /><rule filter="CODE='3'" label="3, Limite réseau hydrographique (lacs, canaux ou rivières délimitant une zone)" symbol="1" /><rule filter="CODE='10'" label="10, Limite interprétée sur la carte (arrêts couleur)" symbol="2" /><rule filter="CODE='11'" label="11, Contour géologique observé, visible" symbol="3" /><rule filter="CODE='12'" label="12, Contour géologique supposé, probable, masqué" symbol="4" /><rule filter="CODE='20'" label="20, Elément linéaire structural (contour géologique superposé à une faille)" symbol="5" /><rule filter="ELSE" symbol="6" /></rules><symbols><symbol alpha="1" clip_to_extent="1" name="0" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="76,76,76,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="1" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,127,255,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="2" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="255,255,255,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="3" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="4" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="0;0.6;1.8;0" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="1" /><prop k="joinstyle" v="bevel" /><prop k="color" v="0,0,0,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0.1" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol><symbol alpha="1" clip_to_extent="1" name="5" outputUnit="MM" type="line"><layer class="SimpleLine" locked="0" pass="0"><prop k="capstyle" v="square" /><prop k="customdash" v="5;2" /><prop k="customdash_unit" v="MM" /><prop k="use_custom_dash" v="0" /><prop k="joinstyle" v="bevel" /><prop k="color" v="255,255,255,255" /><prop k="line_style" v="solid" /><prop k="line_style_unit" v="MM" /><prop k="line_width" v="0" /><prop k="line_width_unit" v="MM" /><prop k="offset" v="0" /><prop k="offset_unit" v="MM" /><prop k="draw_inside_polygon" v="0" /></layer></symbol></symbols></renderer-v2></qgis>
datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.shp ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d0d181998e534cee707edf55432f83031accf30b73bbe6f80ccc55b452106c6f
3
+ size 9529460
datasets/bdcharm50/dept_028/GEO050K_HARM_028_L_FGEOL_2154.shx ADDED
Binary file (91.1 kB). View file