Files
GeoData/tests/test_river_continuity.py

81 lines
2.7 KiB
Python

import unittest
import numpy as np
from osgeo import gdal, ogr, osr
from geodata_pipeline.river_erosion import _build_order_lines, _tile_geotransform
from geodata_pipeline.config import RiverErosionProfileConfig
class TestRiverContinuity(unittest.TestCase):
def setUp(self):
# Create a simple river line crossing x=1000
# River flows from (500, 500) to (1500, 500)
self.srs = osr.SpatialReference()
self.srs.ImportFromEPSG(25832)
self.river_geom = ogr.Geometry(ogr.wkbLineString)
self.river_geom.AddPoint(500.0, 500.0)
self.river_geom.AddPoint(1500.0, 500.0)
# Mock Layer
self.driver = ogr.GetDriverByName("Memory")
self.ds = self.driver.CreateDataSource("wrk")
self.layer = self.ds.CreateLayer("rivers", srs=self.srs)
field_defn = ogr.FieldDefn("ORD_STRA", ogr.OFTInteger)
self.layer.CreateField(field_defn)
feat = ogr.Feature(self.layer.GetLayerDefn())
feat.SetGeometry(self.river_geom)
feat.SetField("ORD_STRA", 5)
self.layer.CreateFeature(feat)
self.profile = RiverErosionProfileConfig() # Defaults
self.transform = osr.CoordinateTransformation(self.srs, self.srs) # Identity
def test_continuity_at_boundary(self):
# Tile A: 0-1000. Mosaic (3x3): -1000 to 2000.
bounds_a = (-1000.0, -1000.0, 2000.0, 2000.0)
# Resolution 1m -> 3000 x 3000 pixels
w_a = 3001 # 3 tiles * 1000m + 1
h_a = 3001
# Tile B: 1000-2000. Mosaic (3x3): 0 to 3000.
bounds_b = (0.0, -1000.0, 3000.0, 2000.0)
w_b = 3001
h_b = 3001
# Rasterize A
res_a = _build_order_lines(
[(self.layer, "rivers")],
bounds_a, w_a, h_a,
self.profile, self.transform, self.transform, self.srs
)
# Rasterize B
res_b = _build_order_lines(
[(self.layer, "rivers")],
bounds_b, w_b, h_b,
self.profile, self.transform, self.transform, self.srs
)
# Compare at X=1000
# For A: X=1000 is at index 2000 (0 -> 1000 is 1000px, -1000 start)
# origin_a = -1000. 1000 - (-1000) = 2000.
col_a = 2000
# For B: X=1000 is at index 1000
# origin_b = 0. 1000 - 0 = 1000.
col_b = 1000
# Compare a vertical slice at the seam
slice_a = res_a[:, col_a]
slice_b = res_b[:, col_b]
# They should be identical
diff = np.abs(slice_a - slice_b)
max_diff = np.max(diff)
self.assertEqual(max_diff, 0.0, f"Seam mismatch found! Max diff: {max_diff}")
if __name__ == "__main__":
unittest.main()