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