Change log#
Unreleased (feat/phase-4)#
Hydrology — new stream-network surface (W-1 → W-5)
StreamRaster.order(method="hack")— Hack 1957 main-stem-first ordering.StreamRaster.order(method="topological")— Kahn-sort sequential numbering.StreamRaster.to_vector(...)now carries asinuositycolumn per link.StreamRaster.main_stem(flow_direction, outlet=None)— public API for the longest source-to-outlet trace.StreamRaster.prune_short(flow_direction, min_length_m)— drop headwater links below a threshold.
Hydrology — watershed metrics (W-7 → W-9)
FlowDirection.isobasins(streams, accumulation, target_area_km2)— equal-area sub-basin partition.WatershedRaster.statistics(...)gainedlongest_flow_path_m(via the sharedkahn_max_upslope_lengthKahn pass). Triggers onflow_directionalone after the M1 review fix.FlowDirection.upslope_flowpath_length()— per-cell longest upslope flow path.
Hydrology — indices and Monte-Carlo (W-10 → W-14, W-20)
DEM.hand(..., method="euclidean")— nearest-stream-by-2D-distance HAND variant; drops stream cells on no-data DEM positions with aUserWarning(M2 / L2 review fixes).DEM.stochastic_depressions(sigma, n_runs, seed)— Monte-Carlo per-cell depression-occurrence probability (Lindsay & Creed 2006).DEM.twi(accumulation, slope_deg=None)— Beven & Kirkby 1979 wetness index.DEM.spi(accumulation, slope_deg=None)— stream power index.DEM.sti(accumulation, slope_deg=None)— Moore & Burch 1986 sediment transport index.DEM.full_hydro_pipeline(...)— composite fill → flow_direction → accumulate (+ optional streams) returning a typed-results dict.
LiDAR (W-15 → W-19)
LasPointsdataclass +read_las/write_lasvia soft-importedlaspy.classify_ground(method="zhang")— Zhang 2003 morphological tophat ground filter.grid_lidar_points(aggregate=...)extended withidw/nn/tin(linear barycentric) /rbfinterpolation plus acountdensity aggregator.clip/merge/filter_classes— vector clip + concatenation + ASPRS-class subset onLasPoints.detect_trees(chm, min_height_m, radius_fn)— variable-window local-maxima tree detection on a canopy height model.
Terrain attributes (W-21 → W-28)
DEM.tpi(window)— Guisan 1999 Topographic Position Index.DEM.deviation_from_mean(window)— standardised TPI.DEM.elev_std(window)— focal-window standard deviation of elevation.DEM.ruggedness(window)— Riley et al. 1999 terrain ruggedness index.DEM.curvature(kind="plan"/"profile"/"total"/"mean"/"gaussian")— Zevenbergen-Thorne 1987 curvature family.DEM.normal_vector_deviation(window)— surface-normal angular deviation roughness metric.DEM.openness(search_radius, kind="positive"/"negative")— Yokoyama 2002 topographic openness.DEM.sky_view_factor(search_radius)— Zakšek et al. 2011 sky-view factor.
Shared private helpers: _focal_window_stats (no-data-aware focal mean / SD) and
_numba.horizon_walk_kernel (numba-accelerated 8-azimuth horizon scan).
Phase-4 backfill (P29 – P34)
cloud_io.tile_windows/cloud_io.write_cog— chunked-tile iteration and Cloud-Optimized GeoTIFF writes.topobathy_fusion(method=...)— 4-mode topobathy blend (max/min/topo_above/bathy_below).Mesh— triangle-mesh container with Laplacian smoothing and aspect-ratio quality metrics.grid_lidar_points(foundation that W-17 extended).DEM.anudem_interpolate— Hutchinson 1989 biharmonic ANUDEM.FlowDirection.subbasins_pfafstetter(accumulation, streams, level=N)— multi-level Pfafstetter coding (levels 1 and 2; deeper recursion deferred).
Dependencies
cleopatraremoved (now sourced transitively throughpyramids-gis[viz]).pyramids-gisbumped from0.9.1→0.18.0.gdal >=3.10andnumba >=0.60,<1added as hard deps to keep PyPI and pixi installs in sync.
Documentation
- New guides: hydrology pipeline, watershed analytics, terrain indices, LiDAR pipeline.
- New reference pages:
FlowDirection,Accumulation,StreamRaster,WatershedRaster,LiDAR,Mesh,Cloud I/O,Topobathy fusion.
0.1.0 (2025-09-**)#
- First release on PyPI.