from pathlib import Path import numpy as np import rasterio from rasterio.transform import from_origin from app.core.geo import PathPoint from app.core.landcover import landcover_path, worldcover_class def write_raster(path: Path, data: np.ndarray, nodata: float = -9999.0) -> None: transform = from_origin(30.0, 60.0, 0.01, 0.01) with rasterio.open( path, "w", driver="GTiff", height=data.shape[0], width=data.shape[1], count=1, dtype=data.dtype, crs="EPSG:4326", transform=transform, nodata=nodata, ) as dataset: dataset.write(data, 1) def test_worldcover_class_mapping() -> None: assert worldcover_class(10) == "tree_cover" assert worldcover_class(50) == "built_up" assert worldcover_class(255) == "unknown" def test_landcover_path_segments_and_vegetation_depth(tmp_path: Path) -> None: landcover_dir = tmp_path / "landcover" canopy_dir = tmp_path / "canopy" landcover_dir.mkdir() canopy_dir.mkdir() write_raster( landcover_dir / "worldcover.tif", np.array([[10, 10, 50, 50]], dtype="uint8"), nodata=0, ) write_raster( canopy_dir / "canopy.tif", np.array([[12.0, 14.0, 0.0, 0.0]], dtype="float32"), ) points = [ PathPoint(lat=59.995, lon=30.005, distance_m=0), PathPoint(lat=59.995, lon=30.015, distance_m=10), PathPoint(lat=59.995, lon=30.025, distance_m=20), PathPoint(lat=59.995, lon=30.035, distance_m=30), ] result = landcover_path(points, landcover_dir, canopy_dir) assert result.vegetation_depth_m == 20 assert len(result.segments) == 2 assert result.segments[0].class_name == "tree_cover" assert result.segments[0].forest_type == "unknown" assert result.segments[0].canopy_height_m == 13.0 assert result.segments[1].class_name == "built_up"