Reject same-year post-mosaic building labels
GeoIntel release gates / Compile, test, contracts and builds (push) Canceled after 0s
GeoIntel release gates / Python and npm vulnerability policy (push) Canceled after 0s
GeoIntel release gates / GIS image, SBOM and container scan (push) Canceled after 0s

This commit is contained in:
Jens
2026-07-30 03:35:15 +02:00
parent f7e12230cf
commit 5ac3238c27
2 changed files with 44 additions and 3 deletions
@@ -134,6 +134,38 @@ def test_normalizer_rejects_features_created_after_dated_imagery(tmp_path: Path)
assert audit["decision_counts"] == {"accepted": 1, "created_after_imagery_period": 1}
def test_normalizer_rejects_same_year_feature_after_annual_mosaic_start(tmp_path: Path) -> None:
raster_path = tmp_path / "image.tif"
with rasterio.open(
raster_path, "w", driver="GTiff", width=100, height=100, count=3,
dtype="uint8", crs="EPSG:4326", transform=from_origin(4.0, 51.0, 0.001, 0.001),
) as dataset:
dataset.write(np.zeros((3, 100, 100), dtype="uint8"))
geometry = {
"type": "Polygon",
"coordinates": [[[4.01, 50.99], [4.02, 50.99], [4.02, 50.98], [4.01, 50.98], [4.01, 50.99]]],
}
reference_path = tmp_path / "reference.geojson"
reference_path.write_text(json.dumps({
"type": "FeatureCollection",
"features": [{"type": "Feature", "properties": {"BEGINDATUM": "2025-08-18"}, "geometry": geometry}],
}), encoding="utf-8")
normalized, audit = module.normalize(
reference_path=reference_path,
raster_path=raster_path,
source_name="grb",
min_label_px=3,
imagery_observed_at="2025-01-01T00:00:00Z",
imagery_valid_to="2025-12-31T23:59:59Z",
reference_observed_at="2026-07-01T00:00:00Z",
)
assert normalized["features"] == []
assert audit["decision_counts"] == {"created_after_imagery_period": 1}
assert audit["imagery_feature_creation_cutoff"] == "2025-01-01T00:00:00+00:00"
def test_normalizer_merges_only_touching_visible_roof_instances(tmp_path: Path) -> None:
raster_path = tmp_path / "image.tif"
with rasterio.open(