feat: embed gf3 water extraction workflow

This commit is contained in:
2026-06-15 11:45:11 +08:00
parent a0388de9d4
commit f726367cbb
23 changed files with 2037 additions and 14 deletions
+64
View File
@@ -0,0 +1,64 @@
"""Command-line interface for GF-3 water extraction."""
from __future__ import annotations
import argparse
from pathlib import Path
from .pipeline import run_from_args
def build_arg_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="Extract water from GF-3 HH/HV ENVI images with a non-DL baseline.")
parser.add_argument("--hh", required=True, type=Path)
parser.add_argument("--hv", required=True, type=Path)
parser.add_argument("--out-dir", required=True, type=Path)
parser.add_argument("--dem", type=Path, default=None)
parser.add_argument("--dltb-gdb", type=Path, default=None, help="DLTB FileGDB path used as soft land-use prior.")
parser.add_argument("--dltb-cache-dir", type=Path, default=None, help="Directory containing water_prior.shp, paddy.shp, strict_review.shp DLTB cache layers.")
parser.add_argument("--dltb-layer", default="DLTB")
parser.add_argument("--dltb-field", default="DLMC")
parser.add_argument("--dltb-mode", choices=["soft", "strict", "off"], default="soft")
parser.add_argument("--dltb-max-features", type=int, default=None, help="Safety limit for DLTB features read from the source.")
parser.add_argument("--water-vector", type=Path, action="append", default=[], help="Known river/lake shapefile. Can be passed multiple times.")
parser.add_argument("--paddy-vector", type=Path, action="append", default=[], help="Paddy field/farmland water-sensitive vector. Can be passed multiple times.")
parser.add_argument("--river-buffer-meters", type=float, default=120.0, help="Buffer width for line river vectors.")
parser.add_argument("--paddy-buffer-meters", type=float, default=0.0, help="Buffer width for line paddy vectors, if any.")
parser.add_argument("--threshold-method", choices=["otsu", "percentile"], default="otsu")
parser.add_argument("--score-percentile", type=float, default=92.0)
parser.add_argument("--hv-percentile", type=float, default=35.0)
parser.add_argument("--prior-score-percentile", type=float, default=85.0)
parser.add_argument("--prior-hv-percentile", type=float, default=45.0)
parser.add_argument("--paddy-score-percentile", type=float, default=88.0)
parser.add_argument("--paddy-hv-percentile", type=float, default=45.0)
parser.add_argument("--candidate-score-percentile", type=float, default=90.0)
parser.add_argument("--candidate-hv-percentile", type=float, default=50.0)
parser.add_argument("--slope-max", type=float, default=8.0)
parser.add_argument("--close-pixels", type=int, default=0, help="Binary closing radius for final water mask before vectorization.")
parser.add_argument("--open-pixels", type=int, default=0, help="Binary opening radius for final water mask after hole filling.")
parser.add_argument("--paddy-close-pixels", type=int, default=0, help="Binary closing radius for paddy water-like mask.")
parser.add_argument("--paddy-open-pixels", type=int, default=0, help="Binary opening radius for paddy water-like mask.")
parser.add_argument("--candidate-close-pixels", type=int, default=0, help="Binary closing radius for low-confidence candidate mask.")
parser.add_argument("--candidate-open-pixels", type=int, default=0, help="Binary opening radius for low-confidence candidate mask.")
parser.add_argument("--cartographic-water", action="store_true", help="Export a map-production layer that merges high-confidence and review candidate water.")
parser.add_argument("--cartographic-include-paddy", action="store_true", help="Include paddy water-like pixels in cartographic water.")
parser.add_argument("--cartographic-close-pixels", type=int, default=3)
parser.add_argument("--cartographic-open-pixels", type=int, default=0)
parser.add_argument("--cartographic-fill-hole-pixels", type=int, default=4096)
parser.add_argument("--cartographic-min-component-pixels", type=int, default=512)
parser.add_argument("--min-component-pixels", type=int, default=128)
parser.add_argument("--fill-hole-pixels", type=int, default=512)
parser.add_argument("--no-morphology", action="store_true")
parser.add_argument("--out-vector-gpkg", type=Path, default=None, help="Write cartographic vector products to this GeoPackage.")
parser.add_argument("--out-vector-shp-dir", type=Path, default=None, help="Write one ESRI Shapefile per cartographic vector layer.")
parser.add_argument("--min-polygon-area-m2", type=float, default=1000.0)
parser.add_argument("--simplify-meters", type=float, default=0.0)
parser.add_argument("--smooth-meters", type=float, default=0.0, help="Vector boundary smoothing distance using buffer(+d)/buffer(-d).")
parser.add_argument("--min-hole-area-m2", type=float, default=0.0, help="Remove polygon interior holes smaller than this area.")
return parser
def main(argv: list[str] | None = None) -> int:
parser = build_arg_parser()
return run_from_args(parser.parse_args(argv))