diff --git a/STEP_RECORD.md b/STEP_RECORD.md index 4a53e09..b041575 100644 --- a/STEP_RECORD.md +++ b/STEP_RECORD.md @@ -18,7 +18,7 @@ Remote: `ssh://git@nas:2222/tei/pbf.git` 1. 唐津 20 海里 - `Style: karatsu-final-style-r12-20260401-1746 (style.navsea-delivery-karatsu-20nm-final.json)` - - `PBF: karatsu-final-pbf-20nm-20260401-0248 (pbf-delivery-karatsu-20nm-final)` + - `PBF: karatsu-final-pbf-20nm-20260402-0015 (pbf-delivery-karatsu-20nm-final)` 2. 九州 - `Style: kyushu-style-r1-20260331-2205 (style.navsea-delivery-kyushu.json)` @@ -251,6 +251,15 @@ Remote: `ssh://git@nas:2222/tei/pbf.git` - 当前观察结论: - 放大后,博多港中央航路、航路边界、内港设施三块已经基本贴近 - 当前剩余差异更多是陆域底色/标签细部,不再是对象丢失或明显错图标 +- `p高さ制限` 这一类对象已经确认不是“分解错物体”: + - 原始 `fid=8017842 / 名称=荒津大橋 / 高さ(m)=38` + - final 里仍是同一点,`name_ja=荒津大橋 / chart_label_text=38` + - 当前 style 仍按原始版思路分成: + - 名称层:桥名 + - 数值层:`高さ` + 数值 + `m` +- 这一类的 `canonical_object_type` 已从日文值改为英文: + - `p高さ制限 -> clearance_limit_point` + - 当前 final 统计:`clearance_limit_point = 33` - 当前正式审计顺序已经明确为: - 先 `object preservation audit` - 再 `render audit` diff --git a/navsea_minimize_release_tiles.py b/navsea_minimize_release_tiles.py index 0512d8f..7ab7459 100644 --- a/navsea_minimize_release_tiles.py +++ b/navsea_minimize_release_tiles.py @@ -46,6 +46,20 @@ def clone_value(dst_value: vector_tile_pb2.tile.value, src_value: vector_tile_pb dst_value.CopyFrom(src_value) +def rewrite_release_value(layer_name: str, key: str, src_value: vector_tile_pb2.tile.value) -> vector_tile_pb2.tile.value | None: + if key != "canonical_object_type": + return None + if layer_name == "clearance_limit_point" and src_value.HasField("string_value") and src_value.string_value == "p高さ制限": + dst_value = vector_tile_pb2.tile.value() + dst_value.string_value = "clearance_limit_point" + return dst_value + if layer_name == "clearance_limit_line" and src_value.HasField("string_value") and src_value.string_value == "L高さ制限": + dst_value = vector_tile_pb2.tile.value() + dst_value.string_value = "clearance_limit_line" + return dst_value + return None + + def strip_tile_properties(raw_tile: bytes, allowlist: set[str] | frozenset[str]) -> bytes: src_tile = vector_tile_pb2.tile() src_tile.ParseFromString(raw_tile) @@ -83,11 +97,13 @@ def strip_tile_properties(raw_tile: bytes, allowlist: set[str] | frozenset[str]) kept_key_index[src_key_idx] = dst_key_idx src_value = src_layer.values[src_val_idx] - value_sig = (src_val_idx, src_value.SerializeToString()) + rewritten_value = rewrite_release_value(src_layer.name, key, src_value) + effective_value = rewritten_value or src_value + value_sig = (src_val_idx, effective_value.SerializeToString()) dst_val_idx = kept_value_index.get(value_sig) if dst_val_idx is None: dst_val_idx = len(dst_layer.values) - clone_value(dst_layer.values.add(), src_value) + clone_value(dst_layer.values.add(), effective_value) kept_value_index[value_sig] = dst_val_idx dst_feature.tags.extend([dst_key_idx, dst_val_idx]) diff --git a/navsea_tile_builder.py b/navsea_tile_builder.py index 925f5d8..981eca0 100644 --- a/navsea_tile_builder.py +++ b/navsea_tile_builder.py @@ -78,6 +78,14 @@ FINAL_RELEASE_PROPERTY_ALLOWLIST = frozenset( ) +def normalize_release_canonical_object_type(source_layer: str, canonical_object_type: str) -> str: + if source_layer == "p高さ制限": + return "clearance_limit_point" + if source_layer == "L高さ制限": + return "clearance_limit_line" + return canonical_object_type + + @dataclass(frozen=True) class DbConfig: host: str = "localhost" @@ -525,7 +533,11 @@ class NavSeaTileBuilder: properties["source_layer_rule_id"] = source_layer_rule_id properties["feature_id"] = row["feature_id"] - properties["canonical_object_type"] = row["canonical_object_type"] + canonical_object_type = normalize_release_canonical_object_type( + source_layer_jp, + text_or_none(row["canonical_object_type"]) or "", + ) + properties["canonical_object_type"] = canonical_object_type properties["canonical_family"] = row["canonical_family"] properties["semantic_key"] = row["semantic_key"] properties["detection_key"] = row["detection_key"] @@ -534,7 +546,7 @@ class NavSeaTileBuilder: properties=properties, source_layer=source_layer_jp, output_layer=output_layer, - canonical_object_type=text_or_none(row["canonical_object_type"]) or "", + canonical_object_type=canonical_object_type, canonical_family=text_or_none(row["canonical_family"]) or "", geom_type=str(source_feature.get("geometry", {}).get("type", "")), feature_id=int(row["feature_id"]), @@ -546,7 +558,7 @@ class NavSeaTileBuilder: properties, field_name_unresolved = self.standardize_output_properties( properties=properties, source_layer=source_layer_jp, - canonical_object_type=text_or_none(row["canonical_object_type"]) or "", + canonical_object_type=canonical_object_type, canonical_family=text_or_none(row["canonical_family"]) or "", geom_type=str(source_feature.get("geometry", {}).get("type", "")), feature_id=int(row["feature_id"]), diff --git a/src/pbf/navsea-compare-karatsu-20nm.html b/src/pbf/navsea-compare-karatsu-20nm.html index 9c05559..7f19d06 100644 --- a/src/pbf/navsea-compare-karatsu-20nm.html +++ b/src/pbf/navsea-compare-karatsu-20nm.html @@ -335,7 +335,7 @@ deliveryStyleUrl: "./domain/style.navsea-delivery-karatsu-20nm-final.json", deliveryTileUrl: "http://192.168.200.184/pbf-delivery-karatsu-20nm-final/{z}/{x}/{y}.pbf", deliveryStyleVersion: "karatsu-final-style-r12-20260401-1746", - deliveryPbfVersion: "karatsu-final-pbf-20nm-20260401-0248", + deliveryPbfVersion: "karatsu-final-pbf-20nm-20260402-0015", deliveryStyleFile: "style.navsea-delivery-karatsu-20nm-final.json", deliveryPbfName: "pbf-delivery-karatsu-20nm-final", initialView: {