River_Network / scripts /run_bdtopo_checks.py
ageraustine's picture
Upload folder using huggingface_hub
a74054f verified
Raw
History Blame Contribute Delete
3.05 kB
"""
Run this against your real downloaded BD TOPO data to:
1. Actually answer the karst/bétoire question with real data.
2. Cross-validate the new catchment polygons against Hub'Eau's surface_bv
numbers (from catchment_area.csv, built earlier via download_catchment_area.py).
"""
import sys
sys.path.insert(0, ".")
from pathlib import Path
from src.data.loaders.bdtopo_hydro import BDTopoHydroLoader
loader = BDTopoHydroLoader(data_path=Path("datasets/bdtopo_hydro"))
# --- 1. The karst question, for real this time ---
print("=" * 70)
print("KARST CHECK near amont/aval bétoire stations")
print("=" * 70)
BETOIRE_STATIONS = {
"H605641101": ("Ajou [amont bétoire]", 48.98492, 0.78902),
"H605641201": ("Grosley-sur-Risle [aval bétoire]", 49.04707, 0.79984),
}
surfaces = loader.load_surfaces()
any_found = False
for code, (name, lat, lon) in BETOIRE_STATIONS.items():
results = loader.check_karst_near_point(lat, lon, search_radius_km=3.0, surfaces_geojson=surfaces)
print(f"\n{code} ({name}):")
if results:
any_found = True
for r in results:
print(f" -> {r['nature']!r} at {r['distance_km']:.2f} km")
else:
print(" -> no karst-classified feature within 3 km")
print()
if any_found:
print("VERDICT: CONFIRMED by real BD TOPO data -- the bétoire naming is backed "
"by an actual mapped karst feature.")
else:
print("VERDICT: No karst feature found within 3km. Try a wider search radius, "
"or this may just be historical/informal naming not reflected in the "
"current BD TOPO classification.")
# --- 2. Cross-validate catchment polygons against Hub'Eau surface_bv ---
print()
print("=" * 70)
print("CATCHMENT POLYGON CROSS-CHECK vs Hub'Eau surface_bv")
print("=" * 70)
try:
import geopandas as gpd
import pandas as pd
catchments = loader.load_catchments()
print(f"Loaded {len(catchments)} catchment polygon(s)")
print(f"Columns: {list(catchments.columns)}")
hubeau_path = Path("datasets/catchment_area.csv")
if hubeau_path.exists():
hubeau = pd.read_csv(hubeau_path).dropna(subset=["catchment_area_km2"])
print(f"\nLoaded {len(hubeau)} Hub'Eau reference values from {hubeau_path}")
# Compute polygon areas in km^2 (reproject to a metric CRS for accurate area)
catchments_metric = catchments.to_crs(epsg=2154) # Lambert-93, standard for France
catchments["area_km2_computed"] = catchments_metric.geometry.area / 1e6
print(catchments[["area_km2_computed"]].describe())
print("\n(Match these against datasets/catchment_area.csv's real Hub'Eau values "
"by whichever ID field the polygons carry -- check catchments.columns "
"above for a station/site code to join on.)")
else:
print(f"\n{hubeau_path} not found -- skipping cross-check. "
f"(Run download_catchment_area.py first if you want this comparison.)")
except ImportError:
print("geopandas not installed -- skipping catchment polygon check.")