"""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