feat: consume manifest-driven native roads
This commit is contained in:
51
blender/osmassets/native_roads.py
Normal file
51
blender/osmassets/native_roads.py
Normal file
@@ -0,0 +1,51 @@
|
||||
"""Manifest-driven native road layer adapter."""
|
||||
|
||||
import os
|
||||
|
||||
from osmassets import catalog
|
||||
from osmassets import native_road_manifest
|
||||
from osmassets import roads
|
||||
|
||||
|
||||
def _material(material_layers, name):
|
||||
if name not in material_layers:
|
||||
raise RuntimeError("Native road manifest references unknown materialLayer: " + name)
|
||||
return material_layers[name]
|
||||
|
||||
|
||||
def _split_filter(split, case):
|
||||
if not split:
|
||||
return None
|
||||
prop = split["prop"]
|
||||
if "match" in case:
|
||||
return lambda props: props.get(prop) == case["match"]
|
||||
matches = {item["match"] for item in split["cases"] if "match" in item}
|
||||
return lambda props: props.get(prop) not in matches
|
||||
|
||||
|
||||
def assemble(native_road_dir, projector, collection, material_layers):
|
||||
manifest = native_road_manifest.load(native_road_dir)
|
||||
z_by_material_layer = {layer["id"]: layer["z"] for layer in catalog.ROAD_LAYERS}
|
||||
counts = {}
|
||||
for spec in manifest["layers"]:
|
||||
source = spec["source"]
|
||||
role = spec["role"]
|
||||
source_path = os.path.join(native_road_dir, "layers", source + ".geojson")
|
||||
if role == "semantic":
|
||||
continue
|
||||
material_name = spec["materialLayer"]
|
||||
if material_name not in z_by_material_layer:
|
||||
raise RuntimeError("Native road manifest references unknown materialLayer: " + material_name)
|
||||
_material(material_layers, material_name)
|
||||
count = 0
|
||||
split = spec.get("splitBy")
|
||||
cases = split.get("cases", []) if split else [{"default": True, "material": material_name}]
|
||||
for case in cases:
|
||||
case_material_name = case.get("material", material_name)
|
||||
case_material = _material(material_layers, case_material_name)
|
||||
suffix = "_" + str(case["match"]) if "match" in case else ""
|
||||
count += roads.assemble_geojson_layer(
|
||||
source_path, source + suffix, projector, collection, case_material,
|
||||
z_by_material_layer[material_name], _split_filter(split, case))
|
||||
counts[source] = count
|
||||
return counts
|
||||
Reference in New Issue
Block a user