Optimize false-negative tile coverage review
This commit is contained in:
@@ -116,6 +116,8 @@ def load_tiles(
|
||||
manifest = load_json(manifest_path)
|
||||
rasterio = dependencies["rasterio"]
|
||||
box = dependencies["box"]
|
||||
Transformer = dependencies["Transformer"]
|
||||
transform_geometry = dependencies["transform"]
|
||||
raw_paths = [
|
||||
str(tile.get("path") or "").strip()
|
||||
for tile in manifest.get("tiles") or []
|
||||
@@ -130,11 +132,15 @@ def load_tiles(
|
||||
with rasterio.open(tile_path) as source:
|
||||
if not source.crs:
|
||||
raise SystemExit(f"Source tile has no CRS: {tile_path}")
|
||||
source_geometry = box(*source.bounds)
|
||||
to_wgs84 = Transformer.from_crs(source.crs, "EPSG:4326", always_xy=True)
|
||||
tiles.append(
|
||||
{
|
||||
"path": str(tile_path),
|
||||
"crs": source.crs,
|
||||
"geometry": box(*source.bounds),
|
||||
"geometry_wgs84": transform_geometry(
|
||||
to_wgs84.transform, source_geometry
|
||||
),
|
||||
}
|
||||
)
|
||||
return tiles
|
||||
@@ -143,21 +149,16 @@ def load_tiles(
|
||||
def choose_source_tile(
|
||||
geometry: Any,
|
||||
tiles: list[dict[str, Any]],
|
||||
dependencies: dict[str, Any],
|
||||
) -> str | None:
|
||||
Transformer = dependencies["Transformer"]
|
||||
transform_geometry = dependencies["transform"]
|
||||
candidates: list[tuple[float, float, str]] = []
|
||||
for tile in tiles:
|
||||
transformer = Transformer.from_crs("EPSG:4326", tile["crs"], always_xy=True)
|
||||
projected = transform_geometry(transformer.transform, geometry)
|
||||
intersection = projected.intersection(tile["geometry"])
|
||||
intersection = geometry.intersection(tile["geometry_wgs84"])
|
||||
if intersection.is_empty:
|
||||
continue
|
||||
candidates.append(
|
||||
(
|
||||
float(intersection.area),
|
||||
-float(projected.centroid.distance(tile["geometry"].centroid)),
|
||||
-float(geometry.centroid.distance(tile["geometry_wgs84"].centroid)),
|
||||
tile["path"],
|
||||
)
|
||||
)
|
||||
@@ -264,7 +265,7 @@ def read_population(
|
||||
or feature.get("id")
|
||||
)
|
||||
area_m2 = abs(float(geod.geometry_area_perimeter(geometry)[0]))
|
||||
source_tile_path = choose_source_tile(geometry, tiles, dependencies)
|
||||
source_tile_path = choose_source_tile(geometry, tiles)
|
||||
if source_tile_path is None:
|
||||
outside_tile_coverage.append(
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user