From b52b3447cfcc3926bbeb5d28468d2f37d791a06a Mon Sep 17 00:00:00 2001 From: kaotei Date: Fri, 11 Sep 2026 18:10:56 +0800 Subject: [PATCH] Checkpoint CM95 PBF production code and docs for Linux migration --- NavSea_CM95接入规范-v1.md | 229 + PACKAGE_MANIFEST_SHA256.txt | 62 + README.txt | 35 + cm95_karatsu_aoi_mapping_audit_v1.py | 1008 ++ .../AOI_Cell清单_v1.csv | 1 + .../AOI_Feature样本_v1.jsonl | 0 .../AOI_关联对象样本_v1.jsonl | 0 .../AOI_对象映射准备表_v1.csv | 1 + .../AOI报告_v1.json | 45 + .../对象字典_v1.csv | 1 + .../对象类别尺度分布_v1.csv | 1 + .../对象类别汇总_v1.csv | 1 + .../属性值域汇总_v1.csv | 1 + .../属性字典_v1.csv | 1 + .../属性字段汇总_v1.csv | 1 + .../摘要_v1.txt | 18 + cm95_karatsu_presence_diagnostic_v2.json | 1981 +++ cm95_karatsu_presence_diagnostic_v2.py | 304 + cm95_nav_aid_relation_audit_v1.json | 4794 +++++++ cm95_nav_aid_relation_audit_v1.txt | 14 + cm95_nav_aid_relation_groups_v1.csv | 94 + cm95_nav_name_candidate_audit_v1.py | 546 + cm95_nav_name_candidates_v1.csv | 18 + cm95_nav_name_candidates_v1.json | 448 + cm95_nav_name_candidates_v1.txt | 12 + cm95_nav_name_multiscale_audit_v2.json | 10329 ++++++++++++++++ cm95_nav_name_multiscale_audit_v2.txt | 36 + cm95_nav_name_multiscale_groups_v2.csv | 137 + cm95_nav_text_relation_fields_v2.csv | 1 + cm95_navsea_selected_aoi_mapping_audit_v2.py | 1008 ++ cm95_pbf_aoi_candidates_v1.csv | 41 + cm95_pbf_aoi_candidates_v1.json | 4411 +++++++ cm95_pbf_aoi_candidates_v1.txt | 38 + cm95_select_pbf_test_aoi_v1.py | 415 + .../AOI_Cell清单_v1.csv | 8 + .../AOI_Feature样本_v1.jsonl | 600 + .../AOI_关联对象样本_v1.jsonl | 0 .../AOI_对象映射准备表_v1.csv | 81 + .../AOI报告_v1.json | 627 + .../对象字典_v1.csv | 68 + .../对象类别尺度分布_v1.csv | 204 + .../对象类别汇总_v1.csv | 81 + .../属性值域汇总_v1.csv | 681 + .../属性字典_v1.csv | 73 + .../属性字段汇总_v1.csv | 178 + .../摘要_v1.txt | 23 + ...95_gap_disposition_japan_dataset_1_v1.yaml | 1502 +++ config/mappings/cm95_gap_disposition_v1.yaml | 1284 ++ config/mappings/cm95_to_navsea_v1.yaml | 1522 +++ config/pbf/cm95_production_v1.yaml | 18 + ...cm95_tile_policy_japan_full_detail_v1.yaml | 96 + config/pbf/cm95_tile_policy_v1.yaml | 51 + .../cm95_v1_4_5_nonrenderable_label_tiles.txt | 18 + config/sprite/semantic-sprite-20260808.json | 3334 +++++ ...ull-semantic-unified-20260808-cm95-v1.json | 2496 ++++ docs/25个新增映射缺口分类说明_v1.md | 58 + docs/CM95_21张PBF对照审计_v1.md | 84 + docs/CM95_PBF_Pilot生成器设计_v1.md | 205 + ...95_PBF_v1.4.7_导航名称冲突审计式省略_v1.md | 70 + docs/CM95_PBF_v1_2变更说明.md | 37 + docs/CM95_PBF_v1_3变更说明.md | 35 + docs/CM95_PBF_v1_4_3离线自检报告_v1.md | 52 + docs/CM95_PBF生产化阶段_v1_4.md | 97 + docs/CM95_PBF生产化阶段_v1_4_1.md | 56 + docs/CM95_PBF生产化阶段_v1_4_2.md | 28 + docs/CM95_PBF生产化阶段_v1_4_3.md | 146 + docs/CM95_PBF生产化阶段_v1_4_4.md | 66 + docs/CM95_PBF生产化阶段_v1_4_5.md | 42 + docs/CM95_PBF生产化阶段_v1_4_6.md | 116 + docs/CM95_助航名称规则冻结_v1.md | 47 + docs/CM95到NavSea映射设计报告_v1.md | 389 + docs/PBF03_离线自检报告_v1.md | 35 + docs/PBF03_离线自检报告_v1_1.md | 34 + ...5_global_mapping_gap_closure_audit_v2.json | 866 ++ docs/cm95_mapping_contract_check_v1.json | 12 + docs/cm95_mapping_contract_check_v1_1.json | 12 + docs/cm95_mapping_contract_check_v1_4_3.json | 12 + pyproject.toml | 7 +- requirements.txt | 2 + scripts/cm95_japan_continue_from_step8.ps1 | 392 + scripts/cm95_japan_full_rebuild_pipeline.ps1 | 946 ++ scripts/cm95_japan_v1_4_6_continue.ps1 | 280 + .../cm95_japan_v1_4_7_finalize_existing.ps1 | 153 + src/cm95pbf/__init__.py | 2 + src/cm95pbf/builder.py | 1939 +++ src/cm95pbf/cli.py | 360 + src/cm95pbf/identity.py | 329 + src/cm95pbf/mapping.py | 495 + src/cm95pbf/policy.py | 98 + src/cm95pbf/production.py | 826 ++ src/cm95pbf/release.py | 466 + src/cm95pbf/style_contract.py | 174 + tools/cm95_global_mapping_gap_audit_v1.py | 611 + ...m95_global_mapping_gap_closure_audit_v2.py | 105 + tools/cm95_mapping_contract_check_v1.py | 190 + tools/cm95_nav_aid_relation_audit_v1.py | 375 + tools/cm95_nav_name_candidate_audit_v1.py | 546 + tools/cm95_nav_name_conflict_audit_v1.py | 285 + tools/cm95_nav_name_multiscale_audit_v2.py | 716 ++ tools/cm95_pbf_build_reports_audit_v1.py | 112 + tools/cm95_pbf_output_audit_v1.py | 185 + tools/cm95_pbf_style_contract_audit_v2.py | 190 + tools/cm95_production_failure_audit_v1.py | 338 + tools/cm95_production_plan_audit_v1.py | 119 + ...m95_style_contract_unmatched_extract_v1.py | 328 + tools/cm95_v1_4_5_preflight.py | 103 + tools/cm95_v1_4_6_preflight.py | 100 + tools/cm95_v1_4_6_query_equivalence.py | 254 + tools/cm95_v1_4_7_preflight.py | 92 + web/cm95_web.py | 140 + web/index.html | 67 + web/style.json | 2496 ++++ 使用说明.txt | 31 + 替换与下一步说明.md | 86 + 替换与执行说明.md | 29 + 替换说明.md | 54 + 116 files changed, 55495 insertions(+), 2 deletions(-) create mode 100644 NavSea_CM95接入规范-v1.md create mode 100644 PACKAGE_MANIFEST_SHA256.txt create mode 100644 README.txt create mode 100644 cm95_karatsu_aoi_mapping_audit_v1.py create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_Cell清单_v1.csv create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_Feature样本_v1.jsonl create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_关联对象样本_v1.jsonl create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_对象映射准备表_v1.csv create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI报告_v1.json create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象字典_v1.csv create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象类别尺度分布_v1.csv create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象类别汇总_v1.csv create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性值域汇总_v1.csv create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性字典_v1.csv create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性字段汇总_v1.csv create mode 100644 cm95_karatsu_mapping_audit_dataset_1_20260903_080633/摘要_v1.txt create mode 100644 cm95_karatsu_presence_diagnostic_v2.json create mode 100644 cm95_karatsu_presence_diagnostic_v2.py create mode 100644 cm95_nav_aid_relation_audit_v1.json create mode 100644 cm95_nav_aid_relation_audit_v1.txt create mode 100644 cm95_nav_aid_relation_groups_v1.csv create mode 100644 cm95_nav_name_candidate_audit_v1.py create mode 100644 cm95_nav_name_candidates_v1.csv create mode 100644 cm95_nav_name_candidates_v1.json create mode 100644 cm95_nav_name_candidates_v1.txt create mode 100644 cm95_nav_name_multiscale_audit_v2.json create mode 100644 cm95_nav_name_multiscale_audit_v2.txt create mode 100644 cm95_nav_name_multiscale_groups_v2.csv create mode 100644 cm95_nav_text_relation_fields_v2.csv create mode 100644 cm95_navsea_selected_aoi_mapping_audit_v2.py create mode 100644 cm95_pbf_aoi_candidates_v1.csv create mode 100644 cm95_pbf_aoi_candidates_v1.json create mode 100644 cm95_pbf_aoi_candidates_v1.txt create mode 100644 cm95_select_pbf_test_aoi_v1.py create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_Cell清单_v1.csv create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_Feature样本_v1.jsonl create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_关联对象样本_v1.jsonl create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_对象映射准备表_v1.csv create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI报告_v1.json create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象字典_v1.csv create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象类别尺度分布_v1.csv create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象类别汇总_v1.csv create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性值域汇总_v1.csv create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性字典_v1.csv create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性字段汇总_v1.csv create mode 100644 cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/摘要_v1.txt create mode 100644 config/mappings/cm95_gap_disposition_japan_dataset_1_v1.yaml create mode 100644 config/mappings/cm95_gap_disposition_v1.yaml create mode 100644 config/mappings/cm95_to_navsea_v1.yaml create mode 100644 config/pbf/cm95_production_v1.yaml create mode 100644 config/pbf/cm95_tile_policy_japan_full_detail_v1.yaml create mode 100644 config/pbf/cm95_tile_policy_v1.yaml create mode 100644 config/pbf/cm95_v1_4_5_nonrenderable_label_tiles.txt create mode 100644 config/sprite/semantic-sprite-20260808.json create mode 100644 config/style/style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json create mode 100644 docs/25个新增映射缺口分类说明_v1.md create mode 100644 docs/CM95_21张PBF对照审计_v1.md create mode 100644 docs/CM95_PBF_Pilot生成器设计_v1.md create mode 100644 docs/CM95_PBF_v1.4.7_导航名称冲突审计式省略_v1.md create mode 100644 docs/CM95_PBF_v1_2变更说明.md create mode 100644 docs/CM95_PBF_v1_3变更说明.md create mode 100644 docs/CM95_PBF_v1_4_3离线自检报告_v1.md create mode 100644 docs/CM95_PBF生产化阶段_v1_4.md create mode 100644 docs/CM95_PBF生产化阶段_v1_4_1.md create mode 100644 docs/CM95_PBF生产化阶段_v1_4_2.md create mode 100644 docs/CM95_PBF生产化阶段_v1_4_3.md create mode 100644 docs/CM95_PBF生产化阶段_v1_4_4.md create mode 100644 docs/CM95_PBF生产化阶段_v1_4_5.md create mode 100644 docs/CM95_PBF生产化阶段_v1_4_6.md create mode 100644 docs/CM95_助航名称规则冻结_v1.md create mode 100644 docs/CM95到NavSea映射设计报告_v1.md create mode 100644 docs/PBF03_离线自检报告_v1.md create mode 100644 docs/PBF03_离线自检报告_v1_1.md create mode 100644 docs/cm95_global_mapping_gap_closure_audit_v2.json create mode 100644 docs/cm95_mapping_contract_check_v1.json create mode 100644 docs/cm95_mapping_contract_check_v1_1.json create mode 100644 docs/cm95_mapping_contract_check_v1_4_3.json create mode 100644 scripts/cm95_japan_continue_from_step8.ps1 create mode 100644 scripts/cm95_japan_full_rebuild_pipeline.ps1 create mode 100644 scripts/cm95_japan_v1_4_6_continue.ps1 create mode 100644 scripts/cm95_japan_v1_4_7_finalize_existing.ps1 create mode 100644 src/cm95pbf/__init__.py create mode 100644 src/cm95pbf/builder.py create mode 100644 src/cm95pbf/cli.py create mode 100644 src/cm95pbf/identity.py create mode 100644 src/cm95pbf/mapping.py create mode 100644 src/cm95pbf/policy.py create mode 100644 src/cm95pbf/production.py create mode 100644 src/cm95pbf/release.py create mode 100644 src/cm95pbf/style_contract.py create mode 100644 tools/cm95_global_mapping_gap_audit_v1.py create mode 100644 tools/cm95_global_mapping_gap_closure_audit_v2.py create mode 100644 tools/cm95_mapping_contract_check_v1.py create mode 100644 tools/cm95_nav_aid_relation_audit_v1.py create mode 100644 tools/cm95_nav_name_candidate_audit_v1.py create mode 100644 tools/cm95_nav_name_conflict_audit_v1.py create mode 100644 tools/cm95_nav_name_multiscale_audit_v2.py create mode 100644 tools/cm95_pbf_build_reports_audit_v1.py create mode 100644 tools/cm95_pbf_output_audit_v1.py create mode 100644 tools/cm95_pbf_style_contract_audit_v2.py create mode 100644 tools/cm95_production_failure_audit_v1.py create mode 100644 tools/cm95_production_plan_audit_v1.py create mode 100644 tools/cm95_style_contract_unmatched_extract_v1.py create mode 100644 tools/cm95_v1_4_5_preflight.py create mode 100644 tools/cm95_v1_4_6_preflight.py create mode 100644 tools/cm95_v1_4_6_query_equivalence.py create mode 100644 tools/cm95_v1_4_7_preflight.py create mode 100644 web/cm95_web.py create mode 100644 web/index.html create mode 100644 web/style.json create mode 100644 使用说明.txt create mode 100644 替换与下一步说明.md create mode 100644 替换与执行说明.md create mode 100644 替换说明.md diff --git a/NavSea_CM95接入规范-v1.md b/NavSea_CM95接入规范-v1.md new file mode 100644 index 0000000..80da766 --- /dev/null +++ b/NavSea_CM95接入规范-v1.md @@ -0,0 +1,229 @@ +# NavSea CM95 接入规范 + +版本:`v1` +状态:首版实施规范 +用途:定义将具备合法使用授权的 CM95 海图数据转换为 PBF,并直接接入现有 NavSea Full semantic style 的数据契约、实施顺序和验收门禁。 + +## 1. 结论 + +CM95 必须向 NavSea 的既有 PBF 契约靠齐;不为 CM95 重写一套海图 style,也不允许把 CM95 原始对象类别直接暴露给前端 style。 + +当前接入基线为: + +- style:[`src/pbf/style.navsea-delivery-full-semantic-unified-20260808.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-full-semantic-unified-20260808.json) +- sprite:`http://192.168.200.184/newpec/sprite-semantic-unified-20260808/sprite` +- glyphs:`http://192.168.200.184/newpec/fonts/{fontstack}/{range}.pbf` + +CM95 转换产物必须满足该 style 的 `source-layer`、字段和值域要求。满足后,新 style 只需复制基线文件并修改 `sources.navsea_delivery.tiles` 的瓦片地址。 + +## 2. 边界与前提 + +- 仅处理已获授权解码、转换、缓存和部署的 CM95 数据。 +- CM95 解码器不属于本仓库交付物;本规范的输入是已经合法导出的矢量要素及其属性。 +- 转换过程不得篡改海图几何、深度、净空、航标与危险物的原始业务含义。 +- 所有要素必须有稳定的上游对象身份;若 CM95 未提供全局稳定 ID,必须由“数据集版本 + 原始 cell/record ID + 几何类型”生成可复现的 `source_id`。 +- 第一版只追求“复用当前 style 并可审计”,不以压缩字段或全国一次性全量生产为目标。 + +## 3. 目标架构 + +```text +CM95 合法导出数据 + -> CM95 解析与原始对象归档 + -> CM95→NavSea 语义/渲染映射 + -> NavSea 兼容要素集 + -> Web Mercator MVT/PBF + -> 现有 NavSea Full semantic style +``` + +其中“CM95→NavSea 语义/渲染映射”是唯一允许理解 CM95 原始类别与属性差异的层。MVT 和 style 只消费 NavSea 的标准图层与字段。 + +## 4. 固定图层契约 + +第一版 PBF 的图层名称必须与当前 style 完全一致。不得随意以 CM95 对象名作为图层名。 + +| 业务类别 | 目标 `source-layer` | +| --- | --- | +| 海域底色、水深区 | `baseline_area`、`depth_zone_739`、`depth_zone_741` | +| 海岸、陆地与岸线 | `land_area`、`baseline_line`、`baseline_outline` | +| 等深线与测深文字 | `depth_contour`、`bathymetry_line`、`seabed_text_point` | +| 航标、灯塔、浮标、灯弧 | `navigation_marks` | +| 航行危险物 | `navigation_hazard_point`、`navigation_hazard_area`、`navigation_hazard_outline` | +| 锚泊及锚泊注意 | `anchorage_point`、`anchorage_area`、`anchorage_outline`、`anchor_caution_hazard_point`、`anchor_caution_hazard_area`、`anchor_caution_hazard_outline` | +| 渔具与渔业禁限 | `fixed_fishing_gear_area` | +| 设施、桥梁、净空 | `facility_boundary_point`、`facility_boundary_area`、`facility_boundary_outline`、`bridge_structure`、`clearance_limit_point`、`clearance_limit_line` | +| 地名和陆上设施 | `place_label_sea`、`place_label_land`、`onshore_structure_point`、`onshore_structure_line`、`onshore_structure_area` | +| 其他已由 style 消费的图层 | `pilot_station_point`、`seabed_line`、`submerged_reef_area`、`hazard_boundary_outline`、`hole_area`、`clip_outline_754` | + +未能映射到上述图层的 CM95 对象不得静默丢弃:应写入工程版的 `cm95_unmapped` 隔离层并生成映射缺口报告;该隔离层不进入正式 style。 + +## 5. 字段契约 + +### 5.1 每个已交付要素必须有的字段 + +| 字段 | 要求 | +| --- | --- | +| `fid` | NavSea 稳定、可复现的对象标识;不能使用每次构建都会变化的临时序号。 | +| `canonical_family` | NavSea 大类语义。 | +| `canonical_object_type` | NavSea 细粒度对象类型。 | +| `render_layer` | 与实际 `source-layer` 相同的目标渲染层。 | +| `chart_render_type` | `fill`、`line`、`symbol`、`label` 或 `none`。 | +| `chart_priority` | 绘制/碰撞优先级。 | +| `source_id` | 可回查 CM95 上游对象的稳定标识;工程版必留,交付版建议保留。 | +| `source_dataset_id` | CM95 数据集、cell 或版本标识;工程版必留。 | + +### 5.2 当前 style 的直接渲染字段 + +按对象类型填写以下字段,未适用字段可缺省,但不得以伪造值替代: + +| 对象类别 | 必要或高优先级字段 | +| --- | --- | +| 面与水深区 | `chart_fill_style`、`chart_fill_pattern` | +| 线 | `chart_line_color`、`chart_line_width`、`chart_line_pattern` | +| 图标 | `chart_icon_image`、`chart_symbol_code`、`class_code`、`display_code`、`shape_class_code` | +| 文字 | `chart_label_text`、`chart_label_subtext`、`chart_text_style`、`chart_text_color`、`chart_label_position_code` | +| 灯标 | `light_color_code`、`chart_label_subtext`;有弧段时还需 `arc_id` 与可追溯的原始弧段编码。 | + +`chart_icon_image`、`chart_fill_pattern` 和 `arc_id` 的取值必须是当前 semantic sprite 中真实存在的键。不得写入旧 `symbol-daytime-*`、`fill-daytime-*` 或未经 sprite 审计的新键。 + +### 5.3 CM95 原始属性保留 + +CM95 的原始属性不得直接成为 style 的长期依赖,但工程版必须保留以下可追溯信息: + +- CM95 对象类别/OBJL; +- 原始对象 ID、cell/数据集 ID、更新时间或版本; +- 原始属性全集或其不可逆裁剪前的外部 trace; +- 原始几何类型; +- 映射规则 ID 与映射版本。 + +交付版可裁掉详细 trace,但必须能凭 `fid` 在工程索引中回查到上述信息。 + +## 6. CM95 映射实施方式 + +建立一个版本化映射表,例如 `tasks/pbf/mappings/cm95_to_navsea_v1.yaml`。每条规则至少包含: + +- `cm95_object_class`:CM95 原始对象类别; +- `geometry_type`:点、线、面; +- `condition`:属性条件; +- `target_source_layer`:本规范第 4 节中的目标层; +- `canonical_family`、`canonical_object_type`; +- `style_fields`:需物化的 `chart_*`、灯标、文字或数值字段; +- `rule_id`、`mapping_version`; +- `safety_class`:`hard_gate`、`important` 或 `normal`。 + +映射优先级如下: + +1. 航标、灯火、浮标、灯弧; +2. 暗礁、沉船、障碍物、浅水、干出与露出对象; +3. 水深区、等深线、测深与净空; +4. 海陆边界、陆地、航道、锚地、限制区、渔具; +5. 设施、地名和一般说明。 + +同一 CM95 类别因属性不同而表现不同,必须拆成多条显式规则;不能只按对象类别做一对一映射。 + +## 7. PBF 生成规则 + +- 统一投影为 EPSG:3857,使用 XYZ `z/x/y` 切片。 +- MVT extent 固定为 `4096`,同一目标图层内保持一致。 +- 首版目标 zoom 为 `0–12`;小范围试产可先产出覆盖 AOI 的 `z8–12`。 +- 面、线裁切须带足够 buffer,避免瓦片边缘断裂;点不得因边界判断被重复删除。 +- 保持原始几何类型;不得将面危险物降级为点,或把线界线误转为面。 +- 同一 `fid` 在不同 zoom/tile 的实例可重复出现,但其身份和核心语义必须一致。 +- 构建时输出工程版 PBF、交付版 PBF、映射缺口 JSON/Markdown 和 `fid -> source_id` 审计索引。 + +## 8. Style 接入方式 + +以当前基线 style 复制一个 CM95 部署版本。首版只允许修改以下内容: + +```json +{ + "name": "NavSea CM95 <区域> <版本>", + "sources": { + "navsea_delivery": { + "tiles": ["https:///pbf-cm95-<区域>-<版本>/{z}/{x}/{y}.pbf"] + } + } +} +``` + +保持不变: + +- 全部 layer ID、顺序、filter 和 paint/layout; +- semantic sprite URL; +- glyph URL; +- 外部 tide 与底图 source。 + +若某一类 CM95 数据无法命中现有 style,优先补充映射字段或 sprite 映射;只有确认现有 style 无法表达且完成专项审计后,才允许新增 style layer。 + +## 9. 分阶段交付 + +### 阶段 A:单 AOI 可视化样本 + +- 选择一个含陆地、水深、航标和危险物的港口或近岸 AOI。 +- 导出 CM95 原始对象清单及 `source_id`。 +- 完成第 6 节映射表的最小覆盖。 +- 生成 z8–12 PBF,使用只改 tile URL 的 style 打开。 + +通过条件:底图、水深、等深线、陆地、主要航标和危险物均可显示,且无大面积空白或错误覆盖。 + +### 阶段 B:安全对象闭环 + +- 补齐所有 `hard_gate` 对象的分类、图层和符号字段。 +- 灯火必须同时验证灯色、略记和灯弧(如原始数据提供)。 +- 危险物必须验证水上/水下/露出/干出语义不会画反。 + +通过条件:对象保全审计的安全对象缺失数为 `0`,关键图标/文字/symbol sprite 缺失数为 `0`。 + +### 阶段 C:区域扩展与发布 + +- 扩展至完整目标海域及 z0–12。 +- 收敛未映射对象;剩余对象须有明确的隔离理由和风险结论。 +- 生成正式交付版及可回查工程索引。 + +## 10. 必须执行的审计顺序 + +按项目正式口径执行,不能以视觉相似替代对象保全: + +1. **对象保全审计**:以 `source_id + source_dataset_id + geometry_type` 回对 CM95 原始导出与 PBF;检查缺失、错误重分层、错误合并、身份丢失。 +2. **渲染审计**:扫描 PBF 字段、style 命中和 sprite 资源;检查关键对象是否获得有效 fill、line、icon、text。 +3. **AOI 视觉审计**:在固定中心点和 zoom 检查叠压、边缘裁切、标签、海陆关系与安全感知。 + +CM95 没有“旧 NavSea PBF”可作为对象基准时,CM95 原始导出数据就是第一层审计的基准;不可跳过这一层。 + +## 11. 硬门禁 + +以下任一项不通过,CM95 PBF 不得切换到正式 URL: + +- `hard_gate` 对象存在缺失、身份不可回查或错误图层; +- `chart_icon_image`、`chart_fill_pattern`、`arc_id` 引用不存在的 sprite 键; +- 深度、净空、危险物或灯火发生单位错误、正负号错误或水上/水下语义反转; +- PBF 投影、extent、坐标轴或 tile y 方向错误; +- style 实际加载的 tile URL 不是候选 CM95 PBF; +- 映射缺口被静默丢弃; +- 未完成针对目标 AOI 的人工视觉复核。 + +## 12. 首次实施的输入与产出 + +开始实施前需要提供: + +- 一个合法导出的 CM95 AOI 样本; +- 导出格式和字段/对象类别字典; +- 数据集版本、坐标参考和深度/高度单位说明; +- 目标海域、目标 zoom、部署 PBF URL; +- 至少一个包含航标、危险物、水深区和陆地的验收 AOI。 + +首次实施完成时必须交付: + +- `cm95_to_navsea_v1.yaml` 映射表; +- CM95→NavSea 转换脚本; +- 工程版与交付版 PBF; +- 映射缺口报告、对象保全报告、sprite 闭合报告和 AOI 审计报告; +- 仅替换瓦片 URL 的 CM95 style 文件。 + +## 13. 与既有文档的关系 + +- 本规范定义 CM95 作为新上游数据源时如何接入; +- [NavSea PBF Schema v2](tasks/pbf/NavSea_PBF_schema_v2.md) 定义通用 PBF 字段方向; +- [NavSea Tile Generation Pipeline v2](tasks/pbf/NavSea_tile_generation_pipeline_v2.md) 定义既有原始 PBF→交付 PBF 流程; +- [NavSea 交付前审计规范](NavSea_Delivery_Preflight_Audit_Spec.md) 定义正式交付审计门禁。 + +出现冲突时,以安全对象不丢失、可回查和当前 style 实际字段契约为最高优先级。 diff --git a/PACKAGE_MANIFEST_SHA256.txt b/PACKAGE_MANIFEST_SHA256.txt new file mode 100644 index 0000000..f216ee4 --- /dev/null +++ b/PACKAGE_MANIFEST_SHA256.txt @@ -0,0 +1,62 @@ +# CM95 PBF Production v1.4.7 ROOT OVERLAY +# SHA-256 manifest; this manifest does not hash itself. +40ab19e0b75714e756b8079744121a27b404175abd7c595fa49cb500046d751a config/mappings/cm95_gap_disposition_japan_dataset_1_v1.yaml +2df00c19404adf3510443c615748bff5ecc2789c16da4ea8c2cfd42f3ccc717d config/mappings/cm95_gap_disposition_v1.yaml +3947a326e8e805d7eab357463380b2f303ba75ebe08dce4e4b708bc61416b575 config/mappings/cm95_to_navsea_v1.yaml +f3036ddb3b89a33577bf9d0ae16ca71aaa3726fd83bb365810ab48abce8381eb config/pbf/cm95_production_v1.yaml +8db466b99466a0f15079d6a644049bb30e3a31dca5f6f545a571da8f5d64d4c5 config/pbf/cm95_tile_policy_japan_full_detail_v1.yaml +d56396625f9ef25de274f05222156f06d4b39a91a3d9809bc30b1218bd601f7f config/pbf/cm95_tile_policy_v1.yaml +37aba6d8a12a4500e6599309430f97776e64aeda867c45728d984dcb6fc3ff1a config/pbf/cm95_v1_4_5_nonrenderable_label_tiles.txt +3e89bc20e2465592a2dc70509649e159a958b254452dd26e7d3bf2e8e74e7fb9 config/sprite/semantic-sprite-20260808.json +c11aa7b9410171df8b59f5175885ce0ebd2480706f3699eb7c28b1f4d351aaf4 config/style/style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json +207b2e4ea7eab1cafd549a894c36195fc060516307c2d73b05b52aad650eb3e2 docs/25个新增映射缺口分类说明_v1.md +f7e2f3a6f7ceb7dccd4cc3595e556d296d83300cfb48764b51b80633cb650013 docs/CM95_21张PBF对照审计_v1.md +7a24a5b33aac427f7e2be887ada48b346db7418db86d3087899f630582930e47 docs/CM95_PBF_Pilot生成器设计_v1.md +bba1fadc7d218b89531611afc25bf8c587667947af5bda024185d13dcd3850cb docs/CM95_PBF_v1.4.7_导航名称冲突审计式省略_v1.md +cf75fad5361fd2e502bdeb1a7114631549a36f4fa3f7cc5fd854a672a8c3014f docs/CM95_PBF_v1_2变更说明.md +d9fa32f28b7b4c325f3e17e05798f2b971b132274cfb1e0aff546d838ef78bc8 docs/CM95_PBF_v1_3变更说明.md +b6ba3051caecf9746c5ae091b32c7e8924ad0a6038c8160b61ea6c6ae8610441 docs/CM95_PBF_v1_4_3离线自检报告_v1.md +d6be555db71855a1decc88bb8164c4dd556371880c3818ced2388b415fc7b6fc docs/CM95_PBF生产化阶段_v1_4.md +c545546d76a291f30384b8a20bd5e8fb03a8fea214fac3bee11504c1e6dfadd1 docs/CM95_PBF生产化阶段_v1_4_1.md +e8a6dc017ed7c7a92fd67afed5a014a6860534de6745a5c404bd5541e92e7d1b docs/CM95_PBF生产化阶段_v1_4_2.md +e31ba6dfb53ccc9d69d1108bb8734c101052bdc5b206b4a4b0d7d9eada41212b docs/CM95_PBF生产化阶段_v1_4_3.md +cd6ad3f2e1e6e00dbd230fcad48013330500a03556ae6b5e5bda4577bc8705d4 docs/CM95_PBF生产化阶段_v1_4_4.md +1614b56f51c6c4f2546dfd2b8b02c527ce24bcc5a0877544b925344841da9e56 docs/CM95_PBF生产化阶段_v1_4_5.md +76ab40bfbb90f1a14e8387e16a8ab4942918123eeaf93c0224dac5af796308c4 docs/CM95_PBF生产化阶段_v1_4_6.md +6509ee4fdcd057e2e0a959c92ee3768cd672dc27f570279ee2e0267202da114b docs/CM95_助航名称规则冻结_v1.md +4fec6374e3ec462946cc6fb6cea04f69513c45066eade42ecbb89c7158e7932f docs/PBF03_离线自检报告_v1.md +8daaa1f6e373e1df20c553208e5657a87fcc2f8b291d2164d2240d133bc07252 docs/PBF03_离线自检报告_v1_1.md +69f821a70d2bfb8bdbbd53b5a9f20e591b54a3aaabbbab1d6a7f59d526629eba docs/cm95_global_mapping_gap_closure_audit_v2.json +ebadb6ea5cf3365a22c06ee5c8806e43ef23c1a8358ed9cfba4aae28aa5876ab docs/cm95_mapping_contract_check_v1.json +e527cfe189982ae914bb7f920d7abf8b06c358b132359952e5c9f38be48124f7 docs/cm95_mapping_contract_check_v1_1.json +b22aab3cc1d57f77195f367841ce1f585b8ce0300ee1c11275b3a100a9cba1ab docs/cm95_mapping_contract_check_v1_4_3.json +836fde71f3e012b0613ab8e9069075a420a8b186c8f13559ab6a925fd0536279 pyproject.toml +a460a58863c910fa7593ae36768bf061ed51f956080e9b11497485558d86a6b2 requirements.txt +20080eea2aaa7a672f93143fea66944954e578a81e468e99c7c7de6b995fad63 scripts/cm95_japan_continue_from_step8.ps1 +415b8ffd7d27d81dad461368cfc51c2b2a119cc64f8a44a32b7b3d8d21731c93 scripts/cm95_japan_v1_4_6_continue.ps1 +0819b124050c7c8262f2da081cf9b2db719a478dd9047b79058c8c8a7b24cd2b scripts/cm95_japan_v1_4_7_finalize_existing.ps1 +2ba6a657e19ed96cb7581fd9252a9f36b2c87bf3263cc5cf1a9e3b5701caf68b src/cm95pbf/__init__.py +e0e2bc0bcdf4e52b93cf5af4dbad4cdd4245d6d7b5d6667dfd2181683780b51f src/cm95pbf/builder.py +f9b0f20671aa0860cbfebb0eab83631c26fa02b92b29f863746d5a2f9fdf02c4 src/cm95pbf/cli.py +9ff689390d57950094a97d19ba1d1042640aa07f511198b81f0c8a67c9c32a7b src/cm95pbf/identity.py +1b60945c08766d57c8c50d34979e665c3a63264e758c85f987086f5d3f550500 src/cm95pbf/mapping.py +acf22401be75023d4f01b56c4b4f418310f67687553b4293eda486e89340fe13 src/cm95pbf/policy.py +02befc10a9014ada2aba86054b9e79217dc5d1053da5b4a0ac24b67f06015b62 src/cm95pbf/production.py +fa96143732bf949e28d560a582f5b0a19f9f0a816acd8096b27ce0b0e0554846 src/cm95pbf/release.py +b775aea2807049570f33d493ba8a403ec88e9f1f8c4d487d39d6f6e9b8e38ad2 src/cm95pbf/style_contract.py +18ef07d97145d6030dee0a6e9bac689061b7a4c5ea23a84e40b0231f3699e333 tools/cm95_global_mapping_gap_audit_v1.py +a604be1eafa2d5a5c58897a1ceabf41bf5987fbbb445f07c70e02d90d55bcd77 tools/cm95_global_mapping_gap_closure_audit_v2.py +0fa02b0b2e8393a5481eb5ee7e6762bdf0651a2f7d74a44bc66b5b651a61c058 tools/cm95_mapping_contract_check_v1.py +42a430db375a97361113eedc9ad902a074d131845c820db8e3f14b0aa8ee4207 tools/cm95_nav_aid_relation_audit_v1.py +30bd4f1480c64279a54b52aa82ca479cb145fadbddecb10e6fb9a203852ba8d0 tools/cm95_nav_name_conflict_audit_v1.py +90d5078953a74ec458d6cb356174436a840cd99f4cc721015b4c23d49a0e81a7 tools/cm95_pbf_build_reports_audit_v1.py +7e77e496e90af634640a457a09a4ba9cf58bbeb628fb5f63ce90e9b648897b00 tools/cm95_pbf_output_audit_v1.py +66f29ee2c1154fc7fadb610462f0b03e7efc0bb3498ffea36022e5cccdf29fb6 tools/cm95_pbf_style_contract_audit_v2.py +d1d7877e31b743c655bdbafce845a7b63aca69c14bf5efb706ef7b851acd2c33 tools/cm95_production_failure_audit_v1.py +b938f37f1a9b8907d0717c97810b3e8f5332cb0a575f2d5baa63312bf272626d tools/cm95_production_plan_audit_v1.py +8899a9dfad6039f07c39281fb4b4211e0520743d4c2d01adee523bd9fdb12407 tools/cm95_v1_4_5_preflight.py +b53250bec660bc39265d8de9dc3611a0673539bdb674e2f02964f1d6cf1e9a45 tools/cm95_v1_4_6_preflight.py +8f6f8dae52f765cae2148b5a2653d5d7eaa25ae75e2c10a29dbfa55cf1cae63b tools/cm95_v1_4_6_query_equivalence.py +252d6edc509dff83c811b2c0d0643d8b97cf4712f247779f5d0ac2a07b05170f tools/cm95_v1_4_7_preflight.py +8c91f52e1eaf438415b325f9f97de59107cb52c6dbe57c10eab580c56ed556b8 使用说明.txt +5888c482f5cd6d2980e46ecc936f9d1cfb1626b30474a18d0c2e37b990b24472 替换与执行说明.md diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..e2cb33d --- /dev/null +++ b/README.txt @@ -0,0 +1,35 @@ +CM95 Japan Full Rebuild Pipeline v2 + +替换: +D:\React\cm93-mysql-importer-starter\scripts\cm95_japan_full_rebuild_pipeline.ps1 + +执行: +cd D:\React\cm93-mysql-importer-starter + +powershell -ExecutionPolicy Bypass ` + -File .\scripts\cm95_japan_full_rebuild_pipeline.ps1 + +默认: +ProjectRoot = D:\React\cm93-mysql-importer-starter +SourceRoot = D:\Ship\CM93V2\CM93JAPAN +ExpectedCells = 1492 +Workers = 4 + +破坏性操作前要求输入: +DELETE + +跳过确认: +powershell -ExecutionPolicy Bypass ` + -File .\scripts\cm95_japan_full_rebuild_pipeline.ps1 ` + -Force + +v2 修复: +- 不再使用 PowerShell 把多行 Python 通过 -c 参数传给 python.exe; +- 所有 Python helper 使用临时 .py 文件; +- audit gate 对齐当前 cm93db JSON; +- geometry validity 保持 informational; +- status-production 多行 JSON 正确解析; +- finalizer 使用当前 Dataset 专属 semantic backlog,不复用旧 Dataset 1 的静态 feature-row 数字。 + +如果 mapping gap closure FAIL: +pipeline 会在生成 PBF 前停止。 diff --git a/cm95_karatsu_aoi_mapping_audit_v1.py b/cm95_karatsu_aoi_mapping_audit_v1.py new file mode 100644 index 0000000..da2489c --- /dev/null +++ b/cm95_karatsu_aoi_mapping_audit_v1.py @@ -0,0 +1,1008 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 / CM93 MySQL 唐津 AOI → NavSea PBF 映射输入审计 v1 + +用途 +==== +从已经通过最终验收的 CM95/CM93 MySQL Dataset 中,只读导出唐津 AOI +(默认对应现有 NavSea 样本 tile z10/881/410)内的真实对象与属性分布, +作为下一步 `cm95_to_navsea_v1.yaml` 的唯一 MySQL 输入依据。 + +默认 AOI: + z10 / x=881 / y=410 + lon: 129.7265625 .. 130.078125 + lat: 33.43144133557529 .. 33.7243396617476 + +该 z10 tile 已覆盖本次提供的: + z11/1762/820 + z12/3525/1643 + +本脚本: +- 只读 MySQL; +- 不修改 importer/schema; +- 不生成 PBF; +- 不依赖历史 V 系列结果; +- 不需要 NEWPEC/旧 PBF 数据库; +- 不涉及 style 修改。 + +输出: +- AOI报告_v1.json +- 对象类别汇总_v1.csv +- 对象类别尺度分布_v1.csv +- 属性字段汇总_v1.csv +- 属性值域汇总_v1.csv +- 对象字典_v1.csv +- 属性字典_v1.csv +- AOI_Cell清单_v1.csv +- AOI_Feature样本_v1.jsonl +- AOI_关联对象样本_v1.jsonl +- AOI_对象映射准备表_v1.csv +- 摘要_v1.txt +- ZIP + +执行示例: + python .\cm95_karatsu_aoi_mapping_audit_v1.py ` + --host 127.0.0.1 ` + --port 3306 ` + --user root ` + --database cm93_chart ` + --dataset-id 1 + +如不传密码,会安全提示输入。 +""" + +from __future__ import annotations + +import argparse +import csv +import getpass +import json +import math +import sys +import zipfile +from collections import Counter, defaultdict +from datetime import datetime +from pathlib import Path +from typing import Any, Iterable + +try: + import pymysql + from pymysql.cursors import DictCursor +except ImportError: + print("缺少 pymysql,请执行: pip install pymysql") + sys.exit(2) + + +VERSION = "v1.0" + + +def parse_args(): + p = argparse.ArgumentParser( + description="CM95 唐津 AOI → NavSea PBF 映射输入审计 v1" + ) + p.add_argument("--host", default="127.0.0.1") + p.add_argument("--port", type=int, default=3306) + p.add_argument("--user", default="root") + p.add_argument("--password", default=None) + p.add_argument("--database", default="cm93_chart") + p.add_argument("--dataset-id", type=int, default=1) + + p.add_argument("--z", type=int, default=10) + p.add_argument("--x", type=int, default=881) + p.add_argument("--y", type=int, default=410) + + p.add_argument( + "--sample-per-class", + type=int, + default=12, + help="每个 object_class + geometry_type 最多保存多少条 Feature 样本", + ) + p.add_argument( + "--value-sample-limit", + type=int, + default=40, + help="每个属性值域最多在 CSV 中列出多少个高频值", + ) + p.add_argument("--output-dir", default=None) + return p.parse_args() + + +def tile_bounds(z: int, x: int, y: int): + n = 2 ** z + lon_min = x / n * 360.0 - 180.0 + lon_max = (x + 1) / n * 360.0 - 180.0 + + def tile_lat(ty: int) -> float: + return math.degrees( + math.atan( + math.sinh( + math.pi * (1.0 - 2.0 * ty / n) + ) + ) + ) + + lat_max = tile_lat(y) + lat_min = tile_lat(y + 1) + return lon_min, lat_min, lon_max, lat_max + + +def begin_read_only(cur, warnings: list[str]): + try: + cur.execute("SET SESSION TRANSACTION READ ONLY") + except Exception as e: + warnings.append(f"SET SESSION TRANSACTION READ ONLY failed: {e}") + + try: + cur.execute("START TRANSACTION READ ONLY") + except Exception as e: + warnings.append(f"START TRANSACTION READ ONLY failed: {e}") + cur.execute("START TRANSACTION") + + +def scalar(cur, sql: str, params=()): + cur.execute(sql, params) + row = cur.fetchone() + if not row: + return None + return next(iter(row.values())) + + +def fetchall(cur, sql: str, params=()): + cur.execute(sql, params) + return list(cur.fetchall()) + + +def write_csv(path: Path, rows: Iterable[dict[str, Any]]): + rows = list(rows) + if not rows: + path.write_text("", encoding="utf-8-sig") + return + + keys = [] + seen = set() + for row in rows: + for key in row: + if key not in seen: + seen.add(key) + keys.append(key) + + with path.open("w", encoding="utf-8-sig", newline="") as f: + w = csv.DictWriter(f, fieldnames=keys, extrasaction="ignore") + w.writeheader() + for row in rows: + out = {} + for key in keys: + value = row.get(key) + if isinstance(value, (dict, list, tuple)): + value = json.dumps( + value, + ensure_ascii=False, + default=str, + ) + out[key] = value + w.writerow(out) + + +def json_obj(v): + if v is None: + return {} + if isinstance(v, dict): + return v + if isinstance(v, (bytes, bytearray, memoryview)): + v = bytes(v).decode("utf-8") + obj = json.loads(v) + return obj if isinstance(obj, dict) else {} + + +def normalized_attr_value(row: dict[str, Any]): + vt = row.get("value_type") + if vt in ("BYTE", "INT", "LONG"): + return row.get("value_int") + if vt in ("REAL", "WORD10"): + return row.get("value_real") + if vt == "STRING": + return row.get("value_text") + if vt in ("LIST", "COMPLEX"): + value = row.get("value_json") + if value is not None: + try: + if isinstance(value, (dict, list)): + return value + return json.loads(value) + except Exception: + return str(value) + return row.get("value_text") + return ( + row.get("value_text") + if row.get("value_text") is not None + else row.get("value_int") + if row.get("value_int") is not None + else row.get("value_real") + ) + + +def stable_value_text(value: Any) -> str: + if isinstance(value, (dict, list)): + return json.dumps( + value, + ensure_ascii=False, + sort_keys=True, + separators=(",", ":"), + default=str, + ) + if value is None: + return "" + if isinstance(value, float): + return format(value, ".15g") + return str(value) + + +def suggested_source_id( + dataset_id: int, + cell_path: str, + source_record_index: int, + geometry_type: str, +): + # 这里只输出建议的稳定 identity 文本,不在本阶段分配 int32 fid。 + return ( + f"cm95:{dataset_id}:" + f"{cell_path.replace(chr(92), '/')}:" + f"{source_record_index}:" + f"{geometry_type.lower()}" + ) + + +def main(): + a = parse_args() + + if a.password is None: + a.password = getpass.getpass("MySQL password: ") + + lon_min, lat_min, lon_max, lat_max = tile_bounds(a.z, a.x, a.y) + + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + outdir = Path( + a.output_dir + or f"cm95_karatsu_mapping_audit_dataset_{a.dataset_id}_{stamp}" + ).resolve() + outdir.mkdir(parents=True, exist_ok=True) + + warnings: list[str] = [] + + conn = pymysql.connect( + host=a.host, + port=a.port, + user=a.user, + password=a.password, + database=a.database, + charset="utf8mb4", + cursorclass=DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + write_timeout=30, + ) + + report: dict[str, Any] = { + "version": VERSION, + "generated_at": datetime.now().isoformat(timespec="seconds"), + "database": a.database, + "dataset_id": a.dataset_id, + "read_only": True, + "aoi": { + "tile": { + "z": a.z, + "x": a.x, + "y": a.y, + }, + "bbox_wgs84": { + "min_lon": lon_min, + "min_lat": lat_min, + "max_lon": lon_max, + "max_lat": lat_max, + }, + "known_navsea_samples_inside": [ + "z10/881/410", + "z11/1762/820", + "z12/3525/1643", + ], + }, + } + + bbox_where = """ + f.dataset_id=%s + AND f.bbox_min_lon IS NOT NULL + AND f.bbox_min_lat IS NOT NULL + AND f.bbox_max_lon IS NOT NULL + AND f.bbox_max_lat IS NOT NULL + AND f.bbox_max_lon >= %s + AND f.bbox_min_lon <= %s + AND f.bbox_max_lat >= %s + AND f.bbox_min_lat <= %s + """ + bbox_params = ( + a.dataset_id, + lon_min, + lon_max, + lat_min, + lat_max, + ) + + try: + with conn.cursor() as cur: + begin_read_only(cur, warnings) + + print("[1/8] Dataset / AOI Cell ...") + + dataset = fetchall( + cur, + """ + SELECT + id, + source_type, + name, + source_root, + parser_version, + normalized_srid + FROM chart_dataset + WHERE id=%s + """, + (a.dataset_id,), + ) + if not dataset: + raise RuntimeError( + f"Dataset ID={a.dataset_id} 不存在" + ) + report["dataset"] = dataset[0] + + cells = fetchall( + cur, + """ + SELECT + id AS cell_id, + source_relative_path, + source_file_name, + scale_code, + native_scale, + cell_name, + feature_count, + attribute_count, + bbox_min_lon, + bbox_min_lat, + bbox_max_lon, + bbox_max_lat + FROM chart_cell + WHERE dataset_id=%s + AND bbox_max_lon >= %s + AND bbox_min_lon <= %s + AND bbox_max_lat >= %s + AND bbox_min_lat <= %s + ORDER BY native_scale,source_relative_path + """, + ( + a.dataset_id, + lon_min, + lon_max, + lat_min, + lat_max, + ), + ) + write_csv(outdir / "AOI_Cell清单_v1.csv", cells) + + print("[2/8] AOI Feature 对象类别统计 ...") + + class_summary = fetchall( + cur, + f""" + SELECT + f.object_class_id, + f.object_class, + f.geometry_type, + COUNT(*) AS feature_count, + COUNT(DISTINCT f.cell_id) AS cell_count, + MIN(f.native_scale) AS min_native_scale, + MAX(f.native_scale) AS max_native_scale, + SUM(CASE WHEN f.geometry_repaired=1 THEN 1 ELSE 0 END) + AS repaired_count, + SUM(CASE WHEN f.geometry_issue IS NOT NULL THEN 1 ELSE 0 END) + AS issue_count + FROM chart_feature f + WHERE {bbox_where} + GROUP BY + f.object_class_id, + f.object_class, + f.geometry_type + ORDER BY + feature_count DESC, + f.object_class, + f.geometry_type + """, + bbox_params, + ) + + object_dict = { + int(r["object_class_id"]): r + for r in fetchall( + cur, + """ + SELECT + object_class_id, + object_class, + geometry_code, + display_code, + description, + raw_line + FROM chart_dictionary_object + WHERE dataset_id=%s + """, + (a.dataset_id,), + ) + } + + for row in class_summary: + oid = row.get("object_class_id") + d = object_dict.get(int(oid)) if oid is not None else None + row["dictionary_geometry_code"] = ( + d.get("geometry_code") if d else None + ) + row["dictionary_display_code"] = ( + d.get("display_code") if d else None + ) + row["description"] = ( + d.get("description") if d else None + ) + + write_csv( + outdir / "对象类别汇总_v1.csv", + class_summary, + ) + + scale_summary = fetchall( + cur, + f""" + SELECT + f.object_class_id, + f.object_class, + f.geometry_type, + f.scale_code, + f.native_scale, + COUNT(*) AS feature_count + FROM chart_feature f + WHERE {bbox_where} + GROUP BY + f.object_class_id, + f.object_class, + f.geometry_type, + f.scale_code, + f.native_scale + ORDER BY + f.object_class, + f.geometry_type, + f.native_scale + """, + bbox_params, + ) + write_csv( + outdir / "对象类别尺度分布_v1.csv", + scale_summary, + ) + + print("[3/8] 属性字段 / 值域统计 ...") + + attr_rows = fetchall( + cur, + f""" + SELECT + f.object_class_id, + f.object_class, + f.geometry_type, + f.native_scale, + a.attribute_id, + a.attribute_name, + a.value_type, + a.value_int, + a.value_real, + a.value_text, + a.value_json + FROM chart_feature_attribute a + JOIN chart_feature f ON f.id=a.feature_id + WHERE {bbox_where} + ORDER BY + f.object_class, + f.geometry_type, + a.attribute_name + """, + bbox_params, + ) + + attr_stats: dict[ + tuple[Any, ...], + dict[str, Any], + ] = {} + attr_value_counts: dict[ + tuple[Any, ...], + Counter[str], + ] = defaultdict(Counter) + attr_scale_values: dict[ + tuple[Any, ...], + set[int], + ] = defaultdict(set) + + for row in attr_rows: + key = ( + row["object_class_id"], + row["object_class"], + row["geometry_type"], + row["attribute_id"], + row["attribute_name"], + row["value_type"], + ) + if key not in attr_stats: + attr_stats[key] = { + "object_class_id": row["object_class_id"], + "object_class": row["object_class"], + "geometry_type": row["geometry_type"], + "attribute_id": row["attribute_id"], + "attribute_name": row["attribute_name"], + "value_type": row["value_type"], + "occurrence_count": 0, + } + + attr_stats[key]["occurrence_count"] += 1 + attr_scale_values[key].add(int(row["native_scale"])) + + value = normalized_attr_value(row) + attr_value_counts[key][stable_value_text(value)] += 1 + + attr_summary_rows = [] + attr_value_rows = [] + + for key, info in attr_stats.items(): + values = attr_value_counts[key] + info = dict(info) + info["distinct_value_count"] = len(values) + info["native_scales"] = sorted(attr_scale_values[key]) + info["top_values"] = [ + { + "value": value, + "count": count, + } + for value, count + in values.most_common(a.value_sample_limit) + ] + attr_summary_rows.append(info) + + for rank, (value, count) in enumerate( + values.most_common(a.value_sample_limit), + start=1, + ): + attr_value_rows.append({ + "object_class_id": key[0], + "object_class": key[1], + "geometry_type": key[2], + "attribute_id": key[3], + "attribute_name": key[4], + "value_type": key[5], + "rank": rank, + "value": value, + "count": count, + "total_distinct_values": len(values), + }) + + attr_summary_rows.sort( + key=lambda r: ( + str(r["object_class"]), + str(r["geometry_type"]), + str(r["attribute_name"]), + ) + ) + + write_csv( + outdir / "属性字段汇总_v1.csv", + attr_summary_rows, + ) + write_csv( + outdir / "属性值域汇总_v1.csv", + attr_value_rows, + ) + + print("[4/8] Feature 样本 / attributes_json ...") + + sample_rows = fetchall( + cur, + f""" + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class_id, + f.object_class, + f.geometry_type, + f.scale_code, + f.native_scale, + f.raw_geotype, + f.coverage_id, + f.bbox_min_lon, + f.bbox_min_lat, + f.bbox_max_lon, + f.bbox_max_lat, + f.attributes_json, + f.geometry_repaired, + f.geometry_issue + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE {bbox_where} + ORDER BY + f.object_class, + f.geometry_type, + f.native_scale, + c.source_relative_path, + f.source_record_index + """, + bbox_params, + ) + + class_seen: Counter[tuple[str, str]] = Counter() + selected_samples: list[dict[str, Any]] = [] + selected_feature_ids: set[int] = set() + + for row in sample_rows: + key = ( + str(row["object_class"]), + str(row["geometry_type"]), + ) + if class_seen[key] >= a.sample_per_class: + continue + + class_seen[key] += 1 + + attrs = json_obj(row.pop("attributes_json")) + row["attributes"] = attrs + row["suggested_source_id"] = suggested_source_id( + a.dataset_id, + str(row["source_relative_path"]), + int(row["source_record_index"]), + str(row["geometry_type"]), + ) + selected_samples.append(row) + selected_feature_ids.add(int(row["feature_id"])) + + with ( + outdir / "AOI_Feature样本_v1.jsonl" + ).open("w", encoding="utf-8") as f: + for row in selected_samples: + f.write( + json.dumps( + row, + ensure_ascii=False, + default=str, + ) + + "\n" + ) + + print("[5/8] 关联对象样本 ...") + + # 从样本里的 _cm93_related_indices 追踪同 Cell Feature, + # 仅作为 mapping 调查辅助;不假设关系方向。 + related_keys: set[tuple[int, int]] = set() + + for row in selected_samples: + attrs = row.get("attributes") or {} + related = attrs.get("_cm93_related_indices") + if not isinstance(related, list): + continue + + for value in related: + try: + related_keys.add( + ( + int(row["cell_id"]), + int(value), + ) + ) + except Exception: + continue + + related_rows: list[dict[str, Any]] = [] + + # AOI 样本量有限,按 key 查询,避免构造超长 SQL IN。 + for cell_id, source_index in sorted(related_keys): + rows = fetchall( + cur, + """ + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class_id, + f.object_class, + f.geometry_type, + f.scale_code, + f.native_scale, + f.raw_geotype, + f.attributes_json + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.cell_id=%s + AND f.source_record_index=%s + LIMIT 1 + """, + ( + a.dataset_id, + cell_id, + source_index, + ), + ) + if not rows: + continue + row = rows[0] + row["attributes"] = json_obj( + row.pop("attributes_json") + ) + row["suggested_source_id"] = suggested_source_id( + a.dataset_id, + str(row["source_relative_path"]), + int(row["source_record_index"]), + str(row["geometry_type"]), + ) + related_rows.append(row) + + with ( + outdir / "AOI_关联对象样本_v1.jsonl" + ).open("w", encoding="utf-8") as f: + for row in related_rows: + f.write( + json.dumps( + row, + ensure_ascii=False, + default=str, + ) + + "\n" + ) + + print("[6/8] Dictionary 子集 ...") + + seen_object_ids = { + int(r["object_class_id"]) + for r in class_summary + if r.get("object_class_id") is not None + } + object_dict_rows = [ + object_dict[oid] + for oid in sorted(seen_object_ids) + if oid in object_dict + ] + write_csv( + outdir / "对象字典_v1.csv", + object_dict_rows, + ) + + seen_attr_ids = { + int(r["attribute_id"]) + for r in attr_summary_rows + if r.get("attribute_id") is not None + } + + all_attr_dict = fetchall( + cur, + """ + SELECT + attribute_id, + attribute_name, + source_type_name, + decoder_type, + min_value, + max_value, + raw_line + FROM chart_dictionary_attribute + WHERE dataset_id=%s + ORDER BY attribute_id + """, + (a.dataset_id,), + ) + attr_dict_rows = [ + r + for r in all_attr_dict + if int(r["attribute_id"]) in seen_attr_ids + ] + write_csv( + outdir / "属性字典_v1.csv", + attr_dict_rows, + ) + + print("[7/8] NavSea mapping 准备表 ...") + + attrs_by_class: dict[ + tuple[Any, Any, Any], + list[str], + ] = defaultdict(list) + + for row in attr_summary_rows: + ckey = ( + row["object_class_id"], + row["object_class"], + row["geometry_type"], + ) + attrs_by_class[ckey].append( + str(row["attribute_name"]) + ) + + mapping_prepare = [] + + for row in class_summary: + key = ( + row["object_class_id"], + row["object_class"], + row["geometry_type"], + ) + mapping_prepare.append({ + "cm95_object_class_id": row["object_class_id"], + "cm95_object_class": row["object_class"], + "cm95_description": row.get("description"), + "geometry_type": row["geometry_type"], + "aoi_feature_count": row["feature_count"], + "aoi_cell_count": row["cell_count"], + "min_native_scale": row["min_native_scale"], + "max_native_scale": row["max_native_scale"], + "available_attributes": sorted( + set(attrs_by_class.get(key, [])) + ), + "target_source_layer": "", + "canonical_family": "", + "canonical_object_type": "", + "chart_render_type": "", + "safety_class": "", + "mapping_status": "UNMAPPED", + "notes": "", + }) + + write_csv( + outdir / "AOI_对象映射准备表_v1.csv", + mapping_prepare, + ) + + print("[8/8] 汇总 ...") + + spatial_feature_count = int( + scalar( + cur, + f""" + SELECT COUNT(*) + FROM chart_feature f + WHERE {bbox_where} + """, + bbox_params, + ) + or 0 + ) + + geometry_counts = fetchall( + cur, + f""" + SELECT + f.geometry_type, + COUNT(*) AS feature_count + FROM chart_feature f + WHERE {bbox_where} + GROUP BY f.geometry_type + ORDER BY f.geometry_type + """, + bbox_params, + ) + + report.update({ + "warnings": warnings, + "counts": { + "aoi_cells": len(cells), + "aoi_spatial_features": spatial_feature_count, + "object_class_geometry_groups": len(class_summary), + "attribute_group_count": len(attr_summary_rows), + "sample_feature_count": len(selected_samples), + "related_sample_count": len(related_rows), + }, + "geometry_counts": geometry_counts, + "object_classes": [ + { + "object_class_id": r["object_class_id"], + "object_class": r["object_class"], + "geometry_type": r["geometry_type"], + "feature_count": r["feature_count"], + "description": r.get("description"), + } + for r in class_summary + ], + "next_step": ( + "Use AOI_对象映射准备表_v1.csv + 属性值域汇总_v1.csv " + "to author cm95_to_navsea_v1.yaml." + ), + }) + + conn.rollback() + + finally: + conn.close() + + ( + outdir / "AOI报告_v1.json" + ).write_text( + json.dumps( + report, + ensure_ascii=False, + indent=2, + default=str, + ), + encoding="utf-8", + ) + + lines = [ + "CM95 唐津 AOI → NavSea PBF 映射输入审计 v1", + "=" * 84, + f"Dataset ID : {a.dataset_id}", + f"Tile : z{a.z}/{a.x}/{a.y}", + ( + "BBox WGS84 : " + f"{lon_min:.10f},{lat_min:.10f} " + f"→ {lon_max:.10f},{lat_max:.10f}" + ), + "", + f"AOI cells : {report['counts']['aoi_cells']}", + f"AOI spatial features : {report['counts']['aoi_spatial_features']}", + ( + "Object class/geom groups : " + f"{report['counts']['object_class_geometry_groups']}" + ), + ( + "Attribute groups : " + f"{report['counts']['attribute_group_count']}" + ), + f"Feature samples : {report['counts']['sample_feature_count']}", + f"Related samples : {report['counts']['related_sample_count']}", + "", + "Geometry counts:", + ] + + for row in report["geometry_counts"]: + lines.append( + f" {str(row['geometry_type']):10s} " + f"{int(row['feature_count'])}" + ) + + lines += [ + "", + "NEXT:", + " 上传本脚本生成的 ZIP。", + " 下一步直接生成 cm95_to_navsea_v1.yaml 初版并标注 UNMAPPED / hard_gate 缺口。", + ] + + summary = "\n".join(lines) + ( + outdir / "摘要_v1.txt" + ).write_text(summary, encoding="utf-8") + + zip_path = outdir.with_suffix(".zip") + with zipfile.ZipFile( + zip_path, + "w", + compression=zipfile.ZIP_DEFLATED, + ) as zf: + for p in sorted(outdir.rglob("*")): + if p.is_file(): + zf.write( + p, + p.relative_to(outdir.parent), + ) + + print("") + print(summary) + print("") + print(f"报告目录: {outdir}") + print(f"报告 ZIP : {zip_path}") + print("把 ZIP 上传给 ChatGPT。") + + +if __name__ == "__main__": + main() diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_Cell清单_v1.csv b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_Cell清单_v1.csv new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_Cell清单_v1.csv @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_Feature样本_v1.jsonl b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_Feature样本_v1.jsonl new file mode 100644 index 0000000..e69de29 diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_关联对象样本_v1.jsonl b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_关联对象样本_v1.jsonl new file mode 100644 index 0000000..e69de29 diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_对象映射准备表_v1.csv b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_对象映射准备表_v1.csv new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI_对象映射准备表_v1.csv @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI报告_v1.json b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI报告_v1.json new file mode 100644 index 0000000..b03dcdc --- /dev/null +++ b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/AOI报告_v1.json @@ -0,0 +1,45 @@ +{ + "version": "v1.0", + "generated_at": "2026-09-03T08:06:34", + "database": "cm93_chart", + "dataset_id": 1, + "read_only": true, + "aoi": { + "tile": { + "z": 10, + "x": 881, + "y": 410 + }, + "bbox_wgs84": { + "min_lon": 129.7265625, + "min_lat": 33.4314413355753, + "max_lon": 130.078125, + "max_lat": 33.7243396617476 + }, + "known_navsea_samples_inside": [ + "z10/881/410", + "z11/1762/820", + "z12/3525/1643" + ] + }, + "dataset": { + "id": 1, + "source_type": "CM93", + "name": "CM93JAPAN", + "source_root": "D:\\Ship\\CM93V2\\CM93JAPAN", + "parser_version": "0.2.0", + "normalized_srid": 4326 + }, + "warnings": [], + "counts": { + "aoi_cells": 0, + "aoi_spatial_features": 0, + "object_class_geometry_groups": 0, + "attribute_group_count": 0, + "sample_feature_count": 0, + "related_sample_count": 0 + }, + "geometry_counts": [], + "object_classes": [], + "next_step": "Use AOI_对象映射准备表_v1.csv + 属性值域汇总_v1.csv to author cm95_to_navsea_v1.yaml." +} \ No newline at end of file diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象字典_v1.csv b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象字典_v1.csv new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象字典_v1.csv @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象类别尺度分布_v1.csv b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象类别尺度分布_v1.csv new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象类别尺度分布_v1.csv @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象类别汇总_v1.csv b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象类别汇总_v1.csv new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/对象类别汇总_v1.csv @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性值域汇总_v1.csv b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性值域汇总_v1.csv new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性值域汇总_v1.csv @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性字典_v1.csv b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性字典_v1.csv new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性字典_v1.csv @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性字段汇总_v1.csv b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性字段汇总_v1.csv new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/属性字段汇总_v1.csv @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/摘要_v1.txt b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/摘要_v1.txt new file mode 100644 index 0000000..a7a0aee --- /dev/null +++ b/cm95_karatsu_mapping_audit_dataset_1_20260903_080633/摘要_v1.txt @@ -0,0 +1,18 @@ +CM95 唐津 AOI → NavSea PBF 映射输入审计 v1 +==================================================================================== +Dataset ID : 1 +Tile : z10/881/410 +BBox WGS84 : 129.7265625000,33.4314413356 → 130.0781250000,33.7243396617 + +AOI cells : 0 +AOI spatial features : 0 +Object class/geom groups : 0 +Attribute groups : 0 +Feature samples : 0 +Related samples : 0 + +Geometry counts: + +NEXT: + 上传本脚本生成的 ZIP。 + 下一步直接生成 cm95_to_navsea_v1.yaml 初版并标注 UNMAPPED / hard_gate 缺口。 \ No newline at end of file diff --git a/cm95_karatsu_presence_diagnostic_v2.json b/cm95_karatsu_presence_diagnostic_v2.json new file mode 100644 index 0000000..510aebd --- /dev/null +++ b/cm95_karatsu_presence_diagnostic_v2.json @@ -0,0 +1,1981 @@ +{ + "version": "v2", + "generated_at": "2026-09-03T08:20:53", + "dataset_id": 1, + "target": { + "tile": "z10/881/410", + "bbox": [ + 129.7265625, + 33.4314413355753, + 130.078125, + 33.7243396617476 + ], + "center": [ + 129.90234375, + 33.577890498661446 + ] + }, + "read_only": true, + "dataset": [ + { + "id": 1, + "name": "CM93JAPAN", + "source_type": "CM93", + "source_root": "D:\\Ship\\CM93V2\\CM93JAPAN", + "parser_version": "0.2.0", + "normalized_srid": 4326 + } + ], + "global_feature_bbox": [ + { + "min_lon": 119.99999814093105, + "min_lat": -80.00000071639808, + "max_lon": 160.00000143279615, + "max_lat": 80.00000071639808, + "bbox_rows": "318059", + "total_rows": 322465 + } + ], + "global_cell_bbox": [ + { + "min_lon": 119.99999706633396, + "min_lat": -80.0, + "max_lon": 160.0, + "max_lat": 80.0, + "bbox_rows": "784", + "total_rows": 784 + } + ], + "cell_bbox_overlap": [], + "feature_bbox_count": 0, + "direct_geometry_mbr_counts": { + "point": 0, + "line": 0, + "area": 0 + }, + "sounding_bbox_count": 0, + "nearest_cells": [ + { + "id": 308, + "source_relative_path": "03900360\\E\\03900383.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 127.66666353742289, + "bbox_min_lat": 39.99999899417164, + "bbox_max_lon": 127.9999968986959, + "bbox_max_lat": 40.333332355444654, + "feature_count": 148, + "center_distance_deg": 6.9059956065118016 + }, + { + "id": 307, + "source_relative_path": "03900360\\E\\03900382.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 127.33333025996892, + "bbox_min_lat": 39.99999899417164, + "bbox_max_lon": 127.66666353742289, + "bbox_max_lat": 40.333332355444654, + "feature_count": 4, + "center_distance_deg": 7.013075553263176 + }, + { + "id": 321, + "source_relative_path": "03900360\\E\\03940389.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 129.6666635374229, + "bbox_min_lat": 41.333332355444654, + "bbox_max_lon": 129.99999681487688, + "bbox_max_lat": 41.666665632898635, + "feature_count": 208, + "center_distance_deg": 7.922409096228903 + }, + { + "id": 322, + "source_relative_path": "03900360\\E\\03940390.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 129.99999681487688, + "bbox_min_lat": 41.333332355444654, + "bbox_max_lon": 130.33333017614987, + "bbox_max_lat": 41.666665632898635, + "feature_count": 5, + "center_distance_deg": 7.9265167597440405 + }, + { + "id": 320, + "source_relative_path": "03900360\\E\\03940388.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 129.33333017614987, + "bbox_min_lat": 41.333332355444654, + "bbox_max_lon": 129.6666635374229, + "bbox_max_lat": 41.666665632898635, + "feature_count": 105, + "center_distance_deg": 7.932319083163105 + }, + { + "id": 324, + "source_relative_path": "03900360\\E\\03950389.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 129.6666635374229, + "bbox_min_lat": 41.666665632898635, + "bbox_max_lon": 129.99999681487688, + "bbox_max_lat": 41.99999899417164, + "feature_count": 940, + "center_distance_deg": 8.255730278548386 + }, + { + "id": 325, + "source_relative_path": "03900360\\E\\03950390.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 129.99999681487688, + "bbox_min_lat": 41.666665632898635, + "bbox_max_lon": 130.33333017614987, + "bbox_max_lat": 41.99999899417164, + "feature_count": 17, + "center_distance_deg": 8.259672177915615 + }, + { + "id": 323, + "source_relative_path": "03900360\\E\\03950388.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 129.33333017614987, + "bbox_min_lat": 41.666665632898635, + "bbox_max_lon": 129.6666635374229, + "bbox_max_lat": 41.99999899417164, + "feature_count": 32, + "center_distance_deg": 8.26524062452169 + }, + { + "id": 75, + "source_relative_path": "03900360\\D\\03930396.D", + "scale_code": "D", + "native_scale": 100000, + "bbox_min_lon": 131.99999673105785, + "bbox_min_lat": 40.99999899417164, + "bbox_max_lon": 132.99999673105785, + "bbox_max_lat": 41.999998910352616, + "feature_count": 23, + "center_distance_deg": 8.33712200706036 + }, + { + "id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 127.9999968986959, + "bbox_min_lat": 39.99999899417164, + "bbox_max_lon": 131.99999681487688, + "bbox_max_lat": 43.999998910352616, + "feature_count": 3471, + "center_distance_deg": 8.42267457126756 + }, + { + "id": 306, + "source_relative_path": "03900360\\E\\03900373.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 124.33333034378794, + "bbox_min_lat": 39.99999899417164, + "bbox_max_lon": 124.66666362124192, + "bbox_max_lat": 40.333332355444654, + "feature_count": 287, + "center_distance_deg": 8.520405443285156 + }, + { + "id": 76, + "source_relative_path": "03900360\\D\\03930399.D", + "scale_code": "D", + "native_scale": 100000, + "bbox_min_lon": 132.99999673105785, + "bbox_min_lat": 40.99999899417164, + "bbox_max_lon": 133.99999673105785, + "bbox_max_lat": 41.999998910352616, + "feature_count": 15, + "center_distance_deg": 8.700741883467517 + }, + { + "id": 305, + "source_relative_path": "03900360\\E\\03900372.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 123.99999698251493, + "bbox_min_lat": 39.99999899417164, + "bbox_max_lon": 124.33333034378794, + "bbox_max_lat": 40.333332355444654, + "feature_count": 29, + "center_distance_deg": 8.735558618684786 + }, + { + "id": 326, + "source_relative_path": "03900360\\E\\03960396.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 131.99999673105785, + "bbox_min_lat": 41.999998910352616, + "bbox_max_lon": 132.33333009233084, + "bbox_max_lat": 42.33333227162562, + "feature_count": 19, + "center_distance_deg": 8.882240771163762 + }, + { + "id": 80, + "source_relative_path": "03900360\\D\\03960390.D", + "scale_code": "D", + "native_scale": 100000, + "bbox_min_lon": 129.99999681487688, + "bbox_min_lat": 41.99999899417164, + "bbox_max_lon": 130.99999681487688, + "bbox_max_lat": 42.99999899417164, + "feature_count": 1585, + "center_distance_deg": 8.942103174959005 + }, + { + "id": 304, + "source_relative_path": "03900360\\E\\03900371.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 123.66666370506096, + "bbox_min_lat": 39.99999899417164, + "bbox_max_lon": 123.99999698251493, + "bbox_max_lat": 40.333332355444654, + "feature_count": 5, + "center_distance_deg": 8.957950772726356 + }, + { + "id": 675, + "source_relative_path": "03900360\\F\\03970392.F", + "scale_code": "F", + "native_scale": 20000, + "bbox_min_lon": 130.6666635374229, + "bbox_min_lat": 42.33333227162562, + "bbox_max_lon": 130.99999681487688, + "bbox_max_lat": 42.666665632898635, + "feature_count": 1157, + "center_distance_deg": 8.970549313363602 + }, + { + "id": 761, + "source_relative_path": "03900360\\G\\03970392.G", + "scale_code": "G", + "native_scale": 7500, + "bbox_min_lon": 130.6666635374229, + "bbox_min_lat": 42.33333227162562, + "bbox_max_lon": 130.99999681487688, + "bbox_max_lat": 42.666665632898635, + "feature_count": 275, + "center_distance_deg": 8.970549313363602 + }, + { + "id": 327, + "source_relative_path": "03900360\\E\\03960397.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 132.33333009233084, + "bbox_min_lat": 41.999998910352616, + "bbox_max_lon": 132.66666345360386, + "bbox_max_lat": 42.33333227162562, + "feature_count": 19, + "center_distance_deg": 8.97300723360455 + }, + { + "id": 676, + "source_relative_path": "03900360\\F\\03970393.F", + "scale_code": "F", + "native_scale": 20000, + "bbox_min_lon": 130.99999681487688, + "bbox_min_lat": 42.33333227162562, + "bbox_max_lon": 131.33333017614987, + "bbox_max_lat": 42.666665632898635, + "feature_count": 1148, + "center_distance_deg": 9.011244291256775 + }, + { + "id": 762, + "source_relative_path": "03900360\\G\\03970393.G", + "scale_code": "G", + "native_scale": 7500, + "bbox_min_lon": 130.99999681487688, + "bbox_min_lat": 42.33333227162562, + "bbox_max_lon": 131.33333017614987, + "bbox_max_lat": 42.666665632898635, + "feature_count": 109, + "center_distance_deg": 9.011244291256775 + }, + { + "id": 81, + "source_relative_path": "03900360\\D\\03960393.D", + "scale_code": "D", + "native_scale": 100000, + "bbox_min_lon": 130.99999681487688, + "bbox_min_lat": 41.99999899417164, + "bbox_max_lon": 131.99999681487688, + "bbox_max_lat": 42.99999899417164, + "feature_count": 3397, + "center_distance_deg": 9.064023131113782 + }, + { + "id": 328, + "source_relative_path": "03900360\\E\\03960398.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 132.66666345360386, + "bbox_min_lat": 41.999998910352616, + "bbox_max_lon": 132.99999673105785, + "bbox_max_lat": 42.33333227162562, + "feature_count": 19, + "center_distance_deg": 9.075116446939857 + }, + { + "id": 77, + "source_relative_path": "03900360\\D\\03930402.D", + "scale_code": "D", + "native_scale": 100000, + "bbox_min_lon": 133.99999673105785, + "bbox_min_lat": 40.99999899417164, + "bbox_max_lon": 134.99999673105785, + "bbox_max_lat": 41.999998910352616, + "feature_count": 9, + "center_distance_deg": 9.159596895324682 + }, + { + "id": 329, + "source_relative_path": "03900360\\E\\03970396.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 131.99999673105785, + "bbox_min_lat": 42.33333227162562, + "bbox_max_lon": 132.33333009233084, + "bbox_max_lat": 42.666665632898635, + "feature_count": 49, + "center_distance_deg": 9.204953165994295 + }, + { + "id": 31, + "source_relative_path": "03900360\\C\\03900372.C", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 123.99999698251493, + "bbox_min_lat": 39.99999899417164, + "bbox_max_lon": 127.9999968986959, + "bbox_max_lat": 43.999998910352616, + "feature_count": 99, + "center_distance_deg": 9.282253036036254 + }, + { + "id": 330, + "source_relative_path": "03900360\\E\\03970397.E", + "scale_code": "E", + "native_scale": 50000, + "bbox_min_lon": 132.33333009233084, + "bbox_min_lat": 42.33333227162562, + "bbox_max_lon": 132.66666345360386, + "bbox_max_lat": 42.666665632898635, + "feature_count": 64, + "center_distance_deg": 9.292568024262408 + }, + { + "id": 82, + "source_relative_path": "03900360\\D\\03960396.D", + "scale_code": "D", + "native_scale": 100000, + "bbox_min_lon": 131.99999681487688, + "bbox_min_lat": 41.99999899417164, + "bbox_max_lon": 132.99999681487688, + "bbox_max_lat": 42.99999899417164, + "feature_count": 2531, + "center_distance_deg": 9.292568076216575 + }, + { + "id": 677, + "source_relative_path": "03900360\\F\\03980392.F", + "scale_code": "F", + "native_scale": 20000, + "bbox_min_lon": 130.6666635374229, + "bbox_min_lat": 42.666665632898635, + "bbox_max_lon": 130.99999681487688, + "bbox_max_lat": 42.99999899417164, + "feature_count": 53, + "center_distance_deg": 9.302147005621217 + }, + { + "id": 678, + "source_relative_path": "03900360\\F\\03980393.F", + "scale_code": "F", + "native_scale": 20000, + "bbox_min_lon": 130.99999681487688, + "bbox_min_lat": 42.666665632898635, + "bbox_max_lon": 131.33333017614987, + "bbox_max_lat": 42.99999899417164, + "feature_count": 107, + "center_distance_deg": 9.341397518969387 + } + ], + "nearest_features": [ + { + "id": 348635, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2548, + "object_class_id": 138, + "object_class": "SBDARE", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.63105014692007, + "bbox_min_lat": 40.061096838400175, + "bbox_max_lon": 128.63105014692007, + "bbox_max_lat": 40.061096838400175, + "center_distance_deg": 6.606674796662871 + }, + { + "id": 325273, + "cell_id": 9, + "source_relative_path": "03900360\\B\\03900360.B", + "source_record_index": 285, + "object_class_id": 138, + "object_class": "SBDARE", + "geometry_type": "POINT", + "scale_code": "B", + "native_scale": 1000000, + "bbox_min_lon": 129.30433918201652, + "bbox_min_lat": 40.16193285708952, + "bbox_max_lon": 129.30433918201652, + "bbox_max_lat": 40.16193285708952, + "center_distance_deg": 6.611143867811696 + }, + { + "id": 348653, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2566, + "object_class_id": 138, + "object_class": "SBDARE", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 129.30208088579698, + "bbox_min_lat": 40.167116466022215, + "bbox_max_lon": 129.30208088579698, + "bbox_max_lat": 40.167116466022215, + "center_distance_deg": 6.616510738681127 + }, + { + "id": 346135, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 48, + "object_class_id": 44, + "object_class": "DEPARE", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 130.66416220003902, + "bbox_min_lat": 40.1019028477158, + "bbox_max_lon": 130.7789100433252, + "bbox_max_lat": 40.19323460637225, + "center_distance_deg": 6.620554974192587 + }, + { + "id": 347965, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 1878, + "object_class_id": 45, + "object_class": "DEPCNT", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 130.66416220003902, + "bbox_min_lat": 40.1019028477158, + "bbox_max_lon": 130.7789100433252, + "bbox_max_lat": 40.19323460637225, + "center_distance_deg": 6.620554974192587 + }, + { + "id": 348681, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2594, + "object_class_id": 138, + "object_class": "SBDARE", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.32062060917875, + "bbox_min_lat": 40.02341288919827, + "bbox_max_lon": 128.32062060917875, + "bbox_max_lat": 40.02341288919827, + "center_distance_deg": 6.63676178426806 + }, + { + "id": 346937, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 850, + "object_class_id": 81, + "object_class": "LNDARE", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.21698133370003, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.2186293080451, + "bbox_max_lat": 40.000188203339846, + "center_distance_deg": 6.639455149219318 + }, + { + "id": 347717, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 1630, + "object_class_id": 35, + "object_class": "COALNE", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.21698133370003, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.2186293080451, + "bbox_max_lat": 40.000188203339846, + "center_distance_deg": 6.639455149219318 + }, + { + "id": 349388, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 3301, + "object_class_id": 198, + "object_class": "_texto", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.2175916945686, + "bbox_min_lat": 40.00006230275176, + "bbox_max_lon": 128.2175916945686, + "bbox_max_lat": 40.00006230275176, + "center_distance_deg": 6.63947890798163 + }, + { + "id": 348377, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2290, + "object_class_id": 139, + "object_class": "SLCONS", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.2113049776226, + "bbox_min_lat": 40.000188203339846, + "bbox_max_lon": 128.21325813240193, + "bbox_max_lat": 40.000377053786686, + "center_distance_deg": 6.641041401252636 + }, + { + "id": 325412, + "cell_id": 9, + "source_relative_path": "03900360\\B\\03900360.B", + "source_record_index": 424, + "object_class_id": 201, + "object_class": "_extgn", + "geometry_type": "POINT", + "scale_code": "B", + "native_scale": 1000000, + "bbox_min_lon": 128.32791438665598, + "bbox_min_lat": 40.030525986114434, + "bbox_max_lon": 128.32791438665598, + "bbox_max_lat": 40.030525986114434, + "center_distance_deg": 6.6419374096793105 + }, + { + "id": 325318, + "cell_id": 9, + "source_relative_path": "03900360\\B\\03900360.B", + "source_record_index": 330, + "object_class_id": 86, + "object_class": "LIGHTS", + "geometry_type": "POINT", + "scale_code": "B", + "native_scale": 1000000, + "bbox_min_lon": 128.32791438665598, + "bbox_min_lat": 40.030525986114434, + "bbox_max_lon": 128.32791438665598, + "bbox_max_lat": 40.030525986114434, + "center_distance_deg": 6.6419374096793105 + }, + { + "id": 348838, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2751, + "object_class_id": 86, + "object_class": "LIGHTS", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.3281890839487, + "bbox_min_lat": 40.03102685146272, + "bbox_max_lon": 128.3281890839487, + "bbox_max_lat": 40.03102685146272, + "center_distance_deg": 6.642358895791193 + }, + { + "id": 349531, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 3444, + "object_class_id": 201, + "object_class": "_extgn", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.3281890839487, + "bbox_min_lat": 40.03102685146272, + "bbox_max_lon": 128.3281890839487, + "bbox_max_lat": 40.03102685146272, + "center_distance_deg": 6.642358895791193 + }, + { + "id": 347701, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 1614, + "object_class_id": 35, + "object_class": "COALNE", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.32031542874446, + "bbox_min_lat": 40.02957963479581, + "bbox_max_lon": 128.32116993396045, + "bbox_max_lat": 40.030208863206546, + "center_distance_deg": 6.64302749766588 + }, + { + "id": 346905, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 818, + "object_class_id": 81, + "object_class": "LNDARE", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.32031542874446, + "bbox_min_lat": 40.02957963479581, + "bbox_max_lon": 128.32116993396045, + "bbox_max_lat": 40.030208863206546, + "center_distance_deg": 6.64302749766588 + }, + { + "id": 349387, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 3300, + "object_class_id": 198, + "object_class": "_texto", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.2250991332517, + "bbox_min_lat": 40.005916434520145, + "bbox_max_lon": 128.2250991332517, + "bbox_max_lat": 40.005916434520145, + "center_distance_deg": 6.643242200648964 + }, + { + "id": 349365, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 3278, + "object_class_id": 198, + "object_class": "_texto", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.3253814239534, + "bbox_min_lat": 40.031907750921796, + "bbox_max_lon": 128.3253814239534, + "bbox_max_lat": 40.031907750921796, + "center_distance_deg": 6.6438805580958915 + }, + { + "id": 346343, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 256, + "object_class_id": 81, + "object_class": "LNDARE", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.21667615326575, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.23101963367657, + "bbox_max_lat": 40.014224662920505, + "center_distance_deg": 6.644715009085706 + }, + { + "id": 347624, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 1537, + "object_class_id": 35, + "object_class": "COALNE", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.21667615326575, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.23101963367657, + "bbox_max_lat": 40.014224662920505, + "center_distance_deg": 6.644715009085706 + }, + { + "id": 349428, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 3341, + "object_class_id": 198, + "object_class": "_texto", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.2617207853643, + "bbox_min_lat": 40.01743438941705, + "bbox_max_lon": 128.2617207853643, + "bbox_max_lat": 40.01743438941705, + "center_distance_deg": 6.645251630529713 + }, + { + "id": 349389, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 3302, + "object_class_id": 198, + "object_class": "_texto", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.20678830719535, + "bbox_min_lat": 40.00446868521037, + "bbox_max_lon": 128.20678830719535, + "bbox_max_lat": 40.00446868521037, + "center_distance_deg": 6.646488956392759 + }, + { + "id": 347741, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 1654, + "object_class_id": 35, + "object_class": "COALNE", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.3115872683243, + "bbox_min_lat": 40.03102685146272, + "bbox_max_lon": 128.3124417735403, + "bbox_max_lat": 40.03165606652299, + "center_distance_deg": 6.6465161065199805 + }, + { + "id": 346870, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 783, + "object_class_id": 81, + "object_class": "LNDARE", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.3115872683243, + "bbox_min_lat": 40.03102685146272, + "bbox_max_lon": 128.3124417735403, + "bbox_max_lat": 40.03165606652299, + "center_distance_deg": 6.6465161065199805 + }, + { + "id": 348549, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2462, + "object_class_id": 193, + "object_class": "$LINES", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.68109973814063, + "bbox_min_lat": 40.11158203923852, + "bbox_max_lon": 128.68799681595516, + "bbox_max_lat": 40.11258759054715, + "center_distance_deg": 6.646707544056175 + }, + { + "id": 346325, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 238, + "object_class_id": 99, + "object_class": "OBSTRN", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.2986476179112, + "bbox_min_lat": 40.0282582362395, + "bbox_max_lon": 128.32568660438767, + "bbox_max_lat": 40.03549415269112, + "center_distance_deg": 6.646998804301603 + }, + { + "id": 346345, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 258, + "object_class_id": 81, + "object_class": "LNDARE", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.20044055416253, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.21270880762026, + "bbox_max_lat": 40.0110147854624, + "center_distance_deg": 6.647547480835576 + }, + { + "id": 347575, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 1488, + "object_class_id": 35, + "object_class": "COALNE", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.20044055416253, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.21270880762026, + "bbox_max_lat": 40.0110147854624, + "center_distance_deg": 6.647547480835576 + }, + { + "id": 348550, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2463, + "object_class_id": 193, + "object_class": "$LINES", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.67975694422984, + "bbox_min_lat": 40.11158203923852, + "bbox_max_lon": 128.68109973814063, + "bbox_max_lat": 40.116861017746814, + "center_distance_deg": 6.649563940427475 + }, + { + "id": 349230, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 3143, + "object_class_id": 168, + "object_class": "UWTROC", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.30176045834077, + "bbox_min_lat": 40.03234819638495, + "bbox_max_lon": 128.30176045834077, + "bbox_max_lat": 40.03234819638495, + "center_distance_deg": 6.6499542137702665 + }, + { + "id": 325119, + "cell_id": 9, + "source_relative_path": "03900360\\B\\03900360.B", + "source_record_index": 131, + "object_class_id": 35, + "object_class": "COALNE", + "geometry_type": "LINE", + "scale_code": "B", + "native_scale": 1000000, + "bbox_min_lon": 128.1741034484276, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.17486639951008, + "bbox_max_lat": 40.00066312003366, + "center_distance_deg": 6.650807556223263 + }, + { + "id": 325125, + "cell_id": 9, + "source_relative_path": "03900360\\B\\03900360.B", + "source_record_index": 137, + "object_class_id": 35, + "object_class": "COALNE", + "geometry_type": "LINE", + "scale_code": "B", + "native_scale": 1000000, + "bbox_min_lon": 128.16799983976773, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.23162996004675, + "bbox_max_lat": 40.01559618651691, + "center_distance_deg": 6.651489456975627 + }, + { + "id": 325029, + "cell_id": 9, + "source_relative_path": "03900360\\B\\03900360.B", + "source_record_index": 41, + "object_class_id": 81, + "object_class": "LNDARE", + "geometry_type": "AREA", + "scale_code": "B", + "native_scale": 1000000, + "bbox_min_lon": 128.16799983976773, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.23162996004675, + "bbox_max_lat": 40.01559618651691, + "center_distance_deg": 6.651489456975627 + }, + { + "id": 347878, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 1791, + "object_class_id": 45, + "object_class": "DEPCNT", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.23382729367185, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.28314445185018, + "bbox_max_lat": 40.04788780824731, + "center_distance_deg": 6.652358157223536 + }, + { + "id": 349390, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 3303, + "object_class_id": 198, + "object_class": "_texto", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.18182454767194, + "bbox_min_lat": 40.00421689958774, + "bbox_max_lon": 128.18182454767194, + "bbox_max_lat": 40.00421689958774, + "center_distance_deg": 6.652657915211173 + }, + { + "id": 346990, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 903, + "object_class_id": 128, + "object_class": "RESARE", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.2028819976367, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.2561054653737, + "bbox_max_lat": 40.03423578758272, + "center_distance_deg": 6.652974707627956 + }, + { + "id": 348633, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2546, + "object_class_id": 29, + "object_class": "CTNARE", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.68793577986833, + "bbox_min_lat": 40.1193746730088, + "bbox_max_lon": 128.68793577986833, + "bbox_max_lat": 40.1193746730088, + "center_distance_deg": 6.653254986933554 + }, + { + "id": 348540, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2453, + "object_class_id": 193, + "object_class": "$LINES", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.68109973814063, + "bbox_min_lat": 40.11158203923852, + "bbox_max_lon": 128.69483285768288, + "bbox_max_lat": 40.12722924677838, + "center_distance_deg": 6.653279866341223 + }, + { + "id": 347456, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 1369, + "object_class_id": 35, + "object_class": "COALNE", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.16931214986678, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.19555766721416, + "bbox_max_lat": 40.01063714289561, + "center_distance_deg": 6.6535639991798385 + }, + { + "id": 346283, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 196, + "object_class_id": 81, + "object_class": "LNDARE", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.16931214986678, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.19555766721416, + "bbox_max_lat": 40.01063714289561, + "center_distance_deg": 6.6535639991798385 + }, + { + "id": 346686, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 599, + "object_class_id": 81, + "object_class": "LNDARE", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.1915903215686, + "bbox_min_lat": 40.00786770023033, + "bbox_max_lon": 128.19439798156392, + "bbox_max_lat": 40.009315377457916, + "center_distance_deg": 6.6540057046768535 + }, + { + "id": 347451, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 1364, + "object_class_id": 35, + "object_class": "COALNE", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.1915903215686, + "bbox_min_lat": 40.00786770023033, + "bbox_max_lon": 128.19439798156392, + "bbox_max_lat": 40.009315377457916, + "center_distance_deg": 6.6540057046768535 + }, + { + "id": 347832, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 1745, + "object_class_id": 45, + "object_class": "DEPCNT", + "geometry_type": "LINE", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.33441476480783, + "bbox_min_lat": 40.031907750921796, + "bbox_max_lon": 128.35358009608012, + "bbox_max_lat": 40.06386412030549, + "center_distance_deg": 6.655019474491119 + }, + { + "id": 348637, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2550, + "object_class_id": 138, + "object_class": "SBDARE", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.25921830580324, + "bbox_min_lat": 40.03039763059791, + "bbox_max_lon": 128.25921830580324, + "bbox_max_lat": 40.03039763059791, + "center_distance_deg": 6.658431460416013 + }, + { + "id": 347021, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 934, + "object_class_id": 128, + "object_class": "RESARE", + "geometry_type": "AREA", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.15301551467667, + "bbox_min_lat": 39.99999935237068, + "bbox_max_lon": 128.17724684115785, + "bbox_max_lat": 40.01806372985125, + "center_distance_deg": 6.661642637404156 + }, + { + "id": 348579, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 2492, + "object_class_id": 14, + "object_class": "BUAARE", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.30847442789474, + "bbox_min_lat": 40.04744746315075, + "bbox_max_lon": 128.30847442789474, + "bbox_max_lat": 40.04744746315075, + "center_distance_deg": 6.663001330685773 + }, + { + "id": 349448, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 3361, + "object_class_id": 198, + "object_class": "_texto", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.30847442789474, + "bbox_min_lat": 40.04744746315075, + "bbox_max_lon": 128.30847442789474, + "bbox_max_lat": 40.04744746315075, + "center_distance_deg": 6.663001330685773 + }, + { + "id": 349426, + "cell_id": 32, + "source_relative_path": "03900360\\C\\03900384.C", + "source_record_index": 3339, + "object_class_id": 198, + "object_class": "_texto", + "geometry_type": "POINT", + "scale_code": "C", + "native_scale": 200000, + "bbox_min_lon": 128.18231283636675, + "bbox_min_lat": 40.01573514125338, + "bbox_max_lon": 128.18231283636675, + "bbox_max_lat": 40.01573514125338, + "center_distance_deg": 6.6636589037857945 + }, + { + "id": 325015, + "cell_id": 9, + "source_relative_path": "03900360\\B\\03900360.B", + "source_record_index": 27, + "object_class_id": 44, + "object_class": "DEPARE", + "geometry_type": "AREA", + "scale_code": "B", + "native_scale": 1000000, + "bbox_min_lon": 129.7352539534024, + "bbox_min_lat": 40.217368958485515, + "bbox_max_lon": 129.80559804320728, + "bbox_max_lat": 40.263668843115546, + "center_distance_deg": 6.6639342372357415 + }, + { + "id": 325152, + "cell_id": 9, + "source_relative_path": "03900360\\B\\03900360.B", + "source_record_index": 164, + "object_class_id": 45, + "object_class": "DEPCNT", + "geometry_type": "LINE", + "scale_code": "B", + "native_scale": 1000000, + "bbox_min_lon": 129.7352539534024, + "bbox_min_lat": 40.217368958485515, + "bbox_max_lon": 129.80559804320728, + "bbox_max_lat": 40.263668843115546, + "center_distance_deg": 6.6639342372357415 + } + ], + "coarse_feature_grid": [ + { + "lon_bin": 140.0, + "lat_bin": 20.0, + "feature_count": 3 + }, + { + "lon_bin": 142.0, + "lat_bin": 20.0, + "feature_count": 45 + }, + { + "lon_bin": 144.0, + "lat_bin": 20.0, + "feature_count": 500 + }, + { + "lon_bin": 146.0, + "lat_bin": 20.0, + "feature_count": 4 + }, + { + "lon_bin": 150.0, + "lat_bin": 20.0, + "feature_count": 32 + }, + { + "lon_bin": 152.0, + "lat_bin": 20.0, + "feature_count": 22 + }, + { + "lon_bin": 140.0, + "lat_bin": 22.0, + "feature_count": 38 + }, + { + "lon_bin": 142.0, + "lat_bin": 22.0, + "feature_count": 41 + }, + { + "lon_bin": 144.0, + "lat_bin": 22.0, + "feature_count": 19 + }, + { + "lon_bin": 146.0, + "lat_bin": 22.0, + "feature_count": 7 + }, + { + "lon_bin": 150.0, + "lat_bin": 22.0, + "feature_count": 21 + }, + { + "lon_bin": 152.0, + "lat_bin": 22.0, + "feature_count": 21 + }, + { + "lon_bin": 158.0, + "lat_bin": 22.0, + "feature_count": 1 + }, + { + "lon_bin": 140.0, + "lat_bin": 24.0, + "feature_count": 1007 + }, + { + "lon_bin": 142.0, + "lat_bin": 24.0, + "feature_count": 29 + }, + { + "lon_bin": 144.0, + "lat_bin": 24.0, + "feature_count": 16 + }, + { + "lon_bin": 146.0, + "lat_bin": 24.0, + "feature_count": 11 + }, + { + "lon_bin": 150.0, + "lat_bin": 24.0, + "feature_count": 23 + }, + { + "lon_bin": 152.0, + "lat_bin": 24.0, + "feature_count": 46 + }, + { + "lon_bin": 154.0, + "lat_bin": 24.0, + "feature_count": 3 + }, + { + "lon_bin": 140.0, + "lat_bin": 26.0, + "feature_count": 216 + }, + { + "lon_bin": 142.0, + "lat_bin": 26.0, + "feature_count": 17745 + }, + { + "lon_bin": 144.0, + "lat_bin": 26.0, + "feature_count": 34 + }, + { + "lon_bin": 146.0, + "lat_bin": 26.0, + "feature_count": 7 + }, + { + "lon_bin": 140.0, + "lat_bin": 28.0, + "feature_count": 46 + }, + { + "lon_bin": 142.0, + "lat_bin": 28.0, + "feature_count": 11 + }, + { + "lon_bin": 144.0, + "lat_bin": 28.0, + "feature_count": 10 + }, + { + "lon_bin": 146.0, + "lat_bin": 28.0, + "feature_count": 8 + }, + { + "lon_bin": 140.0, + "lat_bin": 30.0, + "feature_count": 362 + }, + { + "lon_bin": 142.0, + "lat_bin": 30.0, + "feature_count": 20 + }, + { + "lon_bin": 144.0, + "lat_bin": 30.0, + "feature_count": 9 + }, + { + "lon_bin": 146.0, + "lat_bin": 30.0, + "feature_count": 10 + }, + { + "lon_bin": 148.0, + "lat_bin": 30.0, + "feature_count": 11 + }, + { + "lon_bin": 150.0, + "lat_bin": 30.0, + "feature_count": 8 + }, + { + "lon_bin": 140.0, + "lat_bin": 32.0, + "feature_count": 121 + }, + { + "lon_bin": 142.0, + "lat_bin": 32.0, + "feature_count": 17 + }, + { + "lon_bin": 144.0, + "lat_bin": 32.0, + "feature_count": 5 + }, + { + "lon_bin": 146.0, + "lat_bin": 32.0, + "feature_count": 3 + }, + { + "lon_bin": 148.0, + "lat_bin": 32.0, + "feature_count": 5 + }, + { + "lon_bin": 150.0, + "lat_bin": 32.0, + "feature_count": 11 + }, + { + "lon_bin": 138.0, + "lat_bin": 34.0, + "feature_count": 1 + }, + { + "lon_bin": 140.0, + "lat_bin": 34.0, + "feature_count": 9545 + }, + { + "lon_bin": 142.0, + "lat_bin": 34.0, + "feature_count": 13 + }, + { + "lon_bin": 144.0, + "lat_bin": 34.0, + "feature_count": 15 + }, + { + "lon_bin": 146.0, + "lat_bin": 34.0, + "feature_count": 1 + }, + { + "lon_bin": 148.0, + "lat_bin": 34.0, + "feature_count": 12 + }, + { + "lon_bin": 150.0, + "lat_bin": 34.0, + "feature_count": 10 + }, + { + "lon_bin": 154.0, + "lat_bin": 34.0, + "feature_count": 1 + }, + { + "lon_bin": 158.0, + "lat_bin": 34.0, + "feature_count": 1 + }, + { + "lon_bin": 140.0, + "lat_bin": 36.0, + "feature_count": 4010 + }, + { + "lon_bin": 142.0, + "lat_bin": 36.0, + "feature_count": 14 + }, + { + "lon_bin": 144.0, + "lat_bin": 36.0, + "feature_count": 27 + }, + { + "lon_bin": 146.0, + "lat_bin": 36.0, + "feature_count": 2 + }, + { + "lon_bin": 148.0, + "lat_bin": 36.0, + "feature_count": 2 + }, + { + "lon_bin": 150.0, + "lat_bin": 36.0, + "feature_count": 2 + }, + { + "lon_bin": 140.0, + "lat_bin": 38.0, + "feature_count": 19774 + }, + { + "lon_bin": 142.0, + "lat_bin": 38.0, + "feature_count": 1417 + }, + { + "lon_bin": 144.0, + "lat_bin": 38.0, + "feature_count": 19 + }, + { + "lon_bin": 146.0, + "lat_bin": 38.0, + "feature_count": 7 + }, + { + "lon_bin": 148.0, + "lat_bin": 38.0, + "feature_count": 6 + }, + { + "lon_bin": 150.0, + "lat_bin": 38.0, + "feature_count": 6 + }, + { + "lon_bin": 120.0, + "lat_bin": 40.0, + "feature_count": 6912 + }, + { + "lon_bin": 122.0, + "lat_bin": 40.0, + "feature_count": 4049 + }, + { + "lon_bin": 124.0, + "lat_bin": 40.0, + "feature_count": 380 + }, + { + "lon_bin": 126.0, + "lat_bin": 40.0, + "feature_count": 229 + }, + { + "lon_bin": 128.0, + "lat_bin": 40.0, + "feature_count": 3190 + }, + { + "lon_bin": 130.0, + "lat_bin": 40.0, + "feature_count": 171 + }, + { + "lon_bin": 132.0, + "lat_bin": 40.0, + "feature_count": 109 + }, + { + "lon_bin": 134.0, + "lat_bin": 40.0, + "feature_count": 103 + }, + { + "lon_bin": 136.0, + "lat_bin": 40.0, + "feature_count": 8 + }, + { + "lon_bin": 138.0, + "lat_bin": 40.0, + "feature_count": 1126 + }, + { + "lon_bin": 140.0, + "lat_bin": 40.0, + "feature_count": 13520 + }, + { + "lon_bin": 142.0, + "lat_bin": 40.0, + "feature_count": 276 + }, + { + "lon_bin": 144.0, + "lat_bin": 40.0, + "feature_count": 53 + }, + { + "lon_bin": 146.0, + "lat_bin": 40.0, + "feature_count": 30 + }, + { + "lon_bin": 148.0, + "lat_bin": 40.0, + "feature_count": 23 + }, + { + "lon_bin": 150.0, + "lat_bin": 40.0, + "feature_count": 9 + }, + { + "lon_bin": 152.0, + "lat_bin": 40.0, + "feature_count": 28 + }, + { + "lon_bin": 154.0, + "lat_bin": 40.0, + "feature_count": 5 + }, + { + "lon_bin": 156.0, + "lat_bin": 40.0, + "feature_count": 8 + }, + { + "lon_bin": 158.0, + "lat_bin": 40.0, + "feature_count": 2 + }, + { + "lon_bin": 124.0, + "lat_bin": 42.0, + "feature_count": 6 + }, + { + "lon_bin": 126.0, + "lat_bin": 42.0, + "feature_count": 1 + }, + { + "lon_bin": 128.0, + "lat_bin": 42.0, + "feature_count": 21 + }, + { + "lon_bin": 130.0, + "lat_bin": 42.0, + "feature_count": 19543 + }, + { + "lon_bin": 132.0, + "lat_bin": 42.0, + "feature_count": 20452 + }, + { + "lon_bin": 134.0, + "lat_bin": 42.0, + "feature_count": 5200 + }, + { + "lon_bin": 136.0, + "lat_bin": 42.0, + "feature_count": 102 + }, + { + "lon_bin": 138.0, + "lat_bin": 42.0, + "feature_count": 1879 + }, + { + "lon_bin": 140.0, + "lat_bin": 42.0, + "feature_count": 12869 + }, + { + "lon_bin": 142.0, + "lat_bin": 42.0, + "feature_count": 1127 + }, + { + "lon_bin": 144.0, + "lat_bin": 42.0, + "feature_count": 11501 + }, + { + "lon_bin": 146.0, + "lat_bin": 42.0, + "feature_count": 3115 + }, + { + "lon_bin": 148.0, + "lat_bin": 42.0, + "feature_count": 99 + }, + { + "lon_bin": 150.0, + "lat_bin": 42.0, + "feature_count": 27 + }, + { + "lon_bin": 152.0, + "lat_bin": 42.0, + "feature_count": 43 + }, + { + "lon_bin": 154.0, + "lat_bin": 42.0, + "feature_count": 8 + }, + { + "lon_bin": 156.0, + "lat_bin": 42.0, + "feature_count": 14 + }, + { + "lon_bin": 158.0, + "lat_bin": 42.0, + "feature_count": 10 + }, + { + "lon_bin": 124.0, + "lat_bin": 44.0, + "feature_count": 1 + }, + { + "lon_bin": 126.0, + "lat_bin": 44.0, + "feature_count": 1 + }, + { + "lon_bin": 132.0, + "lat_bin": 44.0, + "feature_count": 8 + }, + { + "lon_bin": 134.0, + "lat_bin": 44.0, + "feature_count": 2054 + }, + { + "lon_bin": 136.0, + "lat_bin": 44.0, + "feature_count": 4291 + }, + { + "lon_bin": 138.0, + "lat_bin": 44.0, + "feature_count": 170 + }, + { + "lon_bin": 140.0, + "lat_bin": 44.0, + "feature_count": 3578 + }, + { + "lon_bin": 142.0, + "lat_bin": 44.0, + "feature_count": 978 + }, + { + "lon_bin": 144.0, + "lat_bin": 44.0, + "feature_count": 522 + }, + { + "lon_bin": 146.0, + "lat_bin": 44.0, + "feature_count": 8844 + }, + { + "lon_bin": 148.0, + "lat_bin": 44.0, + "feature_count": 7004 + }, + { + "lon_bin": 150.0, + "lat_bin": 44.0, + "feature_count": 1086 + }, + { + "lon_bin": 152.0, + "lat_bin": 44.0, + "feature_count": 44 + }, + { + "lon_bin": 154.0, + "lat_bin": 44.0, + "feature_count": 19 + }, + { + "lon_bin": 156.0, + "lat_bin": 44.0, + "feature_count": 82 + }, + { + "lon_bin": 158.0, + "lat_bin": 44.0, + "feature_count": 84 + }, + { + "lon_bin": 122.0, + "lat_bin": 46.0, + "feature_count": 1 + }, + { + "lon_bin": 128.0, + "lat_bin": 46.0, + "feature_count": 1 + }, + { + "lon_bin": 130.0, + "lat_bin": 46.0, + "feature_count": 1 + }, + { + "lon_bin": 132.0, + "lat_bin": 46.0, + "feature_count": 1 + }, + { + "lon_bin": 134.0, + "lat_bin": 46.0, + "feature_count": 1 + }, + { + "lon_bin": 136.0, + "lat_bin": 46.0, + "feature_count": 534 + }, + { + "lon_bin": 138.0, + "lat_bin": 46.0, + "feature_count": 3312 + }, + { + "lon_bin": 140.0, + "lat_bin": 46.0, + "feature_count": 1888 + }, + { + "lon_bin": 142.0, + "lat_bin": 46.0, + "feature_count": 2949 + }, + { + "lon_bin": 144.0, + "lat_bin": 46.0, + "feature_count": 85 + }, + { + "lon_bin": 146.0, + "lat_bin": 46.0, + "feature_count": 20 + }, + { + "lon_bin": 148.0, + "lat_bin": 46.0, + "feature_count": 360 + }, + { + "lon_bin": 150.0, + "lat_bin": 46.0, + "feature_count": 5088 + }, + { + "lon_bin": 152.0, + "lat_bin": 46.0, + "feature_count": 4046 + }, + { + "lon_bin": 154.0, + "lat_bin": 46.0, + "feature_count": 53 + }, + { + "lon_bin": 156.0, + "lat_bin": 46.0, + "feature_count": 144 + }, + { + "lon_bin": 158.0, + "lat_bin": 46.0, + "feature_count": 76 + }, + { + "lon_bin": 122.0, + "lat_bin": 48.0, + "feature_count": 1 + }, + { + "lon_bin": 124.0, + "lat_bin": 48.0, + "feature_count": 1 + }, + { + "lon_bin": 126.0, + "lat_bin": 48.0, + "feature_count": 2 + }, + { + "lon_bin": 128.0, + "lat_bin": 48.0, + "feature_count": 1 + }, + { + "lon_bin": 130.0, + "lat_bin": 48.0, + "feature_count": 2 + }, + { + "lon_bin": 132.0, + "lat_bin": 48.0, + "feature_count": 2 + }, + { + "lon_bin": 134.0, + "lat_bin": 48.0, + "feature_count": 4 + }, + { + "lon_bin": 136.0, + "lat_bin": 48.0, + "feature_count": 9 + }, + { + "lon_bin": 138.0, + "lat_bin": 48.0, + "feature_count": 851 + }, + { + "lon_bin": 140.0, + "lat_bin": 48.0, + "feature_count": 12378 + }, + { + "lon_bin": 142.0, + "lat_bin": 48.0, + "feature_count": 4286 + }, + { + "lon_bin": 144.0, + "lat_bin": 48.0, + "feature_count": 627 + }, + { + "lon_bin": 146.0, + "lat_bin": 48.0, + "feature_count": 6 + }, + { + "lon_bin": 148.0, + "lat_bin": 48.0, + "feature_count": 22 + }, + { + "lon_bin": 150.0, + "lat_bin": 48.0, + "feature_count": 41 + }, + { + "lon_bin": 152.0, + "lat_bin": 48.0, + "feature_count": 3591 + }, + { + "lon_bin": 154.0, + "lat_bin": 48.0, + "feature_count": 5743 + }, + { + "lon_bin": 156.0, + "lat_bin": 48.0, + "feature_count": 93 + }, + { + "lon_bin": 158.0, + "lat_bin": 48.0, + "feature_count": 6 + } + ], + "diagnosis": "NO_CM95_GEOMETRY_FOUND_IN_KARATSU_AOI", + "direct_geometry_total": 0, + "direct_geometry_errors": [] +} \ No newline at end of file diff --git a/cm95_karatsu_presence_diagnostic_v2.py b/cm95_karatsu_presence_diagnostic_v2.py new file mode 100644 index 0000000..50bcaf7 --- /dev/null +++ b/cm95_karatsu_presence_diagnostic_v2.py @@ -0,0 +1,304 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +CM95 唐津 AOI Presence Diagnostic v2 + +只读诊断: +1) chart_cell bbox 是否覆盖唐津 z10/881/410; +2) chart_feature bbox 是否命中; +3) 实际 Point/Line/Area geometry 是否通过 MBRIntersects 命中; +4) Sounding point 是否命中; +5) 输出离唐津中心最近的 Cell / Feature,帮助判断 Dataset 1 是否根本没有唐津细节数据。 + +不修改数据库。 +""" + +from __future__ import annotations +import argparse +import getpass +import json +import math +from pathlib import Path +from datetime import datetime + +import pymysql +from pymysql.cursors import DictCursor + +LON_MIN = 129.7265625 +LAT_MIN = 33.4314413355753 +LON_MAX = 130.078125 +LAT_MAX = 33.7243396617476 +CENTER_LON = (LON_MIN + LON_MAX) / 2 +CENTER_LAT = (LAT_MIN + LAT_MAX) / 2 + + +def args(): + p = argparse.ArgumentParser() + p.add_argument("--host", default="127.0.0.1") + p.add_argument("--port", type=int, default=3306) + p.add_argument("--user", default="root") + p.add_argument("--password") + p.add_argument("--database", default="cm93_chart") + p.add_argument("--dataset-id", type=int, default=1) + p.add_argument("--output", default="cm95_karatsu_presence_diagnostic_v2.json") + return p.parse_args() + + +def fetch(cur, sql, params=()): + cur.execute(sql, params) + return list(cur.fetchall()) + + +def scalar(cur, sql, params=()): + cur.execute(sql, params) + r = cur.fetchone() + return None if not r else next(iter(r.values())) + + +def main(): + a = args() + if a.password is None: + a.password = getpass.getpass("MySQL password: ") + + conn = pymysql.connect( + host=a.host, port=a.port, user=a.user, password=a.password, + database=a.database, charset="utf8mb4", + cursorclass=DictCursor, autocommit=False, + connect_timeout=20, read_timeout=900, + ) + + report = { + "version": "v2", + "generated_at": datetime.now().isoformat(timespec="seconds"), + "dataset_id": a.dataset_id, + "target": { + "tile": "z10/881/410", + "bbox": [LON_MIN, LAT_MIN, LON_MAX, LAT_MAX], + "center": [CENTER_LON, CENTER_LAT], + }, + "read_only": True, + } + + poly_wkt = ( + f"POLYGON(({LON_MIN} {LAT_MIN}," + f"{LON_MAX} {LAT_MIN}," + f"{LON_MAX} {LAT_MAX}," + f"{LON_MIN} {LAT_MAX}," + f"{LON_MIN} {LAT_MIN}))" + ) + + try: + with conn.cursor() as cur: + try: + cur.execute("SET SESSION TRANSACTION READ ONLY") + cur.execute("START TRANSACTION READ ONLY") + except Exception: + cur.execute("START TRANSACTION") + + report["dataset"] = fetch(cur, """ + SELECT id,name,source_type,source_root,parser_version,normalized_srid + FROM chart_dataset WHERE id=%s + """, (a.dataset_id,)) + + report["global_feature_bbox"] = fetch(cur, """ + SELECT + MIN(bbox_min_lon) min_lon, + MIN(bbox_min_lat) min_lat, + MAX(bbox_max_lon) max_lon, + MAX(bbox_max_lat) max_lat, + SUM(bbox_min_lon IS NOT NULL) bbox_rows, + COUNT(*) total_rows + FROM chart_feature + WHERE dataset_id=%s + """, (a.dataset_id,)) + + report["global_cell_bbox"] = fetch(cur, """ + SELECT + MIN(bbox_min_lon) min_lon, + MIN(bbox_min_lat) min_lat, + MAX(bbox_max_lon) max_lon, + MAX(bbox_max_lat) max_lat, + SUM(bbox_min_lon IS NOT NULL) bbox_rows, + COUNT(*) total_rows + FROM chart_cell + WHERE dataset_id=%s + """, (a.dataset_id,)) + + bbox_params = ( + a.dataset_id, + LON_MIN, LON_MAX, LAT_MIN, LAT_MAX, + ) + + report["cell_bbox_overlap"] = fetch(cur, """ + SELECT id,source_relative_path,scale_code,native_scale, + bbox_min_lon,bbox_min_lat,bbox_max_lon,bbox_max_lat, + feature_count + FROM chart_cell + WHERE dataset_id=%s + AND bbox_max_lon >= %s + AND bbox_min_lon <= %s + AND bbox_max_lat >= %s + AND bbox_min_lat <= %s + ORDER BY native_scale,source_relative_path + """, bbox_params) + + report["feature_bbox_count"] = scalar(cur, """ + SELECT COUNT(*) + FROM chart_feature + WHERE dataset_id=%s + AND bbox_max_lon >= %s + AND bbox_min_lon <= %s + AND bbox_max_lat >= %s + AND bbox_min_lat <= %s + """, bbox_params) + + # Direct actual geometry checks. These bypass chart_feature bbox metadata. + direct = {} + for kind, table in [ + ("point", "chart_point_geometry"), + ("line", "chart_line_geometry"), + ("area", "chart_area_geometry"), + ]: + try: + direct[kind] = scalar(cur, f""" + SELECT COUNT(*) + FROM {table} g + JOIN chart_feature f ON f.id=g.feature_id + WHERE f.dataset_id=%s + AND MBRIntersects( + g.geom, + ST_GeomFromText(%s,4326) + ) + """, (a.dataset_id, poly_wkt)) + except Exception as e: + direct[kind] = {"error": str(e)} + + report["direct_geometry_mbr_counts"] = direct + + try: + report["sounding_bbox_count"] = scalar(cur, """ + SELECT COUNT(*) + FROM chart_sounding_point s + JOIN chart_feature f ON f.id=s.feature_id + WHERE f.dataset_id=%s + AND ST_X(s.geom) BETWEEN %s AND %s + AND ST_Y(s.geom) BETWEEN %s AND %s + """, ( + a.dataset_id, + LON_MIN, LON_MAX, LAT_MIN, LAT_MAX, + )) + except Exception as e: + report["sounding_bbox_count"] = {"error": str(e)} + + # Nearest cell by bbox center, excluding pathological world-scale cells when possible. + report["nearest_cells"] = fetch(cur, """ + SELECT id,source_relative_path,scale_code,native_scale, + bbox_min_lon,bbox_min_lat,bbox_max_lon,bbox_max_lat, + feature_count, + SQRT( + POW(((bbox_min_lon+bbox_max_lon)/2)-%s,2) + + POW(((bbox_min_lat+bbox_max_lat)/2)-%s,2) + ) AS center_distance_deg + FROM chart_cell + WHERE dataset_id=%s + AND bbox_min_lon IS NOT NULL + AND bbox_min_lat IS NOT NULL + AND bbox_max_lon IS NOT NULL + AND bbox_max_lat IS NOT NULL + AND (bbox_max_lon-bbox_min_lon) < 20 + AND (bbox_max_lat-bbox_min_lat) < 20 + ORDER BY center_distance_deg ASC + LIMIT 30 + """, (CENTER_LON, CENTER_LAT, a.dataset_id)) + + report["nearest_features"] = fetch(cur, """ + SELECT f.id,f.cell_id,c.source_relative_path, + f.source_record_index,f.object_class_id,f.object_class, + f.geometry_type,f.scale_code,f.native_scale, + f.bbox_min_lon,f.bbox_min_lat,f.bbox_max_lon,f.bbox_max_lat, + SQRT( + POW(((f.bbox_min_lon+f.bbox_max_lon)/2)-%s,2) + + POW(((f.bbox_min_lat+f.bbox_max_lat)/2)-%s,2) + ) AS center_distance_deg + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.bbox_min_lon IS NOT NULL + AND f.bbox_min_lat IS NOT NULL + AND f.bbox_max_lon IS NOT NULL + AND f.bbox_max_lat IS NOT NULL + ORDER BY center_distance_deg ASC + LIMIT 50 + """, (CENTER_LON, CENTER_LAT, a.dataset_id)) + + # Coarse 2-degree spatial occupancy by feature bbox center. + report["coarse_feature_grid"] = fetch(cur, """ + SELECT + FLOOR(((bbox_min_lon+bbox_max_lon)/2)/2)*2 AS lon_bin, + FLOOR(((bbox_min_lat+bbox_max_lat)/2)/2)*2 AS lat_bin, + COUNT(*) AS feature_count + FROM chart_feature + WHERE dataset_id=%s + AND bbox_min_lon IS NOT NULL + AND bbox_min_lat IS NOT NULL + AND bbox_max_lon IS NOT NULL + AND bbox_max_lat IS NOT NULL + AND ((bbox_min_lon+bbox_max_lon)/2) BETWEEN 120 AND 160 + AND ((bbox_min_lat+bbox_max_lat)/2) BETWEEN 20 AND 50 + GROUP BY lon_bin,lat_bin + ORDER BY lat_bin,lon_bin + """, (a.dataset_id,)) + + conn.rollback() + finally: + conn.close() + + # Derive diagnosis. + fcnt = report.get("feature_bbox_count") + d = report.get("direct_geometry_mbr_counts", {}) + direct_sum = 0 + direct_errors = [] + for k, v in d.items(): + if isinstance(v, int): + direct_sum += v + else: + direct_errors.append((k, v)) + + if isinstance(fcnt, int) and fcnt > 0: + diagnosis = "AOI_PRESENT_BY_FEATURE_BBOX" + elif direct_sum > 0: + diagnosis = "AOI_PRESENT_IN_GEOMETRY_BUT_FEATURE_BBOX_QUERY_FAILED" + else: + diagnosis = "NO_CM95_GEOMETRY_FOUND_IN_KARATSU_AOI" + + report["diagnosis"] = diagnosis + report["direct_geometry_total"] = direct_sum + report["direct_geometry_errors"] = direct_errors + + out = Path(a.output).resolve() + out.write_text(json.dumps(report, ensure_ascii=False, indent=2, default=str), encoding="utf-8") + + print("CM95 唐津 AOI Presence Diagnostic v2") + print("=" * 72) + print("Target bbox :", [LON_MIN, LAT_MIN, LON_MAX, LAT_MAX]) + print("Cell bbox overlap :", len(report["cell_bbox_overlap"])) + print("Feature bbox count:", report["feature_bbox_count"]) + print("Direct geometry :", report["direct_geometry_mbr_counts"]) + print("Soundings :", report["sounding_bbox_count"]) + print("Diagnosis :", diagnosis) + print("") + print("Nearest cells:") + for r in report["nearest_cells"][:10]: + print( + f" {r['source_relative_path']} scale={r['native_scale']} " + f"bbox=({r['bbox_min_lon']},{r['bbox_min_lat']}," + f"{r['bbox_max_lon']},{r['bbox_max_lat']}) " + f"dist={float(r['center_distance_deg']):.3f}°" + ) + print("") + print("Output:", out) + print("把 JSON 上传给 ChatGPT。") + + +if __name__ == "__main__": + main() diff --git a/cm95_nav_aid_relation_audit_v1.json b/cm95_nav_aid_relation_audit_v1.json new file mode 100644 index 0000000..b28fba1 --- /dev/null +++ b/cm95_nav_aid_relation_audit_v1.json @@ -0,0 +1,4794 @@ +{ + "version": "v1", + "generated_at": "2026-09-03T09:22:40", + "dataset_id": 1, + "aoi_bbox": [ + 141.328125, + 40.44694705960049, + 141.6796875, + 40.71395582628604 + ], + "coord_tolerance_deg": 1e-07, + "counts": { + "nav_point_rows": 233, + "relation_groups": 93, + "rows_without_relation20": 46, + "coord_conflict_groups": 0, + "light_total": 96, + "light_with_relation20": 94, + "light_mergeable_by_relation20": 94, + "light_relation_without_base": 0, + "light_standalone_required": 2 + }, + "no_relation_by_class": { + "LIGHTS": 2, + "BCNSPP": 6, + "RTPBCN": 1, + "SISTAT": 4, + "TOWERS": 32, + "SISTAW": 1 + }, + "groups": [ + { + "cell_id": 12, + "relation20": 2028, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 329223, + "source_record_index": 1400, + "object_class": "LIGHTS", + "native_scale": 1000000, + "lon": 141.57442375474542, + "lat": 40.53965048898594, + "attributes": { + "COLOUR": [ + 1 + ], + "HEIGHT": 57, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 8, + "VALNMR": 19, + "_cm93_relation20_raw": 2028 + } + }, + { + "feature_id": 329025, + "source_record_index": 1202, + "object_class": "TOWERS", + "native_scale": 1000000, + "lon": 141.57442375474542, + "lat": 40.53965048898594, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,UKHO,graph,LL M-6620", + "VERLEN": 23, + "_cm93_relation20_raw": 2028 + } + } + ] + }, + { + "cell_id": 12, + "relation20": 2039, + "member_count": 2, + "classes": { + "BCNSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 329077, + "source_record_index": 1254, + "object_class": "BCNSPP", + "native_scale": 1000000, + "lon": 141.47157794882685, + "lat": 40.54722276035132, + "attributes": { + "CATSPM": 27, + "INFORM": "Metal", + "SORIND": "GB,UKHO,graph,LL M-6625", + "VERLEN": 43, + "_cm93_relation20_raw": 2039 + } + }, + { + "feature_id": 329240, + "source_record_index": 1417, + "object_class": "LIGHTS", + "native_scale": 1000000, + "lon": 141.47157794882685, + "lat": 40.54722276035132, + "attributes": { + "CATLIT": 5, + "COLOUR": [ + 1, + 4 + ], + "HEIGHT": 79, + "LITCHR": 19, + "SIGGRP": "(1)", + "SIGPER": 10, + "_cm93_relation20_raw": 2039 + } + } + ] + }, + { + "cell_id": 12, + "relation20": 2041, + "member_count": 2, + "classes": { + "BCNSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 329081, + "source_record_index": 1258, + "object_class": "BCNSPP", + "native_scale": 1000000, + "lon": 141.35805082775352, + "lat": 40.68748385272822, + "attributes": { + "INFORM": "Metal", + "SORIND": "GB,UKHO,graph,LL M-6626", + "_cm93_relation20_raw": 2041 + } + }, + { + "feature_id": 329190, + "source_record_index": 1367, + "object_class": "LIGHTS", + "native_scale": 1000000, + "lon": 141.35805082775352, + "lat": 40.68748385272822, + "attributes": { + "CATLIT": 5, + "COLOUR": [ + 1, + 1, + 4 + ], + "HEIGHT": 69, + "INFORM": "The white light can be apparent on 8M", + "LITCHR": 19, + "SIGGRP": "(1)", + "SIGPER": 10, + "VALNMR": 6, + "_cm93_relation20_raw": 2041 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6486, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360413, + "source_record_index": 4741, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.53481130881366, + "lat": 40.56513638820441, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 7, + "LITCHR": 2, + "SIGGRP": "(2)", + "SIGPER": 6, + "VALNMR": 5, + "_cm93_relation20_raw": 6486 + } + }, + { + "feature_id": 359972, + "source_record_index": 4300, + "object_class": "TOWERS", + "native_scale": 200000, + "lon": 141.53481130881366, + "lat": 40.56513638820441, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "SORIND": "GB,UKHO,graph,LL M-6624.86", + "VERLEN": 5, + "_cm93_relation20_raw": 6486 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6501, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360453, + "source_record_index": 4781, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.43965605140164, + "lat": 40.68046315791786, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 12, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 3, + "VALNMR": 7, + "_cm93_relation20_raw": 6501 + } + }, + { + "feature_id": 359997, + "source_record_index": 4325, + "object_class": "TOWERS", + "native_scale": 200000, + "lon": 141.43965605140164, + "lat": 40.68046315791786, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "SORIND": "GB,UKHO,graph,LL M-6625.7", + "VERLEN": 9, + "_cm93_relation20_raw": 6501 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6510, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360419, + "source_record_index": 4747, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.6269147619469, + "lat": 40.49949414054503, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 8, + "LITCHR": 2, + "SIGGRP": "(2)", + "SIGPER": 6, + "VALNMR": 3, + "_cm93_relation20_raw": 6510 + } + }, + { + "feature_id": 359963, + "source_record_index": 4291, + "object_class": "TOWERS", + "native_scale": 200000, + "lon": 141.6269147619469, + "lat": 40.49949414054503, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "SORIND": "GB,UKHO,graph,LL M-6619.5", + "VERLEN": 5, + "_cm93_relation20_raw": 6510 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6521, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360514, + "source_record_index": 4842, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.5676487228532, + "lat": 40.541909757522724, + "attributes": { + "CATLIT": 8, + "COLOUR": [ + 1 + ], + "HEIGHT": 22, + "INFORM": "Illuminates Hinode Iwa 430m NNW", + "LITCHR": 1, + "_cm93_relation20_raw": 6521 + } + }, + { + "feature_id": 359918, + "source_record_index": 4246, + "object_class": "TOWERS", + "native_scale": 200000, + "lon": 141.5676487228532, + "lat": 40.541909757522724, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,UKHO,graph,LL M-6621", + "VERLEN": 9, + "_cm93_relation20_raw": 6521 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6528, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360449, + "source_record_index": 4777, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.67305804264188, + "lat": 40.454613089799984, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 11, + "LITCHR": 7, + "SIGGRP": "(1)", + "SIGPER": 4, + "VALNMR": 4, + "_cm93_relation20_raw": 6528 + } + }, + { + "feature_id": 359976, + "source_record_index": 4304, + "object_class": "TOWERS", + "native_scale": 200000, + "lon": 141.67305804264188, + "lat": 40.454613089799984, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "SORIND": "GB,UKHO,graph,LL M-6618.4", + "VERLEN": 6, + "_cm93_relation20_raw": 6528 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6548, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360502, + "source_record_index": 4830, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.53481130881366, + "lat": 40.56201499793302, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 16, + "LITCHR": 2, + "SIGGRP": "(2)", + "SIGPER": 6, + "VALNMR": 6, + "_cm93_relation20_raw": 6548 + } + }, + { + "feature_id": 360036, + "source_record_index": 4364, + "object_class": "TOWERS", + "native_scale": 200000, + "lon": 141.53481130881366, + "lat": 40.56201499793302, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "SORIND": "GB,UKHO,graph,LL M-6624.85", + "VERLEN": 16, + "_cm93_relation20_raw": 6548 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6558, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360270, + "source_record_index": 4598, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.51424214797476, + "lat": 40.55215044794532, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 14, + "INFORM": "2 fl in 3s", + "LITCHR": 2, + "SIGGRP": "(2)", + "SIGPER": 9, + "VALNMR": 4, + "_cm93_relation20_raw": 6558 + } + }, + { + "feature_id": 359931, + "source_record_index": 4259, + "object_class": "TOWERS", + "native_scale": 200000, + "lon": 141.51424214797476, + "lat": 40.55215044794532, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,UKHO,graph,LL M-6625.5", + "VERLEN": 10, + "_cm93_relation20_raw": 6558 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6567, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360291, + "source_record_index": 4619, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.5765599913472, + "lat": 40.53922443934611, + "attributes": { + "COLOUR": [ + 1 + ], + "HEIGHT": 57, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 8, + "VALNMR": 19, + "_cm93_relation20_raw": 6567 + } + }, + { + "feature_id": 359946, + "source_record_index": 4274, + "object_class": "TOWERS", + "native_scale": 200000, + "lon": 141.5765599913472, + "lat": 40.53922443934611, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,UKHO,graph,LL M-6620", + "VERLEN": 23, + "_cm93_relation20_raw": 6567 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6602, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360111, + "source_record_index": 4439, + "object_class": "BCNLAT", + "native_scale": 200000, + "lon": 141.52785319505807, + "lat": 40.55864373294613, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "INFORM": "Concrete", + "SORIND": "GB,UKHO,graph,LL M-6624.8", + "VERLEN": 16, + "_cm93_relation20_raw": 6602 + } + }, + { + "feature_id": 360409, + "source_record_index": 4737, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.52785319505807, + "lat": 40.55864373294613, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 17, + "LITCHR": 2, + "SIGGRP": "(2)", + "SIGPER": 9, + "VALNMR": 5, + "_cm93_relation20_raw": 6602 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6620, + "member_count": 2, + "classes": { + "BCNSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360212, + "source_record_index": 4540, + "object_class": "BCNSPP", + "native_scale": 200000, + "lon": 141.3592715266989, + "lat": 40.68775404209214, + "attributes": { + "INFORM": "Metal", + "SORIND": "GB,UKHO,graph,LL M-6626", + "_cm93_relation20_raw": 6620 + } + }, + { + "feature_id": 360256, + "source_record_index": 4584, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.3592715266989, + "lat": 40.68775404209214, + "attributes": { + "CATLIT": 5, + "COLOUR": [ + 1, + 1, + 4 + ], + "HEIGHT": 69, + "INFORM": "The white light can be apparent on 8M", + "LITCHR": 19, + "SIGGRP": "(1)", + "SIGPER": 10, + "VALNMR": 6, + "_cm93_relation20_raw": 6620 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6632, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360094, + "source_record_index": 4422, + "object_class": "BCNLAT", + "native_scale": 200000, + "lon": 141.54707956201432, + "lat": 40.53735089780069, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "INFORM": "Metal", + "SORIND": "GB,UKHO,graph,LL M-6623", + "VERLEN": 10, + "_cm93_relation20_raw": 6632 + } + }, + { + "feature_id": 360386, + "source_record_index": 4714, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.54707956201432, + "lat": 40.53735089780069, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 14, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 3, + "VALNMR": 4, + "_cm93_relation20_raw": 6632 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6640, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360132, + "source_record_index": 4460, + "object_class": "BCNLAT", + "native_scale": 200000, + "lon": 141.6516343766049, + "lat": 40.472369069669675, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "SORIND": "GB,UKHO,graph,LL M-6619", + "VERLEN": 6, + "_cm93_relation20_raw": 6640 + } + }, + { + "feature_id": 360318, + "source_record_index": 4646, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.6516343766049, + "lat": 40.472369069669675, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 9, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 3, + "VALNMR": 4, + "_cm93_relation20_raw": 6640 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6657, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360164, + "source_record_index": 4492, + "object_class": "BCNLAT", + "native_scale": 200000, + "lon": 141.5203457565323, + "lat": 40.53735089780069, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "SORIND": "GB,UKHO,graph,LL M-6624.7", + "VERLEN": 9, + "_cm93_relation20_raw": 6657 + } + }, + { + "feature_id": 360345, + "source_record_index": 4673, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.5203457565323, + "lat": 40.53735089780069, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 12, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 3, + "VALNMR": 3, + "_cm93_relation20_raw": 6657 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6663, + "member_count": 2, + "classes": { + "BCNSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360210, + "source_record_index": 4538, + "object_class": "BCNSPP", + "native_scale": 200000, + "lon": 141.53426198404347, + "lat": 40.53797541747083, + "attributes": { + "COLMAR": 5, + "SORIND": "GB,UKHO,graph,LL M-6623.2", + "VERLEN": 9, + "_cm93_relation20_raw": 6663 + } + }, + { + "feature_id": 360456, + "source_record_index": 4784, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.53426198404347, + "lat": 40.53797541747083, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 12, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 5, + "VALNMR": 4, + "_cm93_relation20_raw": 6663 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6691, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360172, + "source_record_index": 4500, + "object_class": "BCNLAT", + "native_scale": 200000, + "lon": 141.55232866537378, + "lat": 40.533978390984394, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "SORIND": "GB,UKHO,graph,LL M-6624", + "VERLEN": 10, + "_cm93_relation20_raw": 6691 + } + }, + { + "feature_id": 360342, + "source_record_index": 4670, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.55232866537378, + "lat": 40.533978390984394, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 11, + "LITCHR": 2, + "SIGGRP": "(2)", + "SIGPER": 6, + "VALNMR": 3, + "_cm93_relation20_raw": 6691 + } + } + ] + }, + { + "cell_id": 40, + "relation20": 6720, + "member_count": 2, + "classes": { + "BCNSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 360211, + "source_record_index": 4539, + "object_class": "BCNSPP", + "native_scale": 200000, + "lon": 141.47084549113066, + "lat": 40.54653075073066, + "attributes": { + "INFORM": "Metal", + "SORIND": "GB,UKHO,graph,LL M-6625", + "VERLEN": 43, + "_cm93_relation20_raw": 6720 + } + }, + { + "feature_id": 360511, + "source_record_index": 4839, + "object_class": "LIGHTS", + "native_scale": 200000, + "lon": 141.47084549113066, + "lat": 40.54653075073066, + "attributes": { + "CATLIT": 5, + "COLOUR": [ + 1, + 4 + ], + "HEIGHT": 79, + "LITCHR": 19, + "SIGGRP": "(1)", + "SIGPER": 10, + "_cm93_relation20_raw": 6720 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 992, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513794, + "source_record_index": 864, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.51457109000057, + "lat": 40.552446668497204, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 14, + "INFORM": "2 fl in 3s", + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(2)", + "SIGPER": 9, + "VALNMR": 4, + "_cm93_relation20_raw": 992 + } + }, + { + "feature_id": 513761, + "source_record_index": 831, + "object_class": "TOWERS", + "native_scale": 50000, + "lon": 141.51457109000057, + "lat": 40.552446668497204, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,MDHS,graph,LL F-6625.5", + "VERLEN": 10, + "_cm93_relation20_raw": 992 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 993, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513800, + "source_record_index": 870, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.55525672908215, + "lat": 40.53632341943859, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 9, + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(1)", + "SIGPER": 6, + "VALNMR": 2, + "_cm93_relation20_raw": 993 + } + }, + { + "feature_id": 513763, + "source_record_index": 833, + "object_class": "TOWERS", + "native_scale": 50000, + "lon": 141.55525672908215, + "lat": 40.53632341943859, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "SORIND": "GB,MDHS,graph,LL F-6624.4", + "VERLEN": 9, + "_cm93_relation20_raw": 993 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 994, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513801, + "source_record_index": 871, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.54818162919935, + "lat": 40.53947009597325, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 12, + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(1)", + "SIGPER": 3, + "VALNMR": 4, + "_cm93_relation20_raw": 994 + } + }, + { + "feature_id": 513760, + "source_record_index": 830, + "object_class": "TOWERS", + "native_scale": 50000, + "lon": 141.54818162919935, + "lat": 40.53947009597325, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,MDHS,graph,LL F-6622", + "VERLEN": 10, + "_cm93_relation20_raw": 994 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 995, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513803, + "source_record_index": 873, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.53501309318457, + "lat": 40.562163473376586, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 16, + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(2)", + "SIGPER": 6, + "VALNMR": 6, + "_cm93_relation20_raw": 995 + } + }, + { + "feature_id": 513764, + "source_record_index": 834, + "object_class": "TOWERS", + "native_scale": 50000, + "lon": 141.53501309318457, + "lat": 40.562163473376586, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "SORIND": "GB,MDHS,graph,LL F-6624.85", + "VERLEN": 16, + "_cm93_relation20_raw": 995 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 996, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513795, + "source_record_index": 865, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.57615650292712, + "lat": 40.539856430562644, + "attributes": { + "COLOUR": [ + 1 + ], + "HEIGHT": 57, + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(1)", + "SIGPER": 8, + "VALNMR": 19, + "_cm93_relation20_raw": 996 + } + }, + { + "feature_id": 513762, + "source_record_index": 832, + "object_class": "TOWERS", + "native_scale": 50000, + "lon": 141.57615650292712, + "lat": 40.539856430562644, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,MDHS,graph,LL F-6620", + "VERLEN": 23, + "_cm93_relation20_raw": 996 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 997, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513802, + "source_record_index": 872, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.5340263430931, + "lat": 40.538229743548484, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 12, + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(1)", + "SIGPER": 5, + "VALNMR": 4, + "_cm93_relation20_raw": 997 + } + }, + { + "feature_id": 513758, + "source_record_index": 828, + "object_class": "TOWERS", + "native_scale": 50000, + "lon": 141.5340263430931, + "lat": 40.538229743548484, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "INFORM": "Framework tower", + "SORIND": "GB,MDHS,graph,LL F-6623.2", + "VERLEN": 9, + "_cm93_relation20_raw": 997 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 998, + "member_count": 3, + "classes": { + "LIGHTS": 2, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513804, + "source_record_index": 874, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.56775895446813, + "lat": 40.5424742970387, + "attributes": { + "COLOUR": [ + 1 + ], + "HEIGHT": 22, + "INFORM": "FW spotlight illuminates Hinode Iwa.", + "LITCHR": 1, + "QUAVEM": 1, + "_cm93_relation20_raw": 998 + } + }, + { + "feature_id": 513813, + "source_record_index": 883, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.56775895446813, + "lat": 40.5424742970387, + "attributes": { + "CATLIT": 11, + "COLOUR": [ + 1 + ], + "LITCHR": 1, + "_cm93_relation20_raw": 998 + } + }, + { + "feature_id": 513759, + "source_record_index": 829, + "object_class": "TOWERS", + "native_scale": 50000, + "lon": 141.56775895446813, + "lat": 40.5424742970387, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,MDHS,graph,LL F-6621", + "VERLEN": 9, + "_cm93_relation20_raw": 998 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 999, + "member_count": 2, + "classes": { + "BOYSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BOYSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513790, + "source_record_index": 860, + "object_class": "BOYSPP", + "native_scale": 50000, + "lon": 141.5684761285037, + "lat": 40.56065929040829, + "attributes": { + "BOYSHP": 1, + "CATSPM": 10, + "COLMAR": 4, + "INFORM": "Private mark|Wave recorder", + "_cm93_relation20_raw": 999 + } + }, + { + "feature_id": 513826, + "source_record_index": 896, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.5684761285037, + "lat": 40.56065929040829, + "attributes": { + "COLOUR": [ + 6 + ], + "_cm93_relation20_raw": 999 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1000, + "member_count": 2, + "classes": { + "BOYSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BOYSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513791, + "source_record_index": 861, + "object_class": "BOYSPP", + "native_scale": 50000, + "lon": 141.51750082223097, + "lat": 40.5455495240557, + "attributes": { + "BOYSHP": 1, + "CATSPM": 13, + "COLMAR": 4, + "_cm93_relation20_raw": 1000 + } + }, + { + "feature_id": 513827, + "source_record_index": 897, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.51750082223097, + "lat": 40.5455495240557, + "attributes": { + "COLOUR": [ + 6 + ], + "_cm93_relation20_raw": 1000 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1001, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513809, + "source_record_index": 879, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.52584750728323, + "lat": 40.53372564780069, + "attributes": { + "COLOUR": [ + 4 + ], + "LITCHR": 7, + "SIGGRP": "(1)", + "SORIND": "GB,MDHS,graph,LL F-6624.7.A", + "_cm93_relation20_raw": 1001 + } + }, + { + "feature_id": 513907, + "source_record_index": 977, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.52584750728323, + "lat": 40.53372564780069, + "attributes": { + "_cm93_relation20_raw": 1001 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1002, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513805, + "source_record_index": 875, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.52560844927135, + "lat": 40.533562965990825, + "attributes": { + "COLOUR": [ + 1 + ], + "LITCHR": 7, + "SIGGRP": "(1)", + "SORIND": "GB,MDHS,graph,LL F-6624.7.C", + "_cm93_relation20_raw": 1002 + } + }, + { + "feature_id": 513905, + "source_record_index": 975, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.52560844927135, + "lat": 40.533562965990825, + "attributes": { + "_cm93_relation20_raw": 1002 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1003, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513811, + "source_record_index": 881, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.52294320675622, + "lat": 40.530431264167966, + "attributes": { + "COLOUR": [ + 1 + ], + "LITCHR": 1, + "SORIND": "GB,MDHS,graph,LL F-6623.2.A", + "_cm93_relation20_raw": 1003 + } + }, + { + "feature_id": 513916, + "source_record_index": 986, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.52294320675622, + "lat": 40.530431264167966, + "attributes": { + "_cm93_relation20_raw": 1003 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1004, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513782, + "source_record_index": 852, + "object_class": "BCNLAT", + "native_scale": 50000, + "lon": 141.54681340355705, + "lat": 40.537767147215504, + "attributes": { + "BCNSHP": 3, + "CATLAM": 2, + "COLMAR": 3, + "INFORM": "Metal|Framework tower", + "SORIND": "GB,MDHS,graph,LL F-6623", + "VERLEN": 10, + "_cm93_relation20_raw": 1004 + } + }, + { + "feature_id": 513799, + "source_record_index": 869, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.54681340355705, + "lat": 40.537767147215504, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 14, + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(1)", + "SIGPER": 3, + "VALNMR": 4, + "_cm93_relation20_raw": 1004 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1005, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513825, + "source_record_index": 895, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.5349622297778, + "lat": 40.56547154065089, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1005 + } + }, + { + "feature_id": 513919, + "source_record_index": 989, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.5349622297778, + "lat": 40.56547154065089, + "attributes": { + "_cm93_relation20_raw": 1005 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1006, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513815, + "source_record_index": 885, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.53273441256093, + "lat": 40.53599298441033, + "attributes": { + "COLOUR": [ + 3 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1006 + } + }, + { + "feature_id": 513912, + "source_record_index": 982, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.53273441256093, + "lat": 40.53599298441033, + "attributes": { + "_cm93_relation20_raw": 1006 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1007, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513786, + "source_record_index": 856, + "object_class": "BCNLAT", + "native_scale": 50000, + "lon": 141.5524745007314, + "lat": 40.53454921840199, + "attributes": { + "BCNSHP": 3, + "CATLAM": 2, + "COLMAR": 3, + "SORIND": "GB,MDHS,graph,LL F-6624", + "VERLEN": 10, + "_cm93_relation20_raw": 1007 + } + }, + { + "feature_id": 513796, + "source_record_index": 866, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.5524745007314, + "lat": 40.53454921840199, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 11, + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(2)", + "SIGPER": 6, + "VALNMR": 3, + "_cm93_relation20_raw": 1007 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1008, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513785, + "source_record_index": 855, + "object_class": "BCNLAT", + "native_scale": 50000, + "lon": 141.52035425935122, + "lat": 40.53766039376199, + "attributes": { + "BCNSHP": 3, + "CATLAM": 2, + "COLMAR": 3, + "SORIND": "GB,MDHS,graph,LL F-6624.7", + "VERLEN": 9, + "_cm93_relation20_raw": 1008 + } + }, + { + "feature_id": 513797, + "source_record_index": 867, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.52035425935122, + "lat": 40.53766039376199, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 12, + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(1)", + "SIGPER": 3, + "VALNMR": 5, + "_cm93_relation20_raw": 1008 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1009, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513816, + "source_record_index": 886, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.52412323779345, + "lat": 40.545107310019546, + "attributes": { + "COLOUR": [ + 4 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1009 + } + }, + { + "feature_id": 513904, + "source_record_index": 974, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.52412323779345, + "lat": 40.545107310019546, + "attributes": { + "_cm93_relation20_raw": 1009 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1010, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513818, + "source_record_index": 888, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.5310508337966, + "lat": 40.54428386920667, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1010 + } + }, + { + "feature_id": 513908, + "source_record_index": 978, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.5310508337966, + "lat": 40.54428386920667, + "attributes": { + "_cm93_relation20_raw": 1010 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1011, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513822, + "source_record_index": 892, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.5495244231383, + "lat": 40.54752166145216, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1011 + } + }, + { + "feature_id": 513902, + "source_record_index": 972, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.5495244231383, + "lat": 40.54752166145216, + "attributes": { + "_cm93_relation20_raw": 1011 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1012, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513824, + "source_record_index": 894, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.51802980166147, + "lat": 40.54034951226258, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1012 + } + }, + { + "feature_id": 513906, + "source_record_index": 976, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.51802980166147, + "lat": 40.54034951226258, + "attributes": { + "_cm93_relation20_raw": 1012 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1013, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513783, + "source_record_index": 853, + "object_class": "BCNLAT", + "native_scale": 50000, + "lon": 141.53316675151854, + "lat": 40.53632341943859, + "attributes": { + "BCNSHP": 3, + "CATLAM": 2, + "COLMAR": 3, + "SORIND": "GB,MDHS,graph,LL F-6623.6", + "VERLEN": 9, + "_cm93_relation20_raw": 1013 + } + }, + { + "feature_id": 513798, + "source_record_index": 868, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.53316675151854, + "lat": 40.53632341943859, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 12, + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(1)", + "SIGPER": 5, + "VALNMR": 7, + "_cm93_relation20_raw": 1013 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1014, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513821, + "source_record_index": 891, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.52822282837974, + "lat": 40.54622554676639, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1014 + } + }, + { + "feature_id": 513913, + "source_record_index": 983, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.52822282837974, + "lat": 40.54622554676639, + "attributes": { + "_cm93_relation20_raw": 1014 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1015, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513810, + "source_record_index": 880, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.52565422633748, + "lat": 40.53388832921558, + "attributes": { + "COLOUR": [ + 4 + ], + "LITCHR": 7, + "SIGGRP": "(1)", + "SORIND": "GB,MDHS,graph,LL F-6624.7.B", + "_cm93_relation20_raw": 1015 + } + }, + { + "feature_id": 513917, + "source_record_index": 987, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.52565422633748, + "lat": 40.53388832921558, + "attributes": { + "_cm93_relation20_raw": 1015 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1016, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513808, + "source_record_index": 878, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.52510490154427, + "lat": 40.53350704402745, + "attributes": { + "COLOUR": [ + 3 + ], + "LITCHR": 7, + "SIGGRP": "(1)", + "SORIND": "GB,MDHS,graph,LL F-6624.7.F", + "_cm93_relation20_raw": 1016 + } + }, + { + "feature_id": 513920, + "source_record_index": 990, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.52510490154427, + "lat": 40.53350704402745, + "attributes": { + "_cm93_relation20_raw": 1016 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1017, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513819, + "source_record_index": 889, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.54959563190778, + "lat": 40.54994100842045, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1017 + } + }, + { + "feature_id": 513911, + "source_record_index": 981, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.54959563190778, + "lat": 40.54994100842045, + "attributes": { + "_cm93_relation20_raw": 1017 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1018, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513784, + "source_record_index": 854, + "object_class": "BCNLAT", + "native_scale": 50000, + "lon": 141.5280092020713, + "lat": 40.558667212294104, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "INFORM": "Concrete", + "SORIND": "GB,MDHS,graph,LL F-6624.8", + "VERLEN": 16, + "_cm93_relation20_raw": 1018 + } + }, + { + "feature_id": 513793, + "source_record_index": 863, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.5280092020713, + "lat": 40.558667212294104, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 17, + "INFORM": "2 fl in 3s", + "LITCHR": 2, + "QUAVEM": 1, + "SIGGRP": "(2)", + "SIGPER": 9, + "VALNMR": 5, + "_cm93_relation20_raw": 1018 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1019, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513820, + "source_record_index": 890, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.54412781567916, + "lat": 40.549463245146605, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1019 + } + }, + { + "feature_id": 513909, + "source_record_index": 979, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.54412781567916, + "lat": 40.549463245146605, + "attributes": { + "_cm93_relation20_raw": 1019 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1020, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513823, + "source_record_index": 893, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.55782533112443, + "lat": 40.545163222300296, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1020 + } + }, + { + "feature_id": 513918, + "source_record_index": 988, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.55782533112443, + "lat": 40.545163222300296, + "attributes": { + "_cm93_relation20_raw": 1020 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1021, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513807, + "source_record_index": 877, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.52536939125952, + "lat": 40.533395199960694, + "attributes": { + "COLOUR": [ + 3 + ], + "LITCHR": 7, + "SIGGRP": "(1)", + "SORIND": "GB,MDHS,graph,LL F-6624.7.E", + "_cm93_relation20_raw": 1021 + } + }, + { + "feature_id": 513910, + "source_record_index": 980, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.52536939125952, + "lat": 40.533395199960694, + "attributes": { + "_cm93_relation20_raw": 1021 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1022, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513806, + "source_record_index": 876, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.5254151683256, + "lat": 40.53372564780069, + "attributes": { + "COLOUR": [ + 1 + ], + "LITCHR": 7, + "SIGGRP": "(1)", + "SORIND": "GB,MDHS,graph,LL F-6624.7.D", + "_cm93_relation20_raw": 1022 + } + }, + { + "feature_id": 513915, + "source_record_index": 985, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.5254151683256, + "lat": 40.53372564780069, + "attributes": { + "_cm93_relation20_raw": 1022 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1023, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513814, + "source_record_index": 884, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.49825919544693, + "lat": 40.55623293432891, + "attributes": { + "COLOUR": [ + 1 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1023 + } + }, + { + "feature_id": 513914, + "source_record_index": 984, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.49825919544693, + "lat": 40.55623293432891, + "attributes": { + "_cm93_relation20_raw": 1023 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1024, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513812, + "source_record_index": 882, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.50759263059066, + "lat": 40.53502708806053, + "attributes": { + "CATLIT": 6, + "COLOUR": [ + 3 + ], + "INFORM": "More than one", + "_cm93_relation20_raw": 1024 + } + }, + { + "feature_id": 513901, + "source_record_index": 971, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.50759263059066, + "lat": 40.53502708806053, + "attributes": { + "COLMAR": 11, + "INFORM": "Height: 123m|Chimney|Visually conspicuous", + "_cm93_relation20_raw": 1024 + } + } + ] + }, + { + "cell_id": 351, + "relation20": 1025, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 513817, + "source_record_index": 887, + "object_class": "LIGHTS", + "native_scale": 50000, + "lon": 141.52097987925458, + "lat": 40.555318151462146, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 1025 + } + }, + { + "feature_id": 513903, + "source_record_index": 973, + "object_class": "_extgn", + "native_scale": 50000, + "lon": 141.52097987925458, + "lat": 40.555318151462146, + "attributes": { + "_cm93_relation20_raw": 1025 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2239, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606499, + "source_record_index": 1999, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.51452696025927, + "lat": 40.55241521469589, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 14, + "INFORM": "2 fl in 3s", + "LITCHR": 2, + "SIGGRP": "(2)", + "SIGPER": 9, + "VALNMR": 4, + "_cm93_relation20_raw": 2239 + } + }, + { + "feature_id": 606454, + "source_record_index": 1954, + "object_class": "TOWERS", + "native_scale": 20000, + "lon": 141.51452696025927, + "lat": 40.55241521469589, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,UKHO,graph,LL M-6625.5", + "VERLEN": 10, + "_cm93_relation20_raw": 2239 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2240, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606511, + "source_record_index": 2011, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.56767921143177, + "lat": 40.54238692330532, + "attributes": { + "CATLIT": 8, + "COLOUR": [ + 1 + ], + "HEIGHT": 22, + "INFORM": "Illuminates Hinode Iwa 430m NNW", + "LITCHR": 1, + "_cm93_relation20_raw": 2240 + } + }, + { + "feature_id": 606453, + "source_record_index": 1953, + "object_class": "TOWERS", + "native_scale": 20000, + "lon": 141.56767921143177, + "lat": 40.54238692330532, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,UKHO,graph,LL M-6621", + "VERLEN": 9, + "_cm93_relation20_raw": 2240 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2241, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606501, + "source_record_index": 2001, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.5759546863272, + "lat": 40.53986563666468, + "attributes": { + "COLOUR": [ + 1 + ], + "HEIGHT": 57, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 8, + "VALNMR": 19, + "_cm93_relation20_raw": 2241 + } + }, + { + "feature_id": 606455, + "source_record_index": 1955, + "object_class": "TOWERS", + "native_scale": 20000, + "lon": 141.5759546863272, + "lat": 40.53986563666468, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,UKHO,graph,LL M-6620", + "VERLEN": 23, + "_cm93_relation20_raw": 2241 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2242, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606507, + "source_record_index": 2007, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.5350198234147, + "lat": 40.56587201094555, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 7, + "LITCHR": 2, + "SIGGRP": "(2)", + "SIGPER": 6, + "VALNMR": 5, + "_cm93_relation20_raw": 2242 + } + }, + { + "feature_id": 606456, + "source_record_index": 1956, + "object_class": "TOWERS", + "native_scale": 20000, + "lon": 141.5350198234147, + "lat": 40.56587201094555, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "SORIND": "GB,UKHO,graph,LL M-6624.86", + "VERLEN": 5, + "_cm93_relation20_raw": 2242 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2243, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606509, + "source_record_index": 2009, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.54813240748382, + "lat": 40.53939288485493, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 10, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 3, + "VALNMR": 5, + "_cm93_relation20_raw": 2243 + } + }, + { + "feature_id": 606452, + "source_record_index": 1952, + "object_class": "TOWERS", + "native_scale": 20000, + "lon": 141.54813240748382, + "lat": 40.53939288485493, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "NATCON": [ + 2 + ], + "SORIND": "GB,UKHO,graph,LL M-6622", + "VERLEN": 8, + "_cm93_relation20_raw": 2243 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2244, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "TOWERS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "TOWERS" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606508, + "source_record_index": 2008, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.55521767886023, + "lat": 40.536297040550764, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 9, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 6, + "VALNMR": 3, + "_cm93_relation20_raw": 2244 + } + }, + { + "feature_id": 606457, + "source_record_index": 1957, + "object_class": "TOWERS", + "native_scale": 20000, + "lon": 141.55521767886023, + "lat": 40.536297040550764, + "attributes": { + "CATTOW": 1, + "COLOUR": [ + 1 + ], + "CONVIS": 1, + "SORIND": "GB,UKHO,graph,LL M-6624.4", + "VERLEN": 9, + "_cm93_relation20_raw": 2244 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2245, + "member_count": 2, + "classes": { + "BOYSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BOYSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606487, + "source_record_index": 1987, + "object_class": "BOYSPP", + "native_scale": 20000, + "lon": 141.54756782376322, + "lat": 40.54819670438723, + "attributes": { + "BOYSHP": 4, + "COLMAR": 4, + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2245 + } + }, + { + "feature_id": 606532, + "source_record_index": 2032, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.54756782376322, + "lat": 40.54819670438723, + "attributes": { + "COLOUR": [ + 6 + ], + "_cm93_relation20_raw": 2245 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2246, + "member_count": 2, + "classes": { + "BOYSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BOYSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606484, + "source_record_index": 1984, + "object_class": "BOYSPP", + "native_scale": 20000, + "lon": 141.51764488657207, + "lat": 40.545787460007524, + "attributes": { + "BOYSHP": 1, + "CATSPM": 27, + "COLMAR": 4, + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2246 + } + }, + { + "feature_id": 606528, + "source_record_index": 2028, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.51764488657207, + "lat": 40.545787460007524, + "attributes": { + "COLOUR": [ + 6 + ], + "_cm93_relation20_raw": 2246 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2247, + "member_count": 2, + "classes": { + "BOYSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BOYSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606485, + "source_record_index": 1985, + "object_class": "BOYSPP", + "native_scale": 20000, + "lon": 141.55372738129145, + "lat": 40.53761368147356, + "attributes": { + "BOYSHP": 4, + "COLMAR": 4, + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2247 + } + }, + { + "feature_id": 606531, + "source_record_index": 2031, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.55372738129145, + "lat": 40.53761368147356, + "attributes": { + "COLOUR": [ + 6 + ], + "_cm93_relation20_raw": 2247 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2248, + "member_count": 2, + "classes": { + "BOYSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BOYSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606482, + "source_record_index": 1982, + "object_class": "BOYSPP", + "native_scale": 20000, + "lon": 141.51602234416788, + "lat": 40.54453705850963, + "attributes": { + "BOYSHP": 1, + "CATSPM": 27, + "COLMAR": 4, + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2248 + } + }, + { + "feature_id": 606526, + "source_record_index": 2026, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.51602234416788, + "lat": 40.54453705850963, + "attributes": { + "COLOUR": [ + 6 + ], + "_cm93_relation20_raw": 2248 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2249, + "member_count": 2, + "classes": { + "BOYSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BOYSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606483, + "source_record_index": 1983, + "object_class": "BOYSPP", + "native_scale": 20000, + "lon": 141.5144252334628, + "lat": 40.54336796282291, + "attributes": { + "BOYSHP": 1, + "CATSPM": 27, + "COLMAR": 4, + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2249 + } + }, + { + "feature_id": 606530, + "source_record_index": 2030, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.5144252334628, + "lat": 40.54336796282291, + "attributes": { + "COLOUR": [ + 6 + ], + "_cm93_relation20_raw": 2249 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2250, + "member_count": 2, + "classes": { + "BOYSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BOYSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606486, + "source_record_index": 1986, + "object_class": "BOYSPP", + "native_scale": 20000, + "lon": 141.54760851448182, + "lat": 40.55077866754792, + "attributes": { + "BOYSHP": 4, + "COLMAR": 4, + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2250 + } + }, + { + "feature_id": 606525, + "source_record_index": 2025, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.54760851448182, + "lat": 40.55077866754792, + "attributes": { + "COLOUR": [ + 6 + ], + "_cm93_relation20_raw": 2250 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2251, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606474, + "source_record_index": 1974, + "object_class": "BCNLAT", + "native_scale": 20000, + "lon": 141.5279752427569, + "lat": 40.55872215426594, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "INFORM": "Concrete", + "SORIND": "GB,UKHO,graph,LL M-6624.8", + "VERLEN": 16, + "_cm93_relation20_raw": 2251 + } + }, + { + "feature_id": 606506, + "source_record_index": 2006, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.5279752427569, + "lat": 40.55872215426594, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 17, + "LITCHR": 2, + "SIGGRP": "(2)", + "SIGPER": 9, + "VALNMR": 5, + "_cm93_relation20_raw": 2251 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2252, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606517, + "source_record_index": 2017, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.47915655311542, + "lat": 40.58768781797142, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2252 + } + }, + { + "feature_id": 606718, + "source_record_index": 2218, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.47915655311542, + "lat": 40.58768781797142, + "attributes": { + "_cm93_relation20_raw": 2252 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2253, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606519, + "source_record_index": 2019, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.50487817361105, + "lat": 40.55268966278586, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2253 + } + }, + { + "feature_id": 606736, + "source_record_index": 2236, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.50487817361105, + "lat": 40.55268966278586, + "attributes": { + "_cm93_relation20_raw": 2253 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2254, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606477, + "source_record_index": 1977, + "object_class": "BCNLAT", + "native_scale": 20000, + "lon": 141.55245070999536, + "lat": 40.53446183378157, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "SORIND": "GB,UKHO,graph,LL M-6624", + "VERLEN": 10, + "_cm93_relation20_raw": 2254 + } + }, + { + "feature_id": 606502, + "source_record_index": 2002, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.55245070999536, + "lat": 40.53446183378157, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 11, + "LITCHR": 2, + "SIGGRP": "(2)", + "SIGPER": 6, + "VALNMR": 3, + "_cm93_relation20_raw": 2254 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2255, + "member_count": 2, + "classes": { + "BCNSPP": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNSPP" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606478, + "source_record_index": 1978, + "object_class": "BCNSPP", + "native_scale": 20000, + "lon": 141.53411954126562, + "lat": 40.53822878284375, + "attributes": { + "COLMAR": 5, + "SORIND": "GB,UKHO,graph,LL M-6623.2", + "VERLEN": 9, + "_cm93_relation20_raw": 2255 + } + }, + { + "feature_id": 606510, + "source_record_index": 2010, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.53411954126562, + "lat": 40.53822878284375, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 12, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 5, + "VALNMR": 4, + "_cm93_relation20_raw": 2255 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2256, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606473, + "source_record_index": 1973, + "object_class": "BCNLAT", + "native_scale": 20000, + "lon": 141.54682521814877, + "lat": 40.5377458524923, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "INFORM": "Metal", + "SORIND": "GB,UKHO,graph,LL M-6623", + "VERLEN": 10, + "_cm93_relation20_raw": 2256 + } + }, + { + "feature_id": 606505, + "source_record_index": 2005, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.54682521814877, + "lat": 40.5377458524923, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 14, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 3, + "VALNMR": 4, + "_cm93_relation20_raw": 2256 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2257, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606529, + "source_record_index": 2029, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.47109979083245, + "lat": 40.546926016675656, + "attributes": { + "CATLIT": 5, + "_cm93_relation20_raw": 2257 + } + }, + { + "feature_id": 606727, + "source_record_index": 2227, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.47109979083245, + "lat": 40.546926016675656, + "attributes": { + "_cm93_relation20_raw": 2257 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2258, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606498, + "source_record_index": 1998, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.52570164885506, + "lat": 40.53382127886439, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 4, + "LITCHR": 7, + "OBJNAM": "L2", + "SECTR1": 48, + "SECTR2": 228, + "SIGGRP": "(1)", + "SIGPER": 4, + "SORIND": "GB,UKHO,graph,LL M-6624.631", + "VALNMR": 4, + "_cm93_relation20_raw": 2258 + } + }, + { + "feature_id": 606729, + "source_record_index": 2229, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.52570164885506, + "lat": 40.53382127886439, + "attributes": { + "_cm93_relation20_raw": 2258 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2259, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606533, + "source_record_index": 2033, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.49831170889684, + "lat": 40.55619131837828, + "attributes": { + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2259 + } + }, + { + "feature_id": 606737, + "source_record_index": 2237, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.49831170889684, + "lat": 40.55619131837828, + "attributes": { + "_cm93_relation20_raw": 2259 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2260, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606515, + "source_record_index": 2015, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.5075434156794, + "lat": 40.549081088805, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2260 + } + }, + { + "feature_id": 606720, + "source_record_index": 2220, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.5075434156794, + "lat": 40.549081088805, + "attributes": { + "_cm93_relation20_raw": 2260 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2261, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606524, + "source_record_index": 2024, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.52826516412694, + "lat": 40.54623983528677, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2261 + } + }, + { + "feature_id": 606733, + "source_record_index": 2233, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.52826516412694, + "lat": 40.54623983528677, + "attributes": { + "_cm93_relation20_raw": 2261 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2262, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606516, + "source_record_index": 2016, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.51800601669967, + "lat": 40.54032821853955, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2262 + } + }, + { + "feature_id": 606716, + "source_record_index": 2216, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.51800601669967, + "lat": 40.54032821853955, + "attributes": { + "_cm93_relation20_raw": 2262 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2263, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606495, + "source_record_index": 1995, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.52535069140714, + "lat": 40.53333831674283, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 5, + "LITCHR": 7, + "OBJNAM": "R1", + "SECTR1": 228, + "SECTR2": 48, + "SIGGRP": "(1)", + "SIGPER": 4, + "SORIND": "GB,UKHO,graph,LL M-6624.64", + "VALNMR": 4, + "_cm93_relation20_raw": 2263 + } + }, + { + "feature_id": 606728, + "source_record_index": 2228, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.52535069140714, + "lat": 40.53333831674283, + "attributes": { + "_cm93_relation20_raw": 2263 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2264, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606518, + "source_record_index": 2018, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.56030401868534, + "lat": 40.544648883984316, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2264 + } + }, + { + "feature_id": 606717, + "source_record_index": 2217, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.56030401868534, + "lat": 40.544648883984316, + "attributes": { + "_cm93_relation20_raw": 2264 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2265, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606497, + "source_record_index": 1997, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.52588984342862, + "lat": 40.53368910010344, + "attributes": { + "COLOUR": [ + 4 + ], + "HEIGHT": 4, + "LITCHR": 7, + "OBJNAM": "L1", + "SECTR1": 228, + "SECTR2": 48, + "SIGGRP": "(1)", + "SIGPER": 4, + "SORIND": "GB,UKHO,graph,LL M-6624.63", + "VALNMR": 4, + "_cm93_relation20_raw": 2265 + } + }, + { + "feature_id": 606735, + "source_record_index": 2235, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.52588984342862, + "lat": 40.53368910010344, + "attributes": { + "_cm93_relation20_raw": 2265 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2266, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606493, + "source_record_index": 1993, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.52561518107802, + "lat": 40.53350099910942, + "attributes": { + "COLOUR": [ + 1 + ], + "HEIGHT": 5, + "LITCHR": 7, + "OBJNAM": "C1", + "SECTR1": 228, + "SECTR2": 48, + "SIGGRP": "(1)", + "SIGPER": 4, + "SORIND": "GB,UKHO,graph,LL M-6624.62", + "VALNMR": 6, + "_cm93_relation20_raw": 2266 + } + }, + { + "feature_id": 606726, + "source_record_index": 2226, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.52561518107802, + "lat": 40.53350099910942, + "attributes": { + "_cm93_relation20_raw": 2266 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2267, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606500, + "source_record_index": 2000, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.52294485266987, + "lat": 40.53044047091052, + "attributes": { + "COLOUR": [ + 1 + ], + "HEIGHT": 31, + "LITCHR": 1, + "OBJNAM": "C1", + "SORIND": "GB,UKHO,graph,LL M-6624.5", + "VALNMR": 6, + "_cm93_relation20_raw": 2267 + } + }, + { + "feature_id": 606730, + "source_record_index": 2230, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.52294485266987, + "lat": 40.53044047091052, + "attributes": { + "_cm93_relation20_raw": 2267 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2268, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606521, + "source_record_index": 2021, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.52094592111857, + "lat": 40.55528669920913, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2268 + } + }, + { + "feature_id": 606732, + "source_record_index": 2232, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.52094592111857, + "lat": 40.55528669920913, + "attributes": { + "_cm93_relation20_raw": 2268 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2269, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606522, + "source_record_index": 2022, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.50160257076368, + "lat": 40.552715074589145, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2269 + } + }, + { + "feature_id": 606722, + "source_record_index": 2222, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.50160257076368, + "lat": 40.552715074589145, + "attributes": { + "_cm93_relation20_raw": 2269 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2270, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606494, + "source_record_index": 1994, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.5254269865045, + "lat": 40.53363317824145, + "attributes": { + "COLOUR": [ + 1 + ], + "HEIGHT": 5, + "LITCHR": 7, + "OBJNAM": "C2", + "SECTR1": 48, + "SECTR2": 228, + "SIGGRP": "(1)", + "SIGPER": 4, + "SORIND": "GB,UKHO,graph,LL M-6624.621", + "VALNMR": 6, + "_cm93_relation20_raw": 2270 + } + }, + { + "feature_id": 606719, + "source_record_index": 2219, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.5254269865045, + "lat": 40.53363317824145, + "attributes": { + "_cm93_relation20_raw": 2270 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2271, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606513, + "source_record_index": 2013, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.53291407872706, + "lat": 40.54241742215959, + "attributes": { + "COLOUR": [ + 3 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2271 + } + }, + { + "feature_id": 606731, + "source_record_index": 2231, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.53291407872706, + "lat": 40.54241742215959, + "attributes": { + "_cm93_relation20_raw": 2271 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2272, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606476, + "source_record_index": 1976, + "object_class": "BCNLAT", + "native_scale": 20000, + "lon": 141.52043728713608, + "lat": 40.53762384848427, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "SORIND": "GB,UKHO,graph,LL M-6624.7", + "VERLEN": 9, + "_cm93_relation20_raw": 2272 + } + }, + { + "feature_id": 606503, + "source_record_index": 2003, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.52043728713608, + "lat": 40.53762384848427, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 12, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 3, + "VALNMR": 3, + "_cm93_relation20_raw": 2272 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2273, + "member_count": 2, + "classes": { + "BCNLAT": 1, + "LIGHTS": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "BCNLAT" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606475, + "source_record_index": 1975, + "object_class": "BCNLAT", + "native_scale": 20000, + "lon": 141.53323451813606, + "lat": 40.53630720776126, + "attributes": { + "CATLAM": 2, + "COLMAR": 3, + "SORIND": "GB,UKHO,graph,LL M-6623.6", + "VERLEN": 9, + "_cm93_relation20_raw": 2273 + } + }, + { + "feature_id": 606504, + "source_record_index": 2004, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.53323451813606, + "lat": 40.53630720776126, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 12, + "LITCHR": 2, + "SIGGRP": "(1)", + "SIGPER": 5, + "VALNMR": 7, + "_cm93_relation20_raw": 2273 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2274, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606514, + "source_record_index": 2014, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.52411979716945, + "lat": 40.545101266953736, + "attributes": { + "COLOUR": [ + 4 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2274 + } + }, + { + "feature_id": 606723, + "source_record_index": 2223, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.52411979716945, + "lat": 40.545101266953736, + "attributes": { + "_cm93_relation20_raw": 2274 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2275, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606512, + "source_record_index": 2012, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.53280217925092, + "lat": 40.535966605369474, + "attributes": { + "COLOUR": [ + 3 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2275 + } + }, + { + "feature_id": 606721, + "source_record_index": 2221, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.53280217925092, + "lat": 40.535966605369474, + "attributes": { + "_cm93_relation20_raw": 2275 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2276, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606496, + "source_record_index": 1996, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.5251777558531, + "lat": 40.5334501609123, + "attributes": { + "COLOUR": [ + 3 + ], + "HEIGHT": 5, + "LITCHR": 7, + "OBJNAM": "R2", + "SECTR1": 48, + "SECTR2": 228, + "SIGGRP": "(1)", + "SIGPER": 4, + "SORIND": "GB,UKHO,graph,LL M-6624.641", + "VALNMR": 4, + "_cm93_relation20_raw": 2276 + } + }, + { + "feature_id": 606725, + "source_record_index": 2225, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.5251777558531, + "lat": 40.5334501609123, + "attributes": { + "_cm93_relation20_raw": 2276 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2277, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606523, + "source_record_index": 2023, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.4824321559628, + "lat": 40.58365441116841, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2277 + } + }, + { + "feature_id": 606724, + "source_record_index": 2224, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.4824321559628, + "lat": 40.58365441116841, + "attributes": { + "_cm93_relation20_raw": 2277 + } + } + ] + }, + { + "cell_id": 693, + "relation20": 2278, + "member_count": 2, + "classes": { + "LIGHTS": 1, + "_extgn": 1 + }, + "has_light": true, + "has_base_component": true, + "base_classes": [ + "_extgn" + ], + "max_coord_spread_deg": 0.0, + "coord_ok": true, + "members": [ + { + "feature_id": 606520, + "source_record_index": 2020, + "object_class": "LIGHTS", + "native_scale": 20000, + "lon": 141.54953623727556, + "lat": 40.549818066898325, + "attributes": { + "COLOUR": [ + 6 + ], + "STATUS": [ + 8 + ], + "_cm93_relation20_raw": 2278 + } + }, + { + "feature_id": 606734, + "source_record_index": 2234, + "object_class": "_extgn", + "native_scale": 20000, + "lon": 141.54953623727556, + "lat": 40.549818066898325, + "attributes": { + "_cm93_relation20_raw": 2278 + } + } + ] + } + ], + "standalone_lights": [ + { + "feature_id": 360549, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "source_record_index": 4877, + "object_class": "LIGHTS", + "native_scale": 200000, + "bbox_min_lon": 141.65804316559033, + "bbox_min_lat": 40.467367860055134, + "attributes": {}, + "relation20": null, + "lon": 141.65804316559033, + "lat": 40.467367860055134 + }, + { + "feature_id": 606527, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2027, + "object_class": "LIGHTS", + "native_scale": 20000, + "bbox_min_lon": 141.54550785613407, + "bbox_min_lat": 40.549177658809995, + "attributes": { + "COLOUR": [ + 6 + ] + }, + "relation20": null, + "lon": 141.54550785613407, + "lat": 40.549177658809995 + } + ], + "decision": "PASS_RELATION20_PRIMARY_KEY" +} \ No newline at end of file diff --git a/cm95_nav_aid_relation_audit_v1.txt b/cm95_nav_aid_relation_audit_v1.txt new file mode 100644 index 0000000..7bf2880 --- /dev/null +++ b/cm95_nav_aid_relation_audit_v1.txt @@ -0,0 +1,14 @@ +CM95 / CM93 助航 relation20 全 AOI 审计 v1 +============================================================================ +NAV point rows : 233 +Relation groups : 93 +Rows without relation20 : 46 +Coordinate conflict groups : 0 + +LIGHTS total : 96 +LIGHTS with relation20 : 94 +LIGHTS mergeable : 94 +LIGHTS relation no base : 0 +LIGHTS standalone required : 2 + +DECISION : PASS_RELATION20_PRIMARY_KEY \ No newline at end of file diff --git a/cm95_nav_aid_relation_groups_v1.csv b/cm95_nav_aid_relation_groups_v1.csv new file mode 100644 index 0000000..05ae483 --- /dev/null +++ b/cm95_nav_aid_relation_groups_v1.csv @@ -0,0 +1,94 @@ +cell_id,relation20,member_count,classes,has_light,has_base_component,base_classes,max_coord_spread_deg,coord_ok,members +12,2028,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 329223, ""source_record_index"": 1400, ""object_class"": ""LIGHTS"", ""native_scale"": 1000000, ""lon"": 141.57442375474542, ""lat"": 40.53965048898594, ""attributes"": {""COLOUR"": [1], ""HEIGHT"": 57, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 8, ""VALNMR"": 19, ""_cm93_relation20_raw"": 2028}}, {""feature_id"": 329025, ""source_record_index"": 1202, ""object_class"": ""TOWERS"", ""native_scale"": 1000000, ""lon"": 141.57442375474542, ""lat"": 40.53965048898594, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,UKHO,graph,LL M-6620"", ""VERLEN"": 23, ""_cm93_relation20_raw"": 2028}}]" +12,2039,2,"{""BCNSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BCNSPP""]",0.0,True,"[{""feature_id"": 329077, ""source_record_index"": 1254, ""object_class"": ""BCNSPP"", ""native_scale"": 1000000, ""lon"": 141.47157794882685, ""lat"": 40.54722276035132, ""attributes"": {""CATSPM"": 27, ""INFORM"": ""Metal"", ""SORIND"": ""GB,UKHO,graph,LL M-6625"", ""VERLEN"": 43, ""_cm93_relation20_raw"": 2039}}, {""feature_id"": 329240, ""source_record_index"": 1417, ""object_class"": ""LIGHTS"", ""native_scale"": 1000000, ""lon"": 141.47157794882685, ""lat"": 40.54722276035132, ""attributes"": {""CATLIT"": 5, ""COLOUR"": [1, 4], ""HEIGHT"": 79, ""LITCHR"": 19, ""SIGGRP"": ""(1)"", ""SIGPER"": 10, ""_cm93_relation20_raw"": 2039}}]" +12,2041,2,"{""BCNSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BCNSPP""]",0.0,True,"[{""feature_id"": 329081, ""source_record_index"": 1258, ""object_class"": ""BCNSPP"", ""native_scale"": 1000000, ""lon"": 141.35805082775352, ""lat"": 40.68748385272822, ""attributes"": {""INFORM"": ""Metal"", ""SORIND"": ""GB,UKHO,graph,LL M-6626"", ""_cm93_relation20_raw"": 2041}}, {""feature_id"": 329190, ""source_record_index"": 1367, ""object_class"": ""LIGHTS"", ""native_scale"": 1000000, ""lon"": 141.35805082775352, ""lat"": 40.68748385272822, ""attributes"": {""CATLIT"": 5, ""COLOUR"": [1, 1, 4], ""HEIGHT"": 69, ""INFORM"": ""The white light can be apparent on 8M"", ""LITCHR"": 19, ""SIGGRP"": ""(1)"", ""SIGPER"": 10, ""VALNMR"": 6, ""_cm93_relation20_raw"": 2041}}]" +40,6486,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 360413, ""source_record_index"": 4741, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.53481130881366, ""lat"": 40.56513638820441, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 7, ""LITCHR"": 2, ""SIGGRP"": ""(2)"", ""SIGPER"": 6, ""VALNMR"": 5, ""_cm93_relation20_raw"": 6486}}, {""feature_id"": 359972, ""source_record_index"": 4300, ""object_class"": ""TOWERS"", ""native_scale"": 200000, ""lon"": 141.53481130881366, ""lat"": 40.56513638820441, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""SORIND"": ""GB,UKHO,graph,LL M-6624.86"", ""VERLEN"": 5, ""_cm93_relation20_raw"": 6486}}]" +40,6501,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 360453, ""source_record_index"": 4781, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.43965605140164, ""lat"": 40.68046315791786, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 12, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 3, ""VALNMR"": 7, ""_cm93_relation20_raw"": 6501}}, {""feature_id"": 359997, ""source_record_index"": 4325, ""object_class"": ""TOWERS"", ""native_scale"": 200000, ""lon"": 141.43965605140164, ""lat"": 40.68046315791786, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""SORIND"": ""GB,UKHO,graph,LL M-6625.7"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 6501}}]" +40,6510,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 360419, ""source_record_index"": 4747, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.6269147619469, ""lat"": 40.49949414054503, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 8, ""LITCHR"": 2, ""SIGGRP"": ""(2)"", ""SIGPER"": 6, ""VALNMR"": 3, ""_cm93_relation20_raw"": 6510}}, {""feature_id"": 359963, ""source_record_index"": 4291, ""object_class"": ""TOWERS"", ""native_scale"": 200000, ""lon"": 141.6269147619469, ""lat"": 40.49949414054503, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""SORIND"": ""GB,UKHO,graph,LL M-6619.5"", ""VERLEN"": 5, ""_cm93_relation20_raw"": 6510}}]" +40,6521,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 360514, ""source_record_index"": 4842, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.5676487228532, ""lat"": 40.541909757522724, ""attributes"": {""CATLIT"": 8, ""COLOUR"": [1], ""HEIGHT"": 22, ""INFORM"": ""Illuminates Hinode Iwa 430m NNW"", ""LITCHR"": 1, ""_cm93_relation20_raw"": 6521}}, {""feature_id"": 359918, ""source_record_index"": 4246, ""object_class"": ""TOWERS"", ""native_scale"": 200000, ""lon"": 141.5676487228532, ""lat"": 40.541909757522724, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,UKHO,graph,LL M-6621"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 6521}}]" +40,6528,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 360449, ""source_record_index"": 4777, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.67305804264188, ""lat"": 40.454613089799984, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 11, ""LITCHR"": 7, ""SIGGRP"": ""(1)"", ""SIGPER"": 4, ""VALNMR"": 4, ""_cm93_relation20_raw"": 6528}}, {""feature_id"": 359976, ""source_record_index"": 4304, ""object_class"": ""TOWERS"", ""native_scale"": 200000, ""lon"": 141.67305804264188, ""lat"": 40.454613089799984, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""SORIND"": ""GB,UKHO,graph,LL M-6618.4"", ""VERLEN"": 6, ""_cm93_relation20_raw"": 6528}}]" +40,6548,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 360502, ""source_record_index"": 4830, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.53481130881366, ""lat"": 40.56201499793302, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 16, ""LITCHR"": 2, ""SIGGRP"": ""(2)"", ""SIGPER"": 6, ""VALNMR"": 6, ""_cm93_relation20_raw"": 6548}}, {""feature_id"": 360036, ""source_record_index"": 4364, ""object_class"": ""TOWERS"", ""native_scale"": 200000, ""lon"": 141.53481130881366, ""lat"": 40.56201499793302, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""SORIND"": ""GB,UKHO,graph,LL M-6624.85"", ""VERLEN"": 16, ""_cm93_relation20_raw"": 6548}}]" +40,6558,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 360270, ""source_record_index"": 4598, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.51424214797476, ""lat"": 40.55215044794532, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 14, ""INFORM"": ""2 fl in 3s"", ""LITCHR"": 2, ""SIGGRP"": ""(2)"", ""SIGPER"": 9, ""VALNMR"": 4, ""_cm93_relation20_raw"": 6558}}, {""feature_id"": 359931, ""source_record_index"": 4259, ""object_class"": ""TOWERS"", ""native_scale"": 200000, ""lon"": 141.51424214797476, ""lat"": 40.55215044794532, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,UKHO,graph,LL M-6625.5"", ""VERLEN"": 10, ""_cm93_relation20_raw"": 6558}}]" +40,6567,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 360291, ""source_record_index"": 4619, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.5765599913472, ""lat"": 40.53922443934611, ""attributes"": {""COLOUR"": [1], ""HEIGHT"": 57, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 8, ""VALNMR"": 19, ""_cm93_relation20_raw"": 6567}}, {""feature_id"": 359946, ""source_record_index"": 4274, ""object_class"": ""TOWERS"", ""native_scale"": 200000, ""lon"": 141.5765599913472, ""lat"": 40.53922443934611, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,UKHO,graph,LL M-6620"", ""VERLEN"": 23, ""_cm93_relation20_raw"": 6567}}]" +40,6602,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 360111, ""source_record_index"": 4439, ""object_class"": ""BCNLAT"", ""native_scale"": 200000, ""lon"": 141.52785319505807, ""lat"": 40.55864373294613, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""INFORM"": ""Concrete"", ""SORIND"": ""GB,UKHO,graph,LL M-6624.8"", ""VERLEN"": 16, ""_cm93_relation20_raw"": 6602}}, {""feature_id"": 360409, ""source_record_index"": 4737, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.52785319505807, ""lat"": 40.55864373294613, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 17, ""LITCHR"": 2, ""SIGGRP"": ""(2)"", ""SIGPER"": 9, ""VALNMR"": 5, ""_cm93_relation20_raw"": 6602}}]" +40,6620,2,"{""BCNSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BCNSPP""]",0.0,True,"[{""feature_id"": 360212, ""source_record_index"": 4540, ""object_class"": ""BCNSPP"", ""native_scale"": 200000, ""lon"": 141.3592715266989, ""lat"": 40.68775404209214, ""attributes"": {""INFORM"": ""Metal"", ""SORIND"": ""GB,UKHO,graph,LL M-6626"", ""_cm93_relation20_raw"": 6620}}, {""feature_id"": 360256, ""source_record_index"": 4584, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.3592715266989, ""lat"": 40.68775404209214, ""attributes"": {""CATLIT"": 5, ""COLOUR"": [1, 1, 4], ""HEIGHT"": 69, ""INFORM"": ""The white light can be apparent on 8M"", ""LITCHR"": 19, ""SIGGRP"": ""(1)"", ""SIGPER"": 10, ""VALNMR"": 6, ""_cm93_relation20_raw"": 6620}}]" +40,6632,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 360094, ""source_record_index"": 4422, ""object_class"": ""BCNLAT"", ""native_scale"": 200000, ""lon"": 141.54707956201432, ""lat"": 40.53735089780069, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""INFORM"": ""Metal"", ""SORIND"": ""GB,UKHO,graph,LL M-6623"", ""VERLEN"": 10, ""_cm93_relation20_raw"": 6632}}, {""feature_id"": 360386, ""source_record_index"": 4714, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.54707956201432, ""lat"": 40.53735089780069, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 14, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 3, ""VALNMR"": 4, ""_cm93_relation20_raw"": 6632}}]" +40,6640,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 360132, ""source_record_index"": 4460, ""object_class"": ""BCNLAT"", ""native_scale"": 200000, ""lon"": 141.6516343766049, ""lat"": 40.472369069669675, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""SORIND"": ""GB,UKHO,graph,LL M-6619"", ""VERLEN"": 6, ""_cm93_relation20_raw"": 6640}}, {""feature_id"": 360318, ""source_record_index"": 4646, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.6516343766049, ""lat"": 40.472369069669675, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 9, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 3, ""VALNMR"": 4, ""_cm93_relation20_raw"": 6640}}]" +40,6657,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 360164, ""source_record_index"": 4492, ""object_class"": ""BCNLAT"", ""native_scale"": 200000, ""lon"": 141.5203457565323, ""lat"": 40.53735089780069, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""SORIND"": ""GB,UKHO,graph,LL M-6624.7"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 6657}}, {""feature_id"": 360345, ""source_record_index"": 4673, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.5203457565323, ""lat"": 40.53735089780069, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 12, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 3, ""VALNMR"": 3, ""_cm93_relation20_raw"": 6657}}]" +40,6663,2,"{""BCNSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BCNSPP""]",0.0,True,"[{""feature_id"": 360210, ""source_record_index"": 4538, ""object_class"": ""BCNSPP"", ""native_scale"": 200000, ""lon"": 141.53426198404347, ""lat"": 40.53797541747083, ""attributes"": {""COLMAR"": 5, ""SORIND"": ""GB,UKHO,graph,LL M-6623.2"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 6663}}, {""feature_id"": 360456, ""source_record_index"": 4784, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.53426198404347, ""lat"": 40.53797541747083, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 12, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 5, ""VALNMR"": 4, ""_cm93_relation20_raw"": 6663}}]" +40,6691,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 360172, ""source_record_index"": 4500, ""object_class"": ""BCNLAT"", ""native_scale"": 200000, ""lon"": 141.55232866537378, ""lat"": 40.533978390984394, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""SORIND"": ""GB,UKHO,graph,LL M-6624"", ""VERLEN"": 10, ""_cm93_relation20_raw"": 6691}}, {""feature_id"": 360342, ""source_record_index"": 4670, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.55232866537378, ""lat"": 40.533978390984394, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 11, ""LITCHR"": 2, ""SIGGRP"": ""(2)"", ""SIGPER"": 6, ""VALNMR"": 3, ""_cm93_relation20_raw"": 6691}}]" +40,6720,2,"{""BCNSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BCNSPP""]",0.0,True,"[{""feature_id"": 360211, ""source_record_index"": 4539, ""object_class"": ""BCNSPP"", ""native_scale"": 200000, ""lon"": 141.47084549113066, ""lat"": 40.54653075073066, ""attributes"": {""INFORM"": ""Metal"", ""SORIND"": ""GB,UKHO,graph,LL M-6625"", ""VERLEN"": 43, ""_cm93_relation20_raw"": 6720}}, {""feature_id"": 360511, ""source_record_index"": 4839, ""object_class"": ""LIGHTS"", ""native_scale"": 200000, ""lon"": 141.47084549113066, ""lat"": 40.54653075073066, ""attributes"": {""CATLIT"": 5, ""COLOUR"": [1, 4], ""HEIGHT"": 79, ""LITCHR"": 19, ""SIGGRP"": ""(1)"", ""SIGPER"": 10, ""_cm93_relation20_raw"": 6720}}]" +351,992,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 513794, ""source_record_index"": 864, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.51457109000057, ""lat"": 40.552446668497204, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 14, ""INFORM"": ""2 fl in 3s"", ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(2)"", ""SIGPER"": 9, ""VALNMR"": 4, ""_cm93_relation20_raw"": 992}}, {""feature_id"": 513761, ""source_record_index"": 831, ""object_class"": ""TOWERS"", ""native_scale"": 50000, ""lon"": 141.51457109000057, ""lat"": 40.552446668497204, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,MDHS,graph,LL F-6625.5"", ""VERLEN"": 10, ""_cm93_relation20_raw"": 992}}]" +351,993,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 513800, ""source_record_index"": 870, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.55525672908215, ""lat"": 40.53632341943859, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 9, ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(1)"", ""SIGPER"": 6, ""VALNMR"": 2, ""_cm93_relation20_raw"": 993}}, {""feature_id"": 513763, ""source_record_index"": 833, ""object_class"": ""TOWERS"", ""native_scale"": 50000, ""lon"": 141.55525672908215, ""lat"": 40.53632341943859, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""SORIND"": ""GB,MDHS,graph,LL F-6624.4"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 993}}]" +351,994,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 513801, ""source_record_index"": 871, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.54818162919935, ""lat"": 40.53947009597325, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 12, ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(1)"", ""SIGPER"": 3, ""VALNMR"": 4, ""_cm93_relation20_raw"": 994}}, {""feature_id"": 513760, ""source_record_index"": 830, ""object_class"": ""TOWERS"", ""native_scale"": 50000, ""lon"": 141.54818162919935, ""lat"": 40.53947009597325, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,MDHS,graph,LL F-6622"", ""VERLEN"": 10, ""_cm93_relation20_raw"": 994}}]" +351,995,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 513803, ""source_record_index"": 873, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.53501309318457, ""lat"": 40.562163473376586, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 16, ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(2)"", ""SIGPER"": 6, ""VALNMR"": 6, ""_cm93_relation20_raw"": 995}}, {""feature_id"": 513764, ""source_record_index"": 834, ""object_class"": ""TOWERS"", ""native_scale"": 50000, ""lon"": 141.53501309318457, ""lat"": 40.562163473376586, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""SORIND"": ""GB,MDHS,graph,LL F-6624.85"", ""VERLEN"": 16, ""_cm93_relation20_raw"": 995}}]" +351,996,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 513795, ""source_record_index"": 865, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.57615650292712, ""lat"": 40.539856430562644, ""attributes"": {""COLOUR"": [1], ""HEIGHT"": 57, ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(1)"", ""SIGPER"": 8, ""VALNMR"": 19, ""_cm93_relation20_raw"": 996}}, {""feature_id"": 513762, ""source_record_index"": 832, ""object_class"": ""TOWERS"", ""native_scale"": 50000, ""lon"": 141.57615650292712, ""lat"": 40.539856430562644, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,MDHS,graph,LL F-6620"", ""VERLEN"": 23, ""_cm93_relation20_raw"": 996}}]" +351,997,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 513802, ""source_record_index"": 872, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.5340263430931, ""lat"": 40.538229743548484, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 12, ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(1)"", ""SIGPER"": 5, ""VALNMR"": 4, ""_cm93_relation20_raw"": 997}}, {""feature_id"": 513758, ""source_record_index"": 828, ""object_class"": ""TOWERS"", ""native_scale"": 50000, ""lon"": 141.5340263430931, ""lat"": 40.538229743548484, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""INFORM"": ""Framework tower"", ""SORIND"": ""GB,MDHS,graph,LL F-6623.2"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 997}}]" +351,998,3,"{""LIGHTS"": 2, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 513804, ""source_record_index"": 874, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.56775895446813, ""lat"": 40.5424742970387, ""attributes"": {""COLOUR"": [1], ""HEIGHT"": 22, ""INFORM"": ""FW spotlight illuminates Hinode Iwa."", ""LITCHR"": 1, ""QUAVEM"": 1, ""_cm93_relation20_raw"": 998}}, {""feature_id"": 513813, ""source_record_index"": 883, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.56775895446813, ""lat"": 40.5424742970387, ""attributes"": {""CATLIT"": 11, ""COLOUR"": [1], ""LITCHR"": 1, ""_cm93_relation20_raw"": 998}}, {""feature_id"": 513759, ""source_record_index"": 829, ""object_class"": ""TOWERS"", ""native_scale"": 50000, ""lon"": 141.56775895446813, ""lat"": 40.5424742970387, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,MDHS,graph,LL F-6621"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 998}}]" +351,999,2,"{""BOYSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BOYSPP""]",0.0,True,"[{""feature_id"": 513790, ""source_record_index"": 860, ""object_class"": ""BOYSPP"", ""native_scale"": 50000, ""lon"": 141.5684761285037, ""lat"": 40.56065929040829, ""attributes"": {""BOYSHP"": 1, ""CATSPM"": 10, ""COLMAR"": 4, ""INFORM"": ""Private mark|Wave recorder"", ""_cm93_relation20_raw"": 999}}, {""feature_id"": 513826, ""source_record_index"": 896, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.5684761285037, ""lat"": 40.56065929040829, ""attributes"": {""COLOUR"": [6], ""_cm93_relation20_raw"": 999}}]" +351,1000,2,"{""BOYSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BOYSPP""]",0.0,True,"[{""feature_id"": 513791, ""source_record_index"": 861, ""object_class"": ""BOYSPP"", ""native_scale"": 50000, ""lon"": 141.51750082223097, ""lat"": 40.5455495240557, ""attributes"": {""BOYSHP"": 1, ""CATSPM"": 13, ""COLMAR"": 4, ""_cm93_relation20_raw"": 1000}}, {""feature_id"": 513827, ""source_record_index"": 897, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.51750082223097, ""lat"": 40.5455495240557, ""attributes"": {""COLOUR"": [6], ""_cm93_relation20_raw"": 1000}}]" +351,1001,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513809, ""source_record_index"": 879, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.52584750728323, ""lat"": 40.53372564780069, ""attributes"": {""COLOUR"": [4], ""LITCHR"": 7, ""SIGGRP"": ""(1)"", ""SORIND"": ""GB,MDHS,graph,LL F-6624.7.A"", ""_cm93_relation20_raw"": 1001}}, {""feature_id"": 513907, ""source_record_index"": 977, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.52584750728323, ""lat"": 40.53372564780069, ""attributes"": {""_cm93_relation20_raw"": 1001}}]" +351,1002,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513805, ""source_record_index"": 875, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.52560844927135, ""lat"": 40.533562965990825, ""attributes"": {""COLOUR"": [1], ""LITCHR"": 7, ""SIGGRP"": ""(1)"", ""SORIND"": ""GB,MDHS,graph,LL F-6624.7.C"", ""_cm93_relation20_raw"": 1002}}, {""feature_id"": 513905, ""source_record_index"": 975, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.52560844927135, ""lat"": 40.533562965990825, ""attributes"": {""_cm93_relation20_raw"": 1002}}]" +351,1003,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513811, ""source_record_index"": 881, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.52294320675622, ""lat"": 40.530431264167966, ""attributes"": {""COLOUR"": [1], ""LITCHR"": 1, ""SORIND"": ""GB,MDHS,graph,LL F-6623.2.A"", ""_cm93_relation20_raw"": 1003}}, {""feature_id"": 513916, ""source_record_index"": 986, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.52294320675622, ""lat"": 40.530431264167966, ""attributes"": {""_cm93_relation20_raw"": 1003}}]" +351,1004,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 513782, ""source_record_index"": 852, ""object_class"": ""BCNLAT"", ""native_scale"": 50000, ""lon"": 141.54681340355705, ""lat"": 40.537767147215504, ""attributes"": {""BCNSHP"": 3, ""CATLAM"": 2, ""COLMAR"": 3, ""INFORM"": ""Metal|Framework tower"", ""SORIND"": ""GB,MDHS,graph,LL F-6623"", ""VERLEN"": 10, ""_cm93_relation20_raw"": 1004}}, {""feature_id"": 513799, ""source_record_index"": 869, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.54681340355705, ""lat"": 40.537767147215504, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 14, ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(1)"", ""SIGPER"": 3, ""VALNMR"": 4, ""_cm93_relation20_raw"": 1004}}]" +351,1005,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513825, ""source_record_index"": 895, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.5349622297778, ""lat"": 40.56547154065089, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 1005}}, {""feature_id"": 513919, ""source_record_index"": 989, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.5349622297778, ""lat"": 40.56547154065089, ""attributes"": {""_cm93_relation20_raw"": 1005}}]" +351,1006,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513815, ""source_record_index"": 885, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.53273441256093, ""lat"": 40.53599298441033, ""attributes"": {""COLOUR"": [3], ""STATUS"": [8], ""_cm93_relation20_raw"": 1006}}, {""feature_id"": 513912, ""source_record_index"": 982, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.53273441256093, ""lat"": 40.53599298441033, ""attributes"": {""_cm93_relation20_raw"": 1006}}]" +351,1007,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 513786, ""source_record_index"": 856, ""object_class"": ""BCNLAT"", ""native_scale"": 50000, ""lon"": 141.5524745007314, ""lat"": 40.53454921840199, ""attributes"": {""BCNSHP"": 3, ""CATLAM"": 2, ""COLMAR"": 3, ""SORIND"": ""GB,MDHS,graph,LL F-6624"", ""VERLEN"": 10, ""_cm93_relation20_raw"": 1007}}, {""feature_id"": 513796, ""source_record_index"": 866, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.5524745007314, ""lat"": 40.53454921840199, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 11, ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(2)"", ""SIGPER"": 6, ""VALNMR"": 3, ""_cm93_relation20_raw"": 1007}}]" +351,1008,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 513785, ""source_record_index"": 855, ""object_class"": ""BCNLAT"", ""native_scale"": 50000, ""lon"": 141.52035425935122, ""lat"": 40.53766039376199, ""attributes"": {""BCNSHP"": 3, ""CATLAM"": 2, ""COLMAR"": 3, ""SORIND"": ""GB,MDHS,graph,LL F-6624.7"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 1008}}, {""feature_id"": 513797, ""source_record_index"": 867, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.52035425935122, ""lat"": 40.53766039376199, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 12, ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(1)"", ""SIGPER"": 3, ""VALNMR"": 5, ""_cm93_relation20_raw"": 1008}}]" +351,1009,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513816, ""source_record_index"": 886, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.52412323779345, ""lat"": 40.545107310019546, ""attributes"": {""COLOUR"": [4], ""STATUS"": [8], ""_cm93_relation20_raw"": 1009}}, {""feature_id"": 513904, ""source_record_index"": 974, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.52412323779345, ""lat"": 40.545107310019546, ""attributes"": {""_cm93_relation20_raw"": 1009}}]" +351,1010,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513818, ""source_record_index"": 888, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.5310508337966, ""lat"": 40.54428386920667, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 1010}}, {""feature_id"": 513908, ""source_record_index"": 978, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.5310508337966, ""lat"": 40.54428386920667, ""attributes"": {""_cm93_relation20_raw"": 1010}}]" +351,1011,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513822, ""source_record_index"": 892, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.5495244231383, ""lat"": 40.54752166145216, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 1011}}, {""feature_id"": 513902, ""source_record_index"": 972, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.5495244231383, ""lat"": 40.54752166145216, ""attributes"": {""_cm93_relation20_raw"": 1011}}]" +351,1012,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513824, ""source_record_index"": 894, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.51802980166147, ""lat"": 40.54034951226258, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 1012}}, {""feature_id"": 513906, ""source_record_index"": 976, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.51802980166147, ""lat"": 40.54034951226258, ""attributes"": {""_cm93_relation20_raw"": 1012}}]" +351,1013,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 513783, ""source_record_index"": 853, ""object_class"": ""BCNLAT"", ""native_scale"": 50000, ""lon"": 141.53316675151854, ""lat"": 40.53632341943859, ""attributes"": {""BCNSHP"": 3, ""CATLAM"": 2, ""COLMAR"": 3, ""SORIND"": ""GB,MDHS,graph,LL F-6623.6"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 1013}}, {""feature_id"": 513798, ""source_record_index"": 868, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.53316675151854, ""lat"": 40.53632341943859, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 12, ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(1)"", ""SIGPER"": 5, ""VALNMR"": 7, ""_cm93_relation20_raw"": 1013}}]" +351,1014,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513821, ""source_record_index"": 891, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.52822282837974, ""lat"": 40.54622554676639, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 1014}}, {""feature_id"": 513913, ""source_record_index"": 983, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.52822282837974, ""lat"": 40.54622554676639, ""attributes"": {""_cm93_relation20_raw"": 1014}}]" +351,1015,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513810, ""source_record_index"": 880, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.52565422633748, ""lat"": 40.53388832921558, ""attributes"": {""COLOUR"": [4], ""LITCHR"": 7, ""SIGGRP"": ""(1)"", ""SORIND"": ""GB,MDHS,graph,LL F-6624.7.B"", ""_cm93_relation20_raw"": 1015}}, {""feature_id"": 513917, ""source_record_index"": 987, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.52565422633748, ""lat"": 40.53388832921558, ""attributes"": {""_cm93_relation20_raw"": 1015}}]" +351,1016,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513808, ""source_record_index"": 878, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.52510490154427, ""lat"": 40.53350704402745, ""attributes"": {""COLOUR"": [3], ""LITCHR"": 7, ""SIGGRP"": ""(1)"", ""SORIND"": ""GB,MDHS,graph,LL F-6624.7.F"", ""_cm93_relation20_raw"": 1016}}, {""feature_id"": 513920, ""source_record_index"": 990, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.52510490154427, ""lat"": 40.53350704402745, ""attributes"": {""_cm93_relation20_raw"": 1016}}]" +351,1017,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513819, ""source_record_index"": 889, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.54959563190778, ""lat"": 40.54994100842045, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 1017}}, {""feature_id"": 513911, ""source_record_index"": 981, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.54959563190778, ""lat"": 40.54994100842045, ""attributes"": {""_cm93_relation20_raw"": 1017}}]" +351,1018,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 513784, ""source_record_index"": 854, ""object_class"": ""BCNLAT"", ""native_scale"": 50000, ""lon"": 141.5280092020713, ""lat"": 40.558667212294104, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""INFORM"": ""Concrete"", ""SORIND"": ""GB,MDHS,graph,LL F-6624.8"", ""VERLEN"": 16, ""_cm93_relation20_raw"": 1018}}, {""feature_id"": 513793, ""source_record_index"": 863, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.5280092020713, ""lat"": 40.558667212294104, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 17, ""INFORM"": ""2 fl in 3s"", ""LITCHR"": 2, ""QUAVEM"": 1, ""SIGGRP"": ""(2)"", ""SIGPER"": 9, ""VALNMR"": 5, ""_cm93_relation20_raw"": 1018}}]" +351,1019,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513820, ""source_record_index"": 890, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.54412781567916, ""lat"": 40.549463245146605, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 1019}}, {""feature_id"": 513909, ""source_record_index"": 979, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.54412781567916, ""lat"": 40.549463245146605, ""attributes"": {""_cm93_relation20_raw"": 1019}}]" +351,1020,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513823, ""source_record_index"": 893, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.55782533112443, ""lat"": 40.545163222300296, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 1020}}, {""feature_id"": 513918, ""source_record_index"": 988, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.55782533112443, ""lat"": 40.545163222300296, ""attributes"": {""_cm93_relation20_raw"": 1020}}]" +351,1021,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513807, ""source_record_index"": 877, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.52536939125952, ""lat"": 40.533395199960694, ""attributes"": {""COLOUR"": [3], ""LITCHR"": 7, ""SIGGRP"": ""(1)"", ""SORIND"": ""GB,MDHS,graph,LL F-6624.7.E"", ""_cm93_relation20_raw"": 1021}}, {""feature_id"": 513910, ""source_record_index"": 980, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.52536939125952, ""lat"": 40.533395199960694, ""attributes"": {""_cm93_relation20_raw"": 1021}}]" +351,1022,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513806, ""source_record_index"": 876, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.5254151683256, ""lat"": 40.53372564780069, ""attributes"": {""COLOUR"": [1], ""LITCHR"": 7, ""SIGGRP"": ""(1)"", ""SORIND"": ""GB,MDHS,graph,LL F-6624.7.D"", ""_cm93_relation20_raw"": 1022}}, {""feature_id"": 513915, ""source_record_index"": 985, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.5254151683256, ""lat"": 40.53372564780069, ""attributes"": {""_cm93_relation20_raw"": 1022}}]" +351,1023,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513814, ""source_record_index"": 884, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.49825919544693, ""lat"": 40.55623293432891, ""attributes"": {""COLOUR"": [1], ""STATUS"": [8], ""_cm93_relation20_raw"": 1023}}, {""feature_id"": 513914, ""source_record_index"": 984, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.49825919544693, ""lat"": 40.55623293432891, ""attributes"": {""_cm93_relation20_raw"": 1023}}]" +351,1024,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513812, ""source_record_index"": 882, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.50759263059066, ""lat"": 40.53502708806053, ""attributes"": {""CATLIT"": 6, ""COLOUR"": [3], ""INFORM"": ""More than one"", ""_cm93_relation20_raw"": 1024}}, {""feature_id"": 513901, ""source_record_index"": 971, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.50759263059066, ""lat"": 40.53502708806053, ""attributes"": {""COLMAR"": 11, ""INFORM"": ""Height: 123m|Chimney|Visually conspicuous"", ""_cm93_relation20_raw"": 1024}}]" +351,1025,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 513817, ""source_record_index"": 887, ""object_class"": ""LIGHTS"", ""native_scale"": 50000, ""lon"": 141.52097987925458, ""lat"": 40.555318151462146, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 1025}}, {""feature_id"": 513903, ""source_record_index"": 973, ""object_class"": ""_extgn"", ""native_scale"": 50000, ""lon"": 141.52097987925458, ""lat"": 40.555318151462146, ""attributes"": {""_cm93_relation20_raw"": 1025}}]" +693,2239,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 606499, ""source_record_index"": 1999, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.51452696025927, ""lat"": 40.55241521469589, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 14, ""INFORM"": ""2 fl in 3s"", ""LITCHR"": 2, ""SIGGRP"": ""(2)"", ""SIGPER"": 9, ""VALNMR"": 4, ""_cm93_relation20_raw"": 2239}}, {""feature_id"": 606454, ""source_record_index"": 1954, ""object_class"": ""TOWERS"", ""native_scale"": 20000, ""lon"": 141.51452696025927, ""lat"": 40.55241521469589, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,UKHO,graph,LL M-6625.5"", ""VERLEN"": 10, ""_cm93_relation20_raw"": 2239}}]" +693,2240,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 606511, ""source_record_index"": 2011, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.56767921143177, ""lat"": 40.54238692330532, ""attributes"": {""CATLIT"": 8, ""COLOUR"": [1], ""HEIGHT"": 22, ""INFORM"": ""Illuminates Hinode Iwa 430m NNW"", ""LITCHR"": 1, ""_cm93_relation20_raw"": 2240}}, {""feature_id"": 606453, ""source_record_index"": 1953, ""object_class"": ""TOWERS"", ""native_scale"": 20000, ""lon"": 141.56767921143177, ""lat"": 40.54238692330532, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,UKHO,graph,LL M-6621"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 2240}}]" +693,2241,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 606501, ""source_record_index"": 2001, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.5759546863272, ""lat"": 40.53986563666468, ""attributes"": {""COLOUR"": [1], ""HEIGHT"": 57, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 8, ""VALNMR"": 19, ""_cm93_relation20_raw"": 2241}}, {""feature_id"": 606455, ""source_record_index"": 1955, ""object_class"": ""TOWERS"", ""native_scale"": 20000, ""lon"": 141.5759546863272, ""lat"": 40.53986563666468, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,UKHO,graph,LL M-6620"", ""VERLEN"": 23, ""_cm93_relation20_raw"": 2241}}]" +693,2242,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 606507, ""source_record_index"": 2007, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.5350198234147, ""lat"": 40.56587201094555, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 7, ""LITCHR"": 2, ""SIGGRP"": ""(2)"", ""SIGPER"": 6, ""VALNMR"": 5, ""_cm93_relation20_raw"": 2242}}, {""feature_id"": 606456, ""source_record_index"": 1956, ""object_class"": ""TOWERS"", ""native_scale"": 20000, ""lon"": 141.5350198234147, ""lat"": 40.56587201094555, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""SORIND"": ""GB,UKHO,graph,LL M-6624.86"", ""VERLEN"": 5, ""_cm93_relation20_raw"": 2242}}]" +693,2243,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 606509, ""source_record_index"": 2009, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.54813240748382, ""lat"": 40.53939288485493, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 10, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 3, ""VALNMR"": 5, ""_cm93_relation20_raw"": 2243}}, {""feature_id"": 606452, ""source_record_index"": 1952, ""object_class"": ""TOWERS"", ""native_scale"": 20000, ""lon"": 141.54813240748382, ""lat"": 40.53939288485493, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""NATCON"": [2], ""SORIND"": ""GB,UKHO,graph,LL M-6622"", ""VERLEN"": 8, ""_cm93_relation20_raw"": 2243}}]" +693,2244,2,"{""LIGHTS"": 1, ""TOWERS"": 1}",True,True,"[""TOWERS""]",0.0,True,"[{""feature_id"": 606508, ""source_record_index"": 2008, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.55521767886023, ""lat"": 40.536297040550764, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 9, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 6, ""VALNMR"": 3, ""_cm93_relation20_raw"": 2244}}, {""feature_id"": 606457, ""source_record_index"": 1957, ""object_class"": ""TOWERS"", ""native_scale"": 20000, ""lon"": 141.55521767886023, ""lat"": 40.536297040550764, ""attributes"": {""CATTOW"": 1, ""COLOUR"": [1], ""CONVIS"": 1, ""SORIND"": ""GB,UKHO,graph,LL M-6624.4"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 2244}}]" +693,2245,2,"{""BOYSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BOYSPP""]",0.0,True,"[{""feature_id"": 606487, ""source_record_index"": 1987, ""object_class"": ""BOYSPP"", ""native_scale"": 20000, ""lon"": 141.54756782376322, ""lat"": 40.54819670438723, ""attributes"": {""BOYSHP"": 4, ""COLMAR"": 4, ""STATUS"": [8], ""_cm93_relation20_raw"": 2245}}, {""feature_id"": 606532, ""source_record_index"": 2032, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.54756782376322, ""lat"": 40.54819670438723, ""attributes"": {""COLOUR"": [6], ""_cm93_relation20_raw"": 2245}}]" +693,2246,2,"{""BOYSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BOYSPP""]",0.0,True,"[{""feature_id"": 606484, ""source_record_index"": 1984, ""object_class"": ""BOYSPP"", ""native_scale"": 20000, ""lon"": 141.51764488657207, ""lat"": 40.545787460007524, ""attributes"": {""BOYSHP"": 1, ""CATSPM"": 27, ""COLMAR"": 4, ""STATUS"": [8], ""_cm93_relation20_raw"": 2246}}, {""feature_id"": 606528, ""source_record_index"": 2028, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.51764488657207, ""lat"": 40.545787460007524, ""attributes"": {""COLOUR"": [6], ""_cm93_relation20_raw"": 2246}}]" +693,2247,2,"{""BOYSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BOYSPP""]",0.0,True,"[{""feature_id"": 606485, ""source_record_index"": 1985, ""object_class"": ""BOYSPP"", ""native_scale"": 20000, ""lon"": 141.55372738129145, ""lat"": 40.53761368147356, ""attributes"": {""BOYSHP"": 4, ""COLMAR"": 4, ""STATUS"": [8], ""_cm93_relation20_raw"": 2247}}, {""feature_id"": 606531, ""source_record_index"": 2031, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.55372738129145, ""lat"": 40.53761368147356, ""attributes"": {""COLOUR"": [6], ""_cm93_relation20_raw"": 2247}}]" +693,2248,2,"{""BOYSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BOYSPP""]",0.0,True,"[{""feature_id"": 606482, ""source_record_index"": 1982, ""object_class"": ""BOYSPP"", ""native_scale"": 20000, ""lon"": 141.51602234416788, ""lat"": 40.54453705850963, ""attributes"": {""BOYSHP"": 1, ""CATSPM"": 27, ""COLMAR"": 4, ""STATUS"": [8], ""_cm93_relation20_raw"": 2248}}, {""feature_id"": 606526, ""source_record_index"": 2026, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.51602234416788, ""lat"": 40.54453705850963, ""attributes"": {""COLOUR"": [6], ""_cm93_relation20_raw"": 2248}}]" +693,2249,2,"{""BOYSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BOYSPP""]",0.0,True,"[{""feature_id"": 606483, ""source_record_index"": 1983, ""object_class"": ""BOYSPP"", ""native_scale"": 20000, ""lon"": 141.5144252334628, ""lat"": 40.54336796282291, ""attributes"": {""BOYSHP"": 1, ""CATSPM"": 27, ""COLMAR"": 4, ""STATUS"": [8], ""_cm93_relation20_raw"": 2249}}, {""feature_id"": 606530, ""source_record_index"": 2030, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.5144252334628, ""lat"": 40.54336796282291, ""attributes"": {""COLOUR"": [6], ""_cm93_relation20_raw"": 2249}}]" +693,2250,2,"{""BOYSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BOYSPP""]",0.0,True,"[{""feature_id"": 606486, ""source_record_index"": 1986, ""object_class"": ""BOYSPP"", ""native_scale"": 20000, ""lon"": 141.54760851448182, ""lat"": 40.55077866754792, ""attributes"": {""BOYSHP"": 4, ""COLMAR"": 4, ""STATUS"": [8], ""_cm93_relation20_raw"": 2250}}, {""feature_id"": 606525, ""source_record_index"": 2025, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.54760851448182, ""lat"": 40.55077866754792, ""attributes"": {""COLOUR"": [6], ""_cm93_relation20_raw"": 2250}}]" +693,2251,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 606474, ""source_record_index"": 1974, ""object_class"": ""BCNLAT"", ""native_scale"": 20000, ""lon"": 141.5279752427569, ""lat"": 40.55872215426594, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""INFORM"": ""Concrete"", ""SORIND"": ""GB,UKHO,graph,LL M-6624.8"", ""VERLEN"": 16, ""_cm93_relation20_raw"": 2251}}, {""feature_id"": 606506, ""source_record_index"": 2006, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.5279752427569, ""lat"": 40.55872215426594, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 17, ""LITCHR"": 2, ""SIGGRP"": ""(2)"", ""SIGPER"": 9, ""VALNMR"": 5, ""_cm93_relation20_raw"": 2251}}]" +693,2252,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606517, ""source_record_index"": 2017, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.47915655311542, ""lat"": 40.58768781797142, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 2252}}, {""feature_id"": 606718, ""source_record_index"": 2218, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.47915655311542, ""lat"": 40.58768781797142, ""attributes"": {""_cm93_relation20_raw"": 2252}}]" +693,2253,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606519, ""source_record_index"": 2019, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.50487817361105, ""lat"": 40.55268966278586, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 2253}}, {""feature_id"": 606736, ""source_record_index"": 2236, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.50487817361105, ""lat"": 40.55268966278586, ""attributes"": {""_cm93_relation20_raw"": 2253}}]" +693,2254,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 606477, ""source_record_index"": 1977, ""object_class"": ""BCNLAT"", ""native_scale"": 20000, ""lon"": 141.55245070999536, ""lat"": 40.53446183378157, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""SORIND"": ""GB,UKHO,graph,LL M-6624"", ""VERLEN"": 10, ""_cm93_relation20_raw"": 2254}}, {""feature_id"": 606502, ""source_record_index"": 2002, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.55245070999536, ""lat"": 40.53446183378157, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 11, ""LITCHR"": 2, ""SIGGRP"": ""(2)"", ""SIGPER"": 6, ""VALNMR"": 3, ""_cm93_relation20_raw"": 2254}}]" +693,2255,2,"{""BCNSPP"": 1, ""LIGHTS"": 1}",True,True,"[""BCNSPP""]",0.0,True,"[{""feature_id"": 606478, ""source_record_index"": 1978, ""object_class"": ""BCNSPP"", ""native_scale"": 20000, ""lon"": 141.53411954126562, ""lat"": 40.53822878284375, ""attributes"": {""COLMAR"": 5, ""SORIND"": ""GB,UKHO,graph,LL M-6623.2"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 2255}}, {""feature_id"": 606510, ""source_record_index"": 2010, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.53411954126562, ""lat"": 40.53822878284375, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 12, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 5, ""VALNMR"": 4, ""_cm93_relation20_raw"": 2255}}]" +693,2256,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 606473, ""source_record_index"": 1973, ""object_class"": ""BCNLAT"", ""native_scale"": 20000, ""lon"": 141.54682521814877, ""lat"": 40.5377458524923, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""INFORM"": ""Metal"", ""SORIND"": ""GB,UKHO,graph,LL M-6623"", ""VERLEN"": 10, ""_cm93_relation20_raw"": 2256}}, {""feature_id"": 606505, ""source_record_index"": 2005, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.54682521814877, ""lat"": 40.5377458524923, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 14, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 3, ""VALNMR"": 4, ""_cm93_relation20_raw"": 2256}}]" +693,2257,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606529, ""source_record_index"": 2029, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.47109979083245, ""lat"": 40.546926016675656, ""attributes"": {""CATLIT"": 5, ""_cm93_relation20_raw"": 2257}}, {""feature_id"": 606727, ""source_record_index"": 2227, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.47109979083245, ""lat"": 40.546926016675656, ""attributes"": {""_cm93_relation20_raw"": 2257}}]" +693,2258,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606498, ""source_record_index"": 1998, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.52570164885506, ""lat"": 40.53382127886439, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 4, ""LITCHR"": 7, ""OBJNAM"": ""L2"", ""SECTR1"": 48, ""SECTR2"": 228, ""SIGGRP"": ""(1)"", ""SIGPER"": 4, ""SORIND"": ""GB,UKHO,graph,LL M-6624.631"", ""VALNMR"": 4, ""_cm93_relation20_raw"": 2258}}, {""feature_id"": 606729, ""source_record_index"": 2229, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.52570164885506, ""lat"": 40.53382127886439, ""attributes"": {""_cm93_relation20_raw"": 2258}}]" +693,2259,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606533, ""source_record_index"": 2033, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.49831170889684, ""lat"": 40.55619131837828, ""attributes"": {""STATUS"": [8], ""_cm93_relation20_raw"": 2259}}, {""feature_id"": 606737, ""source_record_index"": 2237, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.49831170889684, ""lat"": 40.55619131837828, ""attributes"": {""_cm93_relation20_raw"": 2259}}]" +693,2260,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606515, ""source_record_index"": 2015, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.5075434156794, ""lat"": 40.549081088805, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 2260}}, {""feature_id"": 606720, ""source_record_index"": 2220, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.5075434156794, ""lat"": 40.549081088805, ""attributes"": {""_cm93_relation20_raw"": 2260}}]" +693,2261,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606524, ""source_record_index"": 2024, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.52826516412694, ""lat"": 40.54623983528677, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 2261}}, {""feature_id"": 606733, ""source_record_index"": 2233, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.52826516412694, ""lat"": 40.54623983528677, ""attributes"": {""_cm93_relation20_raw"": 2261}}]" +693,2262,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606516, ""source_record_index"": 2016, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.51800601669967, ""lat"": 40.54032821853955, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 2262}}, {""feature_id"": 606716, ""source_record_index"": 2216, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.51800601669967, ""lat"": 40.54032821853955, ""attributes"": {""_cm93_relation20_raw"": 2262}}]" +693,2263,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606495, ""source_record_index"": 1995, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.52535069140714, ""lat"": 40.53333831674283, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 5, ""LITCHR"": 7, ""OBJNAM"": ""R1"", ""SECTR1"": 228, ""SECTR2"": 48, ""SIGGRP"": ""(1)"", ""SIGPER"": 4, ""SORIND"": ""GB,UKHO,graph,LL M-6624.64"", ""VALNMR"": 4, ""_cm93_relation20_raw"": 2263}}, {""feature_id"": 606728, ""source_record_index"": 2228, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.52535069140714, ""lat"": 40.53333831674283, ""attributes"": {""_cm93_relation20_raw"": 2263}}]" +693,2264,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606518, ""source_record_index"": 2018, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.56030401868534, ""lat"": 40.544648883984316, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 2264}}, {""feature_id"": 606717, ""source_record_index"": 2217, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.56030401868534, ""lat"": 40.544648883984316, ""attributes"": {""_cm93_relation20_raw"": 2264}}]" +693,2265,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606497, ""source_record_index"": 1997, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.52588984342862, ""lat"": 40.53368910010344, ""attributes"": {""COLOUR"": [4], ""HEIGHT"": 4, ""LITCHR"": 7, ""OBJNAM"": ""L1"", ""SECTR1"": 228, ""SECTR2"": 48, ""SIGGRP"": ""(1)"", ""SIGPER"": 4, ""SORIND"": ""GB,UKHO,graph,LL M-6624.63"", ""VALNMR"": 4, ""_cm93_relation20_raw"": 2265}}, {""feature_id"": 606735, ""source_record_index"": 2235, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.52588984342862, ""lat"": 40.53368910010344, ""attributes"": {""_cm93_relation20_raw"": 2265}}]" +693,2266,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606493, ""source_record_index"": 1993, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.52561518107802, ""lat"": 40.53350099910942, ""attributes"": {""COLOUR"": [1], ""HEIGHT"": 5, ""LITCHR"": 7, ""OBJNAM"": ""C1"", ""SECTR1"": 228, ""SECTR2"": 48, ""SIGGRP"": ""(1)"", ""SIGPER"": 4, ""SORIND"": ""GB,UKHO,graph,LL M-6624.62"", ""VALNMR"": 6, ""_cm93_relation20_raw"": 2266}}, {""feature_id"": 606726, ""source_record_index"": 2226, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.52561518107802, ""lat"": 40.53350099910942, ""attributes"": {""_cm93_relation20_raw"": 2266}}]" +693,2267,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606500, ""source_record_index"": 2000, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.52294485266987, ""lat"": 40.53044047091052, ""attributes"": {""COLOUR"": [1], ""HEIGHT"": 31, ""LITCHR"": 1, ""OBJNAM"": ""C1"", ""SORIND"": ""GB,UKHO,graph,LL M-6624.5"", ""VALNMR"": 6, ""_cm93_relation20_raw"": 2267}}, {""feature_id"": 606730, ""source_record_index"": 2230, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.52294485266987, ""lat"": 40.53044047091052, ""attributes"": {""_cm93_relation20_raw"": 2267}}]" +693,2268,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606521, ""source_record_index"": 2021, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.52094592111857, ""lat"": 40.55528669920913, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 2268}}, {""feature_id"": 606732, ""source_record_index"": 2232, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.52094592111857, ""lat"": 40.55528669920913, ""attributes"": {""_cm93_relation20_raw"": 2268}}]" +693,2269,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606522, ""source_record_index"": 2022, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.50160257076368, ""lat"": 40.552715074589145, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 2269}}, {""feature_id"": 606722, ""source_record_index"": 2222, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.50160257076368, ""lat"": 40.552715074589145, ""attributes"": {""_cm93_relation20_raw"": 2269}}]" +693,2270,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606494, ""source_record_index"": 1994, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.5254269865045, ""lat"": 40.53363317824145, ""attributes"": {""COLOUR"": [1], ""HEIGHT"": 5, ""LITCHR"": 7, ""OBJNAM"": ""C2"", ""SECTR1"": 48, ""SECTR2"": 228, ""SIGGRP"": ""(1)"", ""SIGPER"": 4, ""SORIND"": ""GB,UKHO,graph,LL M-6624.621"", ""VALNMR"": 6, ""_cm93_relation20_raw"": 2270}}, {""feature_id"": 606719, ""source_record_index"": 2219, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.5254269865045, ""lat"": 40.53363317824145, ""attributes"": {""_cm93_relation20_raw"": 2270}}]" +693,2271,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606513, ""source_record_index"": 2013, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.53291407872706, ""lat"": 40.54241742215959, ""attributes"": {""COLOUR"": [3], ""STATUS"": [8], ""_cm93_relation20_raw"": 2271}}, {""feature_id"": 606731, ""source_record_index"": 2231, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.53291407872706, ""lat"": 40.54241742215959, ""attributes"": {""_cm93_relation20_raw"": 2271}}]" +693,2272,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 606476, ""source_record_index"": 1976, ""object_class"": ""BCNLAT"", ""native_scale"": 20000, ""lon"": 141.52043728713608, ""lat"": 40.53762384848427, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""SORIND"": ""GB,UKHO,graph,LL M-6624.7"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 2272}}, {""feature_id"": 606503, ""source_record_index"": 2003, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.52043728713608, ""lat"": 40.53762384848427, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 12, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 3, ""VALNMR"": 3, ""_cm93_relation20_raw"": 2272}}]" +693,2273,2,"{""BCNLAT"": 1, ""LIGHTS"": 1}",True,True,"[""BCNLAT""]",0.0,True,"[{""feature_id"": 606475, ""source_record_index"": 1975, ""object_class"": ""BCNLAT"", ""native_scale"": 20000, ""lon"": 141.53323451813606, ""lat"": 40.53630720776126, ""attributes"": {""CATLAM"": 2, ""COLMAR"": 3, ""SORIND"": ""GB,UKHO,graph,LL M-6623.6"", ""VERLEN"": 9, ""_cm93_relation20_raw"": 2273}}, {""feature_id"": 606504, ""source_record_index"": 2004, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.53323451813606, ""lat"": 40.53630720776126, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 12, ""LITCHR"": 2, ""SIGGRP"": ""(1)"", ""SIGPER"": 5, ""VALNMR"": 7, ""_cm93_relation20_raw"": 2273}}]" +693,2274,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606514, ""source_record_index"": 2014, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.52411979716945, ""lat"": 40.545101266953736, ""attributes"": {""COLOUR"": [4], ""STATUS"": [8], ""_cm93_relation20_raw"": 2274}}, {""feature_id"": 606723, ""source_record_index"": 2223, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.52411979716945, ""lat"": 40.545101266953736, ""attributes"": {""_cm93_relation20_raw"": 2274}}]" +693,2275,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606512, ""source_record_index"": 2012, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.53280217925092, ""lat"": 40.535966605369474, ""attributes"": {""COLOUR"": [3], ""STATUS"": [8], ""_cm93_relation20_raw"": 2275}}, {""feature_id"": 606721, ""source_record_index"": 2221, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.53280217925092, ""lat"": 40.535966605369474, ""attributes"": {""_cm93_relation20_raw"": 2275}}]" +693,2276,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606496, ""source_record_index"": 1996, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.5251777558531, ""lat"": 40.5334501609123, ""attributes"": {""COLOUR"": [3], ""HEIGHT"": 5, ""LITCHR"": 7, ""OBJNAM"": ""R2"", ""SECTR1"": 48, ""SECTR2"": 228, ""SIGGRP"": ""(1)"", ""SIGPER"": 4, ""SORIND"": ""GB,UKHO,graph,LL M-6624.641"", ""VALNMR"": 4, ""_cm93_relation20_raw"": 2276}}, {""feature_id"": 606725, ""source_record_index"": 2225, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.5251777558531, ""lat"": 40.5334501609123, ""attributes"": {""_cm93_relation20_raw"": 2276}}]" +693,2277,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606523, ""source_record_index"": 2023, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.4824321559628, ""lat"": 40.58365441116841, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 2277}}, {""feature_id"": 606724, ""source_record_index"": 2224, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.4824321559628, ""lat"": 40.58365441116841, ""attributes"": {""_cm93_relation20_raw"": 2277}}]" +693,2278,2,"{""LIGHTS"": 1, ""_extgn"": 1}",True,True,"[""_extgn""]",0.0,True,"[{""feature_id"": 606520, ""source_record_index"": 2020, ""object_class"": ""LIGHTS"", ""native_scale"": 20000, ""lon"": 141.54953623727556, ""lat"": 40.549818066898325, ""attributes"": {""COLOUR"": [6], ""STATUS"": [8], ""_cm93_relation20_raw"": 2278}}, {""feature_id"": 606734, ""source_record_index"": 2234, ""object_class"": ""_extgn"", ""native_scale"": 20000, ""lon"": 141.54953623727556, ""lat"": 40.549818066898325, ""attributes"": {""_cm93_relation20_raw"": 2278}}]" diff --git a/cm95_nav_name_candidate_audit_v1.py b/cm95_nav_name_candidate_audit_v1.py new file mode 100644 index 0000000..9ec78b8 --- /dev/null +++ b/cm95_nav_name_candidate_audit_v1.py @@ -0,0 +1,546 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 / CM93 助航名称候选审计 v1 + +目的 +==== +为 CM95→NavSea `navigation_marks.chart_label_text` 找到可审计的 CM95 自有名称来源, +不使用 NEWPEC/reference PBF 名称反灌。 + +默认检查第一测试 AOI: + z10/914/385 + lon 141.328125 .. 141.6796875 + lat 40.44694705960049 .. 40.71395582628604 +默认重点比例尺: + 1:200000 + +候选来源: +1. 助航组件自身 OBJNAM / NOBJNM; +2. 同 cell、同 native_scale 的 `_texto._texta.text`; +3. 同 native_scale、邻近 cell 的 `_texto._texta.text`,仅作为低置信参考。 + +关联原则: +- 助航组件仍然用 `(cell_id, _cm93_relation20_raw)` 合成; +- 本脚本只审计名称,不改变 relation20 合成规则; +- 不自动把最近文字当名称; +- 输出距离和来源,由下一步确定安全规则。 + +输出: + cm95_nav_name_candidates_v1.json + cm95_nav_name_candidates_v1.csv + cm95_nav_name_candidates_v1.txt + +执行: + python .\tools\cm95_nav_name_candidate_audit_v1.py ` + --host 127.0.0.1 ` + --port 3306 ` + --user root ` + --database cm93_chart ` + --dataset-id 1 ` + --native-scale 200000 +""" + +from __future__ import annotations + +import argparse +import csv +import getpass +import json +import math +from collections import defaultdict +from datetime import datetime +from pathlib import Path +from typing import Any + +import pymysql +from pymysql.cursors import DictCursor + + +NAV_CLASSES = { + "LIGHTS", + "BCNLAT", + "BCNSPP", + "BOYSPP", + "RTPBCN", + "TOWERS", + "_extgn", + "SISTAT", + "SISTAW", +} + +DIRECT_NAME_KEYS = ( + "OBJNAM", + "NOBJNM", +) + +DEFAULT_BBOX = ( + 141.328125, + 40.44694705960049, + 141.6796875, + 40.71395582628604, +) + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument("--host", default="127.0.0.1") + p.add_argument("--port", type=int, default=3306) + p.add_argument("--user", default="root") + p.add_argument("--password", default=None) + p.add_argument("--database", default="cm93_chart") + p.add_argument("--dataset-id", type=int, default=1) + p.add_argument("--native-scale", type=int, default=200000) + p.add_argument("--min-lon", type=float, default=DEFAULT_BBOX[0]) + p.add_argument("--min-lat", type=float, default=DEFAULT_BBOX[1]) + p.add_argument("--max-lon", type=float, default=DEFAULT_BBOX[2]) + p.add_argument("--max-lat", type=float, default=DEFAULT_BBOX[3]) + p.add_argument( + "--radius-m", + type=float, + default=800.0, + help="每个助航对象保存的文字候选搜索半径", + ) + p.add_argument( + "--candidate-limit", + type=int, + default=12, + ) + p.add_argument("--output-dir", default=".") + return p.parse_args() + + +def json_dict(value: Any) -> dict[str, Any]: + if value is None: + return {} + if isinstance(value, dict): + return value + if isinstance(value, (bytes, bytearray, memoryview)): + value = bytes(value).decode("utf-8", "replace") + try: + obj = json.loads(value) + except Exception: + return {} + return obj if isinstance(obj, dict) else {} + + +def relation20(attrs: dict[str, Any]): + value = attrs.get("_cm93_relation20_raw") + if value is None: + return None + try: + return int(value) + except Exception: + return str(value) + + +def texta(attrs: dict[str, Any]): + value = attrs.get("_texta") + if not isinstance(value, dict): + return None, None + text = value.get("text") + prefix = value.get("prefix") + if text is None: + return None, prefix + text = str(text).strip() + return (text or None), prefix + + +def direct_names(attrs: dict[str, Any]): + out = [] + for key in DIRECT_NAME_KEYS: + value = attrs.get(key) + if isinstance(value, str) and value.strip(): + out.append({ + "field": key, + "text": value.strip(), + }) + return out + + +def haversine_m(lon1, lat1, lon2, lat2): + r = 6371008.8 + p1 = math.radians(lat1) + p2 = math.radians(lat2) + dp = p2 - p1 + dl = math.radians(lon2 - lon1) + a = ( + math.sin(dp / 2) ** 2 + + math.cos(p1) * math.cos(p2) + * math.sin(dl / 2) ** 2 + ) + return 2 * r * math.asin(min(1.0, math.sqrt(a))) + + +def write_csv(path: Path, rows): + rows = list(rows) + fields = [ + "cell_id", + "source_relative_path", + "native_scale", + "relation20", + "lon", + "lat", + "component_classes", + "component_source_record_indices", + "direct_names", + "nearest_same_cell_text", + "nearest_same_cell_distance_m", + "nearest_any_cell_text", + "nearest_any_cell_distance_m", + "same_cell_candidate_count", + "all_candidate_count", + "candidate_summary", + ] + with path.open("w", encoding="utf-8-sig", newline="") as f: + w = csv.DictWriter(f, fieldnames=fields) + w.writeheader() + for row in rows: + out = dict(row) + for key in ( + "component_classes", + "component_source_record_indices", + "direct_names", + "candidate_summary", + ): + out[key] = json.dumps( + out.get(key), + ensure_ascii=False, + separators=(",", ":"), + ) + w.writerow(out) + + +def main(): + a = parse_args() + if a.password is None: + a.password = getpass.getpass("MySQL password: ") + + outdir = Path(a.output_dir).resolve() + outdir.mkdir(parents=True, exist_ok=True) + + conn = pymysql.connect( + host=a.host, + port=a.port, + user=a.user, + password=a.password, + database=a.database, + charset="utf8mb4", + cursorclass=DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + ) + + nav_rows = [] + text_rows = [] + + try: + with conn.cursor() as cur: + try: + cur.execute("SET SESSION TRANSACTION READ ONLY") + except Exception: + pass + try: + cur.execute("START TRANSACTION READ ONLY") + except Exception: + cur.execute("START TRANSACTION") + + placeholders = ",".join(["%s"] * len(NAV_CLASSES)) + cur.execute( + f""" + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class, + f.native_scale, + f.bbox_min_lon AS lon, + f.bbox_min_lat AS lat, + f.attributes_json + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.native_scale=%s + AND f.geometry_type='POINT' + AND f.object_class IN ({placeholders}) + AND f.bbox_min_lon BETWEEN %s AND %s + AND f.bbox_min_lat BETWEEN %s AND %s + ORDER BY + f.cell_id, + f.source_record_index + """, + ( + a.dataset_id, + a.native_scale, + *sorted(NAV_CLASSES), + a.min_lon, + a.max_lon, + a.min_lat, + a.max_lat, + ), + ) + nav_rows = list(cur.fetchall()) + + # 扩大少量边界,避免 tile 边缘的文字候选被切掉。 + lat_pad = a.radius_m / 111320.0 + mid_lat = (a.min_lat + a.max_lat) / 2.0 + lon_pad = ( + a.radius_m + / max(1.0, 111320.0 * math.cos(math.radians(mid_lat))) + ) + + cur.execute( + """ + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.native_scale, + f.bbox_min_lon AS lon, + f.bbox_min_lat AS lat, + f.attributes_json + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.native_scale=%s + AND f.geometry_type='POINT' + AND f.object_class='_texto' + AND f.bbox_min_lon BETWEEN %s AND %s + AND f.bbox_min_lat BETWEEN %s AND %s + ORDER BY + f.cell_id, + f.source_record_index + """, + ( + a.dataset_id, + a.native_scale, + a.min_lon - lon_pad, + a.max_lon + lon_pad, + a.min_lat - lat_pad, + a.max_lat + lat_pad, + ), + ) + text_rows = list(cur.fetchall()) + + conn.rollback() + finally: + conn.close() + + for row in nav_rows: + row["attributes"] = json_dict(row.pop("attributes_json")) + row["relation20"] = relation20(row["attributes"]) + row["lon"] = float(row["lon"]) + row["lat"] = float(row["lat"]) + + parsed_text = [] + for row in text_rows: + attrs = json_dict(row.pop("attributes_json")) + text, prefix = texta(attrs) + if not text: + continue + parsed_text.append({ + "feature_id": int(row["feature_id"]), + "cell_id": int(row["cell_id"]), + "source_relative_path": str(row["source_relative_path"]), + "source_record_index": int(row["source_record_index"]), + "native_scale": int(row["native_scale"]), + "lon": float(row["lon"]), + "lat": float(row["lat"]), + "text": text, + "prefix": prefix, + }) + + groups = defaultdict(list) + standalone = [] + + for row in nav_rows: + rel = row["relation20"] + if rel is None: + standalone.append([row]) + else: + groups[(int(row["cell_id"]), rel)].append(row) + + nav_groups = list(groups.values()) + standalone + + results = [] + + for members in nav_groups: + # relation20 组成员已由上一步证明同址; + # standalone 则只有一条。 + lon = sum(m["lon"] for m in members) / len(members) + lat = sum(m["lat"] for m in members) / len(members) + cell_id = int(members[0]["cell_id"]) + source_path = str(members[0]["source_relative_path"]) + rel = members[0]["relation20"] + + strong_names = [] + for m in members: + for n in direct_names(m["attributes"]): + strong_names.append({ + "object_class": m["object_class"], + "source_record_index": m["source_record_index"], + **n, + }) + + candidates = [] + for t in parsed_text: + distance = haversine_m( + lon, + lat, + t["lon"], + t["lat"], + ) + if distance > a.radius_m: + continue + candidates.append({ + **t, + "same_cell": t["cell_id"] == cell_id, + "distance_m": round(distance, 2), + }) + + candidates.sort( + key=lambda c: ( + not c["same_cell"], + c["distance_m"], + c["text"], + ) + ) + + same_cell = [ + c for c in candidates if c["same_cell"] + ] + + nearest_same = same_cell[0] if same_cell else None + nearest_any = ( + min(candidates, key=lambda c: c["distance_m"]) + if candidates + else None + ) + + results.append({ + "cell_id": cell_id, + "source_relative_path": source_path, + "native_scale": a.native_scale, + "relation20": rel, + "lon": lon, + "lat": lat, + "component_classes": [ + m["object_class"] for m in members + ], + "component_source_record_indices": [ + int(m["source_record_index"]) for m in members + ], + "direct_names": strong_names, + "nearest_same_cell_text": ( + nearest_same["text"] if nearest_same else None + ), + "nearest_same_cell_distance_m": ( + nearest_same["distance_m"] if nearest_same else None + ), + "nearest_any_cell_text": ( + nearest_any["text"] if nearest_any else None + ), + "nearest_any_cell_distance_m": ( + nearest_any["distance_m"] if nearest_any else None + ), + "same_cell_candidate_count": len(same_cell), + "all_candidate_count": len(candidates), + "candidate_summary": candidates[: a.candidate_limit], + }) + + results.sort( + key=lambda r: ( + r["cell_id"], + -1 if r["relation20"] is None else r["relation20"], + r["lon"], + r["lat"], + ) + ) + + direct_named = sum( + 1 for r in results if r["direct_names"] + ) + same_100 = sum( + 1 + for r in results + if r["nearest_same_cell_distance_m"] is not None + and r["nearest_same_cell_distance_m"] <= 100.0 + ) + same_250 = sum( + 1 + for r in results + if r["nearest_same_cell_distance_m"] is not None + and r["nearest_same_cell_distance_m"] <= 250.0 + ) + + report = { + "schema": "navsea.cm95.nav-name-candidate-audit/v1", + "generated_at": datetime.now().isoformat(timespec="seconds"), + "dataset_id": a.dataset_id, + "native_scale": a.native_scale, + "aoi_bbox": [ + a.min_lon, + a.min_lat, + a.max_lon, + a.max_lat, + ], + "search_radius_m": a.radius_m, + "counts": { + "nav_component_rows": len(nav_rows), + "nav_groups": len(results), + "texto_rows_with_text": len(parsed_text), + "groups_with_direct_OBJNAM_or_NOBJNM": direct_named, + "groups_with_same_cell_text_within_100m": same_100, + "groups_with_same_cell_text_within_250m": same_250, + }, + "groups": results, + "decision": ( + "DATA_READY_FOR_NAME_ASSOCIATION_REVIEW" + if results + else "NO_NAV_GROUPS" + ), + } + + json_path = outdir / "cm95_nav_name_candidates_v1.json" + csv_path = outdir / "cm95_nav_name_candidates_v1.csv" + txt_path = outdir / "cm95_nav_name_candidates_v1.txt" + + json_path.write_text( + json.dumps( + report, + ensure_ascii=False, + indent=2, + default=str, + ), + encoding="utf-8", + ) + write_csv(csv_path, results) + + lines = [ + "CM95 / CM93 助航名称候选审计 v1", + "=" * 76, + f"Native scale : {a.native_scale}", + f"Nav component rows : {len(nav_rows)}", + f"Nav groups : {len(results)}", + f"_texto rows with text : {len(parsed_text)}", + f"Groups with direct OBJNAM/NOBJNM : {direct_named}", + f"Same-cell text <=100m : {same_100}", + f"Same-cell text <=250m : {same_250}", + "", + "注意:最近文字只是候选,不代表自动确定为助航名称。", + "下一步由映射审计决定哪些关系可安全写入 chart_label_text。", + ] + txt_path.write_text("\n".join(lines), encoding="utf-8") + + print("\n".join(lines)) + print("") + print(json_path) + print(csv_path) + print(txt_path) + + +if __name__ == "__main__": + main() diff --git a/cm95_nav_name_candidates_v1.csv b/cm95_nav_name_candidates_v1.csv new file mode 100644 index 0000000..6c5158a --- /dev/null +++ b/cm95_nav_name_candidates_v1.csv @@ -0,0 +1,18 @@ +cell_id,source_relative_path,native_scale,relation20,lon,lat,component_classes,component_source_record_indices,direct_names,nearest_same_cell_text,nearest_same_cell_distance_m,nearest_any_cell_text,nearest_any_cell_distance_m,same_cell_candidate_count,all_candidate_count,candidate_summary +40,03900420\C\03900420.C,200000,,141.65804316559033,40.467367860055134,"[""LIGHTS""]",[4877],[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6486,141.53481130881366,40.56513638820441,"[""TOWERS"",""LIGHTS""]","[4300,4741]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6501,141.43965605140164,40.68046315791786,"[""TOWERS"",""LIGHTS""]","[4325,4781]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6510,141.6269147619469,40.49949414054503,"[""TOWERS"",""LIGHTS""]","[4291,4747]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6521,141.5676487228532,40.541909757522724,"[""TOWERS"",""LIGHTS""]","[4246,4842]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6528,141.67305804264188,40.454613089799984,"[""TOWERS"",""LIGHTS""]","[4304,4777]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6548,141.53481130881366,40.56201499793302,"[""TOWERS"",""LIGHTS""]","[4364,4830]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6558,141.51424214797476,40.55215044794532,"[""TOWERS"",""LIGHTS""]","[4259,4598]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6567,141.5765599913472,40.53922443934611,"[""TOWERS"",""LIGHTS""]","[4274,4619]",[],Same Kado,528.84,Same Kado,528.84,1,1,"[{""feature_id"":361674,""cell_id"":40,""source_relative_path"":""03900420\\C\\03900420.C"",""source_record_index"":6002,""native_scale"":200000,""lon"":141.58071044516635,""lat"":40.54278402393275,""text"":""Same Kado"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":528.84}]" +40,03900420\C\03900420.C,200000,6602,141.52785319505807,40.55864373294613,"[""BCNLAT"",""LIGHTS""]","[4439,4737]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6620,141.3592715266989,40.68775404209214,"[""BCNSPP"",""LIGHTS""]","[4540,4584]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6632,141.54707956201432,40.53735089780069,"[""BCNLAT"",""LIGHTS""]","[4422,4714]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6640,141.6516343766049,40.472369069669675,"[""BCNLAT"",""LIGHTS""]","[4460,4646]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6657,141.5203457565323,40.53735089780069,"[""BCNLAT"",""LIGHTS""]","[4492,4673]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6663,141.53426198404347,40.53797541747083,"[""BCNSPP"",""LIGHTS""]","[4538,4784]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6691,141.55232866537378,40.533978390984394,"[""BCNLAT"",""LIGHTS""]","[4500,4670]",[],,,,,0,0,[] +40,03900420\C\03900420.C,200000,6720,141.47084549113066,40.54653075073066,"[""BCNSPP"",""LIGHTS""]","[4539,4839]",[],,,,,0,0,[] diff --git a/cm95_nav_name_candidates_v1.json b/cm95_nav_name_candidates_v1.json new file mode 100644 index 0000000..c908a53 --- /dev/null +++ b/cm95_nav_name_candidates_v1.json @@ -0,0 +1,448 @@ +{ + "schema": "navsea.cm95.nav-name-candidate-audit/v1", + "generated_at": "2026-09-03T11:04:47", + "dataset_id": 1, + "native_scale": 200000, + "aoi_bbox": [ + 141.328125, + 40.44694705960049, + 141.6796875, + 40.71395582628604 + ], + "search_radius_m": 800.0, + "counts": { + "nav_component_rows": 33, + "nav_groups": 17, + "texto_rows_with_text": 16, + "groups_with_direct_OBJNAM_or_NOBJNM": 0, + "groups_with_same_cell_text_within_100m": 0, + "groups_with_same_cell_text_within_250m": 0 + }, + "groups": [ + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": null, + "lon": 141.65804316559033, + "lat": 40.467367860055134, + "component_classes": [ + "LIGHTS" + ], + "component_source_record_indices": [ + 4877 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6486, + "lon": 141.53481130881366, + "lat": 40.56513638820441, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4300, + 4741 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6501, + "lon": 141.43965605140164, + "lat": 40.68046315791786, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4325, + 4781 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6510, + "lon": 141.6269147619469, + "lat": 40.49949414054503, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4291, + 4747 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6521, + "lon": 141.5676487228532, + "lat": 40.541909757522724, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4246, + 4842 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6528, + "lon": 141.67305804264188, + "lat": 40.454613089799984, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4304, + 4777 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6548, + "lon": 141.53481130881366, + "lat": 40.56201499793302, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4364, + 4830 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6558, + "lon": 141.51424214797476, + "lat": 40.55215044794532, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4259, + 4598 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6567, + "lon": 141.5765599913472, + "lat": 40.53922443934611, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4274, + 4619 + ], + "direct_names": [], + "nearest_same_cell_text": "Same Kado", + "nearest_same_cell_distance_m": 528.84, + "nearest_any_cell_text": "Same Kado", + "nearest_any_cell_distance_m": 528.84, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 361674, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "source_record_index": 6002, + "native_scale": 200000, + "lon": 141.58071044516635, + "lat": 40.54278402393275, + "text": "Same Kado", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 528.84 + } + ] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6602, + "lon": 141.52785319505807, + "lat": 40.55864373294613, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 4439, + 4737 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6620, + "lon": 141.3592715266989, + "lat": 40.68775404209214, + "component_classes": [ + "BCNSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 4540, + 4584 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6632, + "lon": 141.54707956201432, + "lat": 40.53735089780069, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 4422, + 4714 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6640, + "lon": 141.6516343766049, + "lat": 40.472369069669675, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 4460, + 4646 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6657, + "lon": 141.5203457565323, + "lat": 40.53735089780069, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 4492, + 4673 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6663, + "lon": 141.53426198404347, + "lat": 40.53797541747083, + "component_classes": [ + "BCNSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 4538, + 4784 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6691, + "lon": 141.55232866537378, + "lat": 40.533978390984394, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 4500, + 4670 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "native_scale": 200000, + "relation20": 6720, + "lon": 141.47084549113066, + "lat": 40.54653075073066, + "component_classes": [ + "BCNSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 4539, + 4839 + ], + "direct_names": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "nearest_any_cell_text": null, + "nearest_any_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + } + ], + "decision": "DATA_READY_FOR_NAME_ASSOCIATION_REVIEW" +} \ No newline at end of file diff --git a/cm95_nav_name_candidates_v1.txt b/cm95_nav_name_candidates_v1.txt new file mode 100644 index 0000000..b9d33a7 --- /dev/null +++ b/cm95_nav_name_candidates_v1.txt @@ -0,0 +1,12 @@ +CM95 / CM93 助航名称候选审计 v1 +============================================================================ +Native scale : 200000 +Nav component rows : 33 +Nav groups : 17 +_texto rows with text : 16 +Groups with direct OBJNAM/NOBJNM : 0 +Same-cell text <=100m : 0 +Same-cell text <=250m : 0 + +注意:最近文字只是候选,不代表自动确定为助航名称。 +下一步由映射审计决定哪些关系可安全写入 chart_label_text。 \ No newline at end of file diff --git a/cm95_nav_name_multiscale_audit_v2.json b/cm95_nav_name_multiscale_audit_v2.json new file mode 100644 index 0000000..592fb04 --- /dev/null +++ b/cm95_nav_name_multiscale_audit_v2.json @@ -0,0 +1,10329 @@ +{ + "schema": "navsea.cm95.nav-name-multiscale-audit/v2", + "generated_at": "2026-09-03T11:24:07", + "dataset_id": 1, + "scales": [ + 20000, + 50000, + 200000 + ], + "aoi_bbox": [ + 141.328125, + 40.44694705960049, + 141.6796875, + 40.71395582628604 + ], + "search_radius_m": 800.0, + "counts": { + "nav_component_rows": 227, + "nav_groups": 136, + "texto_rows": 110, + "texto_rows_with_text": 110 + }, + "per_scale": { + "20000": { + "nav_groups": 62, + "groups_with_direct_names": 7, + "groups_with_explicit_text_candidates": 0, + "groups_with_same_cell_text_within_50m": 0, + "groups_with_same_cell_text_within_100m": 0, + "groups_with_same_cell_text_within_250m": 15 + }, + "50000": { + "nav_groups": 57, + "groups_with_direct_names": 0, + "groups_with_explicit_text_candidates": 0, + "groups_with_same_cell_text_within_50m": 0, + "groups_with_same_cell_text_within_100m": 2, + "groups_with_same_cell_text_within_250m": 10 + }, + "200000": { + "nav_groups": 17, + "groups_with_direct_names": 0, + "groups_with_explicit_text_candidates": 0, + "groups_with_same_cell_text_within_50m": 0, + "groups_with_same_cell_text_within_100m": 0, + "groups_with_same_cell_text_within_250m": 0 + } + }, + "text_relation_field_counts": [], + "groups": [ + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.487254006117, + "lat": 40.55602869111419, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1959 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kitanuma", + "nearest_same_cell_distance_m": 730.41, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606700, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2200, + "native_scale": 20000, + "lon": 141.4815623918527, + "lat": 40.56097339975906, + "text": "Kitanuma", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 730.41, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.487370991933, + "lat": 40.55682149529551, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1960 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kitanuma", + "nearest_same_cell_distance_m": 673.74, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606700, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2200, + "native_scale": 20000, + "lon": 141.4815623918527, + "lat": 40.56097339975906, + "text": "Kitanuma", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 673.74, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.48809833852798, + "lat": 40.556491161360874, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1958 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kitanuma", + "nearest_same_cell_distance_m": 743.83, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606700, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2200, + "native_scale": 20000, + "lon": 141.4815623918527, + "lat": 40.56097339975906, + "text": "Kitanuma", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 743.83, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.48819497898467, + "lat": 40.55577458522323, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1961 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Hamana-Yachi", + "nearest_same_cell_distance_m": 765.61, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606692, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2192, + "native_scale": 20000, + "lon": 141.4941968599783, + "lat": 40.550616027137096, + "text": "Hamana-Yachi", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 765.61, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.49735547700973, + "lat": 40.52981512984462, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1970 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Toyama-Shinden", + "nearest_same_cell_distance_m": 517.72, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 606712, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2212, + "native_scale": 20000, + "lon": 141.50044288528355, + "lat": 40.53383653024312, + "text": "Toyama-Shinden", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 517.72, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606702, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2202, + "native_scale": 20000, + "lon": 141.49126712823906, + "lat": 40.529042342579885, + "text": "Numadate", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 521.69, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606652, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2152, + "native_scale": 20000, + "lon": 141.5038354739469, + "lat": 40.5271713470344, + "text": "Area 3 Koyo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 621.58, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.5000054600586, + "lat": 40.535127801051665, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1966 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Toyama-Shinden", + "nearest_same_cell_distance_m": 148.27, + "same_cell_candidate_count": 4, + "all_candidate_count": 4, + "candidate_summary": [ + { + "feature_id": 606712, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2212, + "native_scale": 20000, + "lon": 141.50044288528355, + "lat": 40.53383653024312, + "text": "Toyama-Shinden", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 148.27, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606683, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2183, + "native_scale": 20000, + "lon": 141.4964857128996, + "lat": 40.53749167722482, + "text": "Mabechi Kawa", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 396.94, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606710, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2210, + "native_scale": 20000, + "lon": 141.5023960397764, + "lat": 40.538406703674674, + "text": "Tate", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 416.83, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606699, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2199, + "native_scale": 20000, + "lon": 141.50835214371162, + "lat": 40.53415680839427, + "text": "Kawaragi", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 713.59, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.5003564175065, + "lat": 40.53742559149734, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1964 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Tate", + "nearest_same_cell_distance_m": 203.98, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 606710, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2210, + "native_scale": 20000, + "lon": 141.5023960397764, + "lat": 40.538406703674674, + "text": "Tate", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 203.98, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606683, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2183, + "native_scale": 20000, + "lon": 141.4964857128996, + "lat": 40.53749167722482, + "text": "Mabechi Kawa", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 327.18, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606712, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2212, + "native_scale": 20000, + "lon": 141.50044288528355, + "lat": 40.53383653024312, + "text": "Toyama-Shinden", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 399.15, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606695, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2195, + "native_scale": 20000, + "lon": 141.49386116154983, + "lat": 40.54159903142414, + "text": "Hattaro", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 718.76, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606699, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2199, + "native_scale": 20000, + "lon": 141.50835214371162, + "lat": 40.53415680839427, + "text": "Kawaragi", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 767.26, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.51061556493377, + "lat": 40.53027778111349, + "component_classes": [ + "BCNSPP" + ], + "component_source_record_indices": [ + 1980 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi", + "nearest_same_cell_distance_m": 471.84, + "same_cell_candidate_count": 4, + "all_candidate_count": 4, + "candidate_summary": [ + { + "feature_id": 606699, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2199, + "native_scale": 20000, + "lon": 141.50835214371162, + "lat": 40.53415680839427, + "text": "Kawaragi", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 471.84, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606653, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2153, + "native_scale": 20000, + "lon": 141.51512206201883, + "lat": 40.52610363595054, + "text": "Area 4 Koyo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 600.42, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 618.09, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606652, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2152, + "native_scale": 20000, + "lon": 141.5038354739469, + "lat": 40.5271713470344, + "text": "Area 3 Koyo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 669.09, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.5108444502259, + "lat": 40.531909745248655, + "component_classes": [ + "BCNSPP" + ], + "component_source_record_indices": [ + 1979 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi", + "nearest_same_cell_distance_m": 326.8, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 606699, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2199, + "native_scale": 20000, + "lon": 141.50835214371162, + "lat": 40.53415680839427, + "text": "Kawaragi", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 326.8, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 568.37, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606653, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2153, + "native_scale": 20000, + "lon": 141.51512206201883, + "lat": 40.52610363595054, + "text": "Area 4 Koyo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 739.94, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606663, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2163, + "native_scale": 20000, + "lon": 141.51672934540358, + "lat": 40.53728325278595, + "text": "Service Co., Inc.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 777.4, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606652, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2152, + "native_scale": 20000, + "lon": 141.5038354739469, + "lat": 40.5271713470344, + "text": "Area 3 Koyo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 792.79, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.5214392960816, + "lat": 40.52781196552014, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1962 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Tate Hana", + "nearest_same_cell_distance_m": 111.99, + "same_cell_candidate_count": 9, + "all_candidate_count": 9, + "candidate_summary": [ + { + "feature_id": 606665, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2165, + "native_scale": 20000, + "lon": 141.52014736576604, + "lat": 40.52803567212025, + "text": "Tate Hana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 111.99, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606711, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2211, + "native_scale": 20000, + "lon": 141.5229906297283, + "lat": 40.52654597546327, + "text": "Tatehana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 192.38, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606674, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2174, + "native_scale": 20000, + "lon": 141.51944036453034, + "lat": 40.52694255323407, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 194.65, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606669, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2169, + "native_scale": 20000, + "lon": 141.51948105524897, + "lat": 40.52654597546327, + "text": "(Konakano)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 217.28, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606685, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2185, + "native_scale": 20000, + "lon": 141.52122058346913, + "lat": 40.52476643093591, + "text": "Niida Kawa", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 339.15, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606708, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2208, + "native_scale": 20000, + "lon": 141.5273089322398, + "lat": 40.52658665021444, + "text": "Shinminato", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 514.47, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606714, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2214, + "native_scale": 20000, + "lon": 141.525121806115, + "lat": 40.52382579545554, + "text": "Uenoyama", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 541.61, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606653, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2153, + "native_scale": 20000, + "lon": 141.51512206201883, + "lat": 40.52610363595054, + "text": "Area 4 Koyo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 566.71, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 569.22, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.5214392960816, + "lat": 40.52813227246671, + "component_classes": [ + "SISTAT" + ], + "component_source_record_indices": [ + 2046 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Tate Hana", + "nearest_same_cell_distance_m": 109.72, + "same_cell_candidate_count": 9, + "all_candidate_count": 9, + "candidate_summary": [ + { + "feature_id": 606665, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2165, + "native_scale": 20000, + "lon": 141.52014736576604, + "lat": 40.52803567212025, + "text": "Tate Hana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 109.72, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606674, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2174, + "native_scale": 20000, + "lon": 141.51944036453034, + "lat": 40.52694255323407, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 214.58, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606711, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2211, + "native_scale": 20000, + "lon": 141.5229906297283, + "lat": 40.52654597546327, + "text": "Tatehana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 219.78, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606669, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2169, + "native_scale": 20000, + "lon": 141.51948105524897, + "lat": 40.52654597546327, + "text": "(Konakano)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 241.88, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606685, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2185, + "native_scale": 20000, + "lon": 141.52122058346913, + "lat": 40.52476643093591, + "text": "Niida Kawa", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 374.72, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606708, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2208, + "native_scale": 20000, + "lon": 141.5273089322398, + "lat": 40.52658665021444, + "text": "Shinminato", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 525.02, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 540.46, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606714, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2214, + "native_scale": 20000, + "lon": 141.525121806115, + "lat": 40.52382579545554, + "text": "Uenoyama", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 571.12, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606653, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2153, + "native_scale": 20000, + "lon": 141.51512206201883, + "lat": 40.52610363595054, + "text": "Area 4 Koyo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 579.62, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.52367219926484, + "lat": 40.52990155944516, + "component_classes": [ + "SISTAT" + ], + "component_source_record_indices": [ + 2047 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Tate Hana", + "nearest_same_cell_distance_m": 363.04, + "same_cell_candidate_count": 10, + "all_candidate_count": 10, + "candidate_summary": [ + { + "feature_id": 606665, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2165, + "native_scale": 20000, + "lon": 141.52014736576604, + "lat": 40.52803567212025, + "text": "Tate Hana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 363.04, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606711, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2211, + "native_scale": 20000, + "lon": 141.5229906297283, + "lat": 40.52654597546327, + "text": "Tatehana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 377.54, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606708, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2208, + "native_scale": 20000, + "lon": 141.5273089322398, + "lat": 40.52658665021444, + "text": "Shinminato", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 479.94, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606674, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2174, + "native_scale": 20000, + "lon": 141.51944036453034, + "lat": 40.52694255323407, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 485.99, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606669, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2169, + "native_scale": 20000, + "lon": 141.51948105524897, + "lat": 40.52654597546327, + "text": "(Konakano)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 514.49, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 566.22, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606685, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2185, + "native_scale": 20000, + "lon": 141.52122058346913, + "lat": 40.52476643093591, + "text": "Niida Kawa", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 607.44, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606714, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2214, + "native_scale": 20000, + "lon": 141.525121806115, + "lat": 40.52382579545554, + "text": "Uenoyama", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 686.61, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606673, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2173, + "native_scale": 20000, + "lon": 141.5319018971019, + "lat": 40.52964735441949, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 696.11, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606670, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2170, + "native_scale": 20000, + "lon": 141.53193241514083, + "lat": 40.529362643645946, + "text": "(Tatehana)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 700.69, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.54550785613407, + "lat": 40.549177658809995, + "component_classes": [ + "LIGHTS" + ], + "component_source_record_indices": [ + 2027 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.55333573312492, + "lat": 40.526886625741874, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1967 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Sunamori", + "nearest_same_cell_distance_m": 163.04, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 606709, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2209, + "native_scale": 20000, + "lon": 141.55269485430696, + "lat": 40.525503676544034, + "text": "Sunamori", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 163.04, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606654, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2154, + "native_scale": 20000, + "lon": 141.54897165355496, + "lat": 40.52447661492469, + "text": "Area 5 Shirogane", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 455.93, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606651, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2151, + "native_scale": 20000, + "lon": 141.54794421291032, + "lat": 40.52869661907635, + "text": "Area 2 Chikkogai", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 498.15, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 639.35, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 655.78, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.55378333102954, + "lat": 40.527262864335846, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1968 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Sunamori", + "nearest_same_cell_distance_m": 216.17, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 606709, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2209, + "native_scale": 20000, + "lon": 141.55269485430696, + "lat": 40.525503676544034, + "text": "Sunamori", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 216.17, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606654, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2154, + "native_scale": 20000, + "lon": 141.54897165355496, + "lat": 40.52447661492469, + "text": "Area 5 Shirogane", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 511.25, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606651, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2151, + "native_scale": 20000, + "lon": 141.54794421291032, + "lat": 40.52869661907635, + "text": "Area 2 Chikkogai", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 518.62, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 587.75, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 614.98, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.553798590049, + "lat": 40.526698505652824, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1963 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Sunamori", + "nearest_same_cell_distance_m": 162.34, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 606709, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2209, + "native_scale": 20000, + "lon": 141.55269485430696, + "lat": 40.525503676544034, + "text": "Sunamori", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 162.34, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606654, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2154, + "native_scale": 20000, + "lon": 141.54897165355496, + "lat": 40.52447661492469, + "text": "Area 5 Shirogane", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 476.96, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606651, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2151, + "native_scale": 20000, + "lon": 141.54794421291032, + "lat": 40.52869661907635, + "text": "Area 2 Chikkogai", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 542.4, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 647.61, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 677.71, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.55411902945798, + "lat": 40.52698322774454, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1972 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Sunamori", + "nearest_same_cell_distance_m": 203.85, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 606709, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2209, + "native_scale": 20000, + "lon": 141.55269485430696, + "lat": 40.525503676544034, + "text": "Sunamori", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 203.85, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606654, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2154, + "native_scale": 20000, + "lon": 141.54897165355496, + "lat": 40.52447661492469, + "text": "Area 5 Shirogane", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 516.69, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606651, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2151, + "native_scale": 20000, + "lon": 141.54794421291032, + "lat": 40.52869661907635, + "text": "Area 2 Chikkogai", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 555.57, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 610.12, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 648.21, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.55427670599258, + "lat": 40.53193516493641, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1971 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Hachinohe Fishing Harbour (Same)", + "nearest_same_cell_distance_m": 122.06, + "same_cell_candidate_count": 6, + "all_candidate_count": 6, + "candidate_summary": [ + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 122.06, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 138.85, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606698, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2198, + "native_scale": 20000, + "lon": 141.55856449046513, + "lat": 40.53529047907352, + "text": "Kami-Same", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 520.1, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606651, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2151, + "native_scale": 20000, + "lon": 141.54794421291032, + "lat": 40.52869661907635, + "text": "Area 2 Chikkogai", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 645.07, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606655, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2155, + "native_scale": 20000, + "lon": 141.55846276366864, + "lat": 40.53757809692398, + "text": "Kabu Island Marine Park", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 720.32, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606709, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2209, + "native_scale": 20000, + "lon": 141.55269485430696, + "lat": 40.525503676544034, + "text": "Sunamori", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 727.54, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.5546683541591, + "lat": 40.532753673727576, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1969 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Hachinohe Fishing Harbour (Same)", + "nearest_same_cell_distance_m": 110.53, + "same_cell_candidate_count": 6, + "all_candidate_count": 6, + "candidate_summary": [ + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 110.53, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 110.81, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606698, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2198, + "native_scale": 20000, + "lon": 141.55856449046513, + "lat": 40.53529047907352, + "text": "Kami-Same", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 433.57, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606655, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2155, + "native_scale": 20000, + "lon": 141.55846276366864, + "lat": 40.53757809692398, + "text": "Kabu Island Marine Park", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 624.98, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606651, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2151, + "native_scale": 20000, + "lon": 141.54794421291032, + "lat": 40.52869661907635, + "text": "Area 2 Chikkogai", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 725.58, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606656, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2156, + "native_scale": 20000, + "lon": 141.55759299955852, + "lat": 40.5390929653105, + "text": "Kabu Shima", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 746.97, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.55547708219132, + "lat": 40.535127801051665, + "component_classes": [ + "SISTAW" + ], + "component_source_record_indices": [ + 2048 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kami-Same", + "nearest_same_cell_distance_m": 261.54, + "same_cell_candidate_count": 6, + "all_candidate_count": 6, + "candidate_summary": [ + { + "feature_id": 606698, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2198, + "native_scale": 20000, + "lon": 141.55856449046513, + "lat": 40.53529047907352, + "text": "Kami-Same", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 261.54, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 314.7, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 316.05, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606655, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2155, + "native_scale": 20000, + "lon": 141.55846276366864, + "lat": 40.53757809692398, + "text": "Kabu Island Marine Park", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 371.34, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606656, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2156, + "native_scale": 20000, + "lon": 141.55759299955852, + "lat": 40.5390929653105, + "text": "Kabu Shima", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 475.79, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606705, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2205, + "native_scale": 20000, + "lon": 141.56257761258715, + "lat": 40.537257835127086, + "text": "Shimo-Matsunaeba", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 645.1, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.55552285924972, + "lat": 40.53378060850419, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 1965 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Hinode", + "nearest_same_cell_distance_m": 165.6, + "same_cell_candidate_count": 6, + "all_candidate_count": 6, + "candidate_summary": [ + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 165.6, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 213.66, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606698, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2198, + "native_scale": 20000, + "lon": 141.55856449046513, + "lat": 40.53529047907352, + "text": "Kami-Same", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 307.02, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606655, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2155, + "native_scale": 20000, + "lon": 141.55846276366864, + "lat": 40.53757809692398, + "text": "Kabu Island Marine Park", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 489.93, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606656, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2156, + "native_scale": 20000, + "lon": 141.55759299955852, + "lat": 40.5390929653105, + "text": "Kabu Shima", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 616.07, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606705, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2205, + "native_scale": 20000, + "lon": 141.56257761258715, + "lat": 40.537257835127086, + "text": "Shimo-Matsunaeba", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 710.59, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": null, + "lon": 141.57670746462134, + "lat": 40.53993171998525, + "component_classes": [ + "BCNSPP" + ], + "component_source_record_indices": [ + 1981 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Same Kado", + "nearest_same_cell_distance_m": 178.61, + "same_cell_candidate_count": 9, + "all_candidate_count": 9, + "candidate_summary": [ + { + "feature_id": 606661, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2161, + "native_scale": 20000, + "lon": 141.5748967276436, + "lat": 40.54076029762526, + "text": "Same Kado", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 178.61, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606667, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2167, + "native_scale": 20000, + "lon": 141.5763209027946, + "lat": 40.543855935677584, + "text": "Todo Shima", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 437.57, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606687, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2187, + "native_scale": 20000, + "lon": 141.5735793656289, + "lat": 40.54424224499966, + "text": "Okitonda", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 547.36, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606688, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2188, + "native_scale": 20000, + "lon": 141.58198199901997, + "lat": 40.543093476529926, + "text": "Saku Ne", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 567.67, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606704, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2204, + "native_scale": 20000, + "lon": 141.5761581399202, + "lat": 40.53474143916679, + "text": "Senzogakubo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 579.0, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606680, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2180, + "native_scale": 20000, + "lon": 141.58295348992658, + "lat": 40.54273765929082, + "text": "Kankitsu", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 613.12, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606690, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2190, + "native_scale": 20000, + "lon": 141.58495242147782, + "lat": 40.53972330313749, + "text": "Yahazukomone", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 697.11, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606677, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2177, + "native_scale": 20000, + "lon": 141.58476422690433, + "lat": 40.53782210488448, + "text": "Hon-Karimata", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 720.11, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606706, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2206, + "native_scale": 20000, + "lon": 141.56734859934312, + "lat": 40.53952505236351, + "text": "Shimo-Mekurakubo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 792.15, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2239, + "lon": 141.51452696025927, + "lat": 40.55241521469589, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 1954, + 1999 + ], + "direct_names": [], + "nav_relation_fields": { + "1954": { + "_cm93_relation20_raw": 2239 + }, + "1999": { + "_cm93_relation20_raw": 2239 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2240, + "lon": 141.56767921143177, + "lat": 40.54238692330532, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 1953, + 2011 + ], + "direct_names": [], + "nav_relation_fields": { + "1953": { + "_cm93_relation20_raw": 2240 + }, + "2011": { + "_cm93_relation20_raw": 2240 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "O Saki", + "nearest_same_cell_distance_m": 166.43, + "same_cell_candidate_count": 10, + "all_candidate_count": 10, + "candidate_summary": [ + { + "feature_id": 606659, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2159, + "native_scale": 20000, + "lon": 141.56571079791942, + "lat": 40.54243775472137, + "text": "O Saki", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 166.43, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606672, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2172, + "native_scale": 20000, + "lon": 141.5649122425669, + "lat": 40.541878607023406, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 240.54, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606668, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2168, + "native_scale": 20000, + "lon": 141.5648969835474, + "lat": 40.54151261691194, + "text": "(Ebisuhama)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 254.41, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606706, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2206, + "native_scale": 20000, + "lon": 141.56734859934312, + "lat": 40.53952505236351, + "text": "Shimo-Mekurakubo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 319.45, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606666, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2166, + "native_scale": 20000, + "lon": 141.56636184941704, + "lat": 40.546072100989115, + "text": "Hinode Iwa", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 424.62, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606687, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2187, + "native_scale": 20000, + "lon": 141.5735793656289, + "lat": 40.54424224499966, + "text": "Okitonda", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 539.55, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606686, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2186, + "native_scale": 20000, + "lon": 141.56839129900726, + "lat": 40.547607108287096, + "text": "Ogomune", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 583.57, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606661, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2161, + "native_scale": 20000, + "lon": 141.5748967276436, + "lat": 40.54076029762526, + "text": "Same Kado", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 636.14, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606705, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2205, + "native_scale": 20000, + "lon": 141.56257761258715, + "lat": 40.537257835127086, + "text": "Shimo-Matsunaeba", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 714.93, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606667, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2167, + "native_scale": 20000, + "lon": 141.5763209027946, + "lat": 40.543855935677584, + "text": "Todo Shima", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 748.26, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2241, + "lon": 141.5759546863272, + "lat": 40.53986563666468, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 1955, + 2001 + ], + "direct_names": [], + "nav_relation_fields": { + "1955": { + "_cm93_relation20_raw": 2241 + }, + "2001": { + "_cm93_relation20_raw": 2241 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Same Kado", + "nearest_same_cell_distance_m": 133.75, + "same_cell_candidate_count": 9, + "all_candidate_count": 9, + "candidate_summary": [ + { + "feature_id": 606661, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2161, + "native_scale": 20000, + "lon": 141.5748967276436, + "lat": 40.54076029762526, + "text": "Same Kado", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 133.75, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606667, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2167, + "native_scale": 20000, + "lon": 141.5763209027946, + "lat": 40.543855935677584, + "text": "Todo Shima", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 444.78, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606687, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2187, + "native_scale": 20000, + "lon": 141.5735793656289, + "lat": 40.54424224499966, + "text": "Okitonda", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 526.42, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606704, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2204, + "native_scale": 20000, + "lon": 141.5761581399202, + "lat": 40.53474143916679, + "text": "Senzogakubo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 570.04, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606688, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2188, + "native_scale": 20000, + "lon": 141.58198199901997, + "lat": 40.543093476529926, + "text": "Saku Ne", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 623.08, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606680, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2180, + "native_scale": 20000, + "lon": 141.58295348992658, + "lat": 40.54273765929082, + "text": "Kankitsu", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 672.12, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606706, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2206, + "native_scale": 20000, + "lon": 141.56734859934312, + "lat": 40.53952505236351, + "text": "Shimo-Mekurakubo", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 728.23, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606690, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2190, + "native_scale": 20000, + "lon": 141.58495242147782, + "lat": 40.53972330313749, + "text": "Yahazukomone", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 760.5, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606677, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2177, + "native_scale": 20000, + "lon": 141.58476422690433, + "lat": 40.53782210488448, + "text": "Hon-Karimata", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 778.35, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2242, + "lon": 141.5350198234147, + "lat": 40.56587201094555, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 1956, + 2007 + ], + "direct_names": [], + "nav_relation_fields": { + "1956": { + "_cm93_relation20_raw": 2242 + }, + "2007": { + "_cm93_relation20_raw": 2242 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2243, + "lon": 141.54813240748382, + "lat": 40.53939288485493, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 1952, + 2009 + ], + "direct_names": [], + "nav_relation_fields": { + "1952": { + "_cm93_relation20_raw": 2243 + }, + "2009": { + "_cm93_relation20_raw": 2243 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Ko Ne", + "nearest_same_cell_distance_m": 682.88, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606682, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2182, + "native_scale": 20000, + "lon": 141.5536409135144, + "lat": 40.54388643386297, + "text": "Ko Ne", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 682.88, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2244, + "lon": 141.55521767886023, + "lat": 40.536297040550764, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 1957, + 2008 + ], + "direct_names": [], + "nav_relation_fields": { + "1957": { + "_cm93_relation20_raw": 2244 + }, + "2008": { + "_cm93_relation20_raw": 2244 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kami-Same", + "nearest_same_cell_distance_m": 304.17, + "same_cell_candidate_count": 6, + "all_candidate_count": 6, + "candidate_summary": [ + { + "feature_id": 606698, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2198, + "native_scale": 20000, + "lon": 141.55856449046513, + "lat": 40.53529047907352, + "text": "Kami-Same", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 304.17, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606655, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2155, + "native_scale": 20000, + "lon": 141.55846276366864, + "lat": 40.53757809692398, + "text": "Kabu Island Marine Park", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 309.02, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606656, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2156, + "native_scale": 20000, + "lon": 141.55759299955852, + "lat": 40.5390929653105, + "text": "Kabu Shima", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 370.06, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 420.94, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 446.33, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606705, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2205, + "native_scale": 20000, + "lon": 141.56257761258715, + "lat": 40.537257835127086, + "text": "Shimo-Matsunaeba", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 631.08, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2245, + "lon": 141.54756782376322, + "lat": 40.54819670438723, + "component_classes": [ + "BOYSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 1987, + 2032 + ], + "direct_names": [], + "nav_relation_fields": { + "1987": { + "_cm93_relation20_raw": 2245 + }, + "2032": { + "_cm93_relation20_raw": 2245 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Ko Ne", + "nearest_same_cell_distance_m": 702.16, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606682, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2182, + "native_scale": 20000, + "lon": 141.5536409135144, + "lat": 40.54388643386297, + "text": "Ko Ne", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 702.16, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2246, + "lon": 141.51764488657207, + "lat": 40.545787460007524, + "component_classes": [ + "BOYSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 1984, + 2028 + ], + "direct_names": [], + "nav_relation_fields": { + "1984": { + "_cm93_relation20_raw": 2246 + }, + "2028": { + "_cm93_relation20_raw": 2246 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2247, + "lon": 141.55372738129145, + "lat": 40.53761368147356, + "component_classes": [ + "BOYSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 1985, + 2031 + ], + "direct_names": [], + "nav_relation_fields": { + "1985": { + "_cm93_relation20_raw": 2247 + }, + "2031": { + "_cm93_relation20_raw": 2247 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kabu Shima", + "nearest_same_cell_distance_m": 365.74, + "same_cell_candidate_count": 7, + "all_candidate_count": 7, + "candidate_summary": [ + { + "feature_id": 606656, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2156, + "native_scale": 20000, + "lon": 141.55759299955852, + "lat": 40.5390929653105, + "text": "Kabu Shima", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 365.74, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606655, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2155, + "native_scale": 20000, + "lon": 141.55846276366864, + "lat": 40.53757809692398, + "text": "Kabu Island Marine Park", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 400.19, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606698, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2198, + "native_scale": 20000, + "lon": 141.55856449046513, + "lat": 40.53529047907352, + "text": "Kami-Same", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 483.56, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 537.91, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 616.11, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606682, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2182, + "native_scale": 20000, + "lon": 141.5536409135144, + "lat": 40.54388643386297, + "text": "Ko Ne", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 697.54, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606705, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2205, + "native_scale": 20000, + "lon": 141.56257761258715, + "lat": 40.537257835127086, + "text": "Shimo-Matsunaeba", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 748.95, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2248, + "lon": 141.51602234416788, + "lat": 40.54453705850963, + "component_classes": [ + "BOYSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 1982, + 2026 + ], + "direct_names": [], + "nav_relation_fields": { + "1982": { + "_cm93_relation20_raw": 2248 + }, + "2026": { + "_cm93_relation20_raw": 2248 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Toyosu", + "nearest_same_cell_distance_m": 681.35, + "same_cell_candidate_count": 2, + "all_candidate_count": 2, + "candidate_summary": [ + { + "feature_id": 606713, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2213, + "native_scale": 20000, + "lon": 141.51138360224738, + "lat": 40.53952505236351, + "text": "Toyosu", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 681.35, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606660, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2160, + "native_scale": 20000, + "lon": 141.51662761860706, + "lat": 40.5377102680129, + "text": "Pier for Tohoku Port", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 760.83, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2249, + "lon": 141.5144252334628, + "lat": 40.54336796282291, + "component_classes": [ + "BOYSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 1983, + 2030 + ], + "direct_names": [], + "nav_relation_fields": { + "1983": { + "_cm93_relation20_raw": 2249 + }, + "2030": { + "_cm93_relation20_raw": 2249 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Toyosu", + "nearest_same_cell_distance_m": 498.65, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 606713, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2213, + "native_scale": 20000, + "lon": 141.51138360224738, + "lat": 40.53952505236351, + "text": "Toyosu", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 498.65, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606660, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2160, + "native_scale": 20000, + "lon": 141.51662761860706, + "lat": 40.5377102680129, + "text": "Pier for Tohoku Port", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 656.06, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606663, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2163, + "native_scale": 20000, + "lon": 141.51672934540358, + "lat": 40.53728325278595, + "text": "Service Co., Inc.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 704.05, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2250, + "lon": 141.54760851448182, + "lat": 40.55077866754792, + "component_classes": [ + "BOYSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 1986, + 2025 + ], + "direct_names": [], + "nav_relation_fields": { + "1986": { + "_cm93_relation20_raw": 2250 + }, + "2025": { + "_cm93_relation20_raw": 2250 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2251, + "lon": 141.5279752427569, + "lat": 40.55872215426594, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 1974, + 2006 + ], + "direct_names": [], + "nav_relation_fields": { + "1974": { + "_cm93_relation20_raw": 2251 + }, + "2006": { + "_cm93_relation20_raw": 2251 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2252, + "lon": 141.47915655311542, + "lat": 40.58768781797142, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2017, + 2218 + ], + "direct_names": [], + "nav_relation_fields": { + "2017": { + "_cm93_relation20_raw": 2252 + }, + "2218": { + "_cm93_relation20_raw": 2252 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Ichikawa Basin", + "nearest_same_cell_distance_m": 334.87, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606678, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2178, + "native_scale": 20000, + "lon": 141.47547404308204, + "lat": 40.586570273697056, + "text": "Ichikawa Basin", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 334.87, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2253, + "lon": 141.50487817361105, + "lat": 40.55268966278586, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2019, + 2236 + ], + "direct_names": [], + "nav_relation_fields": { + "2019": { + "_cm93_relation20_raw": 2253 + }, + "2236": { + "_cm93_relation20_raw": 2253 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2254, + "lon": 141.55245070999536, + "lat": 40.53446183378157, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 1977, + 2002 + ], + "direct_names": [], + "nav_relation_fields": { + "1977": { + "_cm93_relation20_raw": 2254 + }, + "2002": { + "_cm93_relation20_raw": 2254 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Hachinohe Fishing Harbour (Same)", + "nearest_same_cell_distance_m": 201.79, + "same_cell_candidate_count": 6, + "all_candidate_count": 6, + "candidate_summary": [ + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 201.79, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606697, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2197, + "native_scale": 20000, + "lon": 141.55584329865871, + "lat": 40.532311375187646, + "text": "Hinode", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 373.34, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606698, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2198, + "native_scale": 20000, + "lon": 141.55856449046513, + "lat": 40.53529047907352, + "text": "Kami-Same", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 524.82, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606655, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2155, + "native_scale": 20000, + "lon": 141.55846276366864, + "lat": 40.53757809692398, + "text": "Kabu Island Marine Park", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 614.98, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606656, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2156, + "native_scale": 20000, + "lon": 141.55759299955852, + "lat": 40.5390929653105, + "text": "Kabu Shima", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 673.81, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606651, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2151, + "native_scale": 20000, + "lon": 141.54794421291032, + "lat": 40.52869661907635, + "text": "Area 2 Chikkogai", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 745.67, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2255, + "lon": 141.53411954126562, + "lat": 40.53822878284375, + "component_classes": [ + "BCNSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 1978, + 2010 + ], + "direct_names": [], + "nav_relation_fields": { + "1978": { + "_cm93_relation20_raw": 2255 + }, + "2010": { + "_cm93_relation20_raw": 2255 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi No 1 Wharf [Port Island]", + "nearest_same_cell_distance_m": 634.57, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 634.57, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2256, + "lon": 141.54682521814877, + "lat": 40.5377458524923, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 1973, + 2005 + ], + "direct_names": [], + "nav_relation_fields": { + "1973": { + "_cm93_relation20_raw": 2256 + }, + "2005": { + "_cm93_relation20_raw": 2256 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Hachinohe Fishing Harbour (Same)", + "nearest_same_cell_distance_m": 780.69, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606671, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2171, + "native_scale": 20000, + "lon": 141.55336116482405, + "lat": 40.53278417696755, + "text": "Hachinohe Fishing Harbour (Same)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 780.69, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2257, + "lon": 141.47109979083245, + "lat": 40.546926016675656, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2029, + 2227 + ], + "direct_names": [], + "nav_relation_fields": { + "2029": { + "_cm93_relation20_raw": 2257 + }, + "2227": { + "_cm93_relation20_raw": 2257 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2258, + "lon": 141.52570164885506, + "lat": 40.53382127886439, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 1998, + 2229 + ], + "direct_names": [ + { + "object_class": "LIGHTS", + "source_record_index": 1998, + "field": "OBJNAM", + "text": "L2" + } + ], + "nav_relation_fields": { + "1998": { + "_cm93_relation20_raw": 2258 + }, + "2229": { + "_cm93_relation20_raw": 2258 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi No 1 Wharf [Port Island]", + "nearest_same_cell_distance_m": 438.58, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 438.58, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606673, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2173, + "native_scale": 20000, + "lon": 141.5319018971019, + "lat": 40.52964735441949, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 699.99, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 716.51, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606670, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2170, + "native_scale": 20000, + "lon": 141.53193241514083, + "lat": 40.529362643645946, + "text": "(Tatehana)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 723.25, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606665, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2165, + "native_scale": 20000, + "lon": 141.52014736576604, + "lat": 40.52803567212025, + "text": "Tate Hana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 796.38, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2259, + "lon": 141.49831170889684, + "lat": 40.55619131837828, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2033, + 2237 + ], + "direct_names": [], + "nav_relation_fields": { + "2033": { + "_cm93_relation20_raw": 2259 + }, + "2237": { + "_cm93_relation20_raw": 2259 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Hamana-Yachi", + "nearest_same_cell_distance_m": 710.77, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606692, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2192, + "native_scale": 20000, + "lon": 141.4941968599783, + "lat": 40.550616027137096, + "text": "Hamana-Yachi", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 710.77, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2260, + "lon": 141.5075434156794, + "lat": 40.549081088805, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2015, + 2220 + ], + "direct_names": [], + "nav_relation_fields": { + "2015": { + "_cm93_relation20_raw": 2260 + }, + "2220": { + "_cm93_relation20_raw": 2260 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2261, + "lon": 141.52826516412694, + "lat": 40.54623983528677, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2024, + 2233 + ], + "direct_names": [], + "nav_relation_fields": { + "2024": { + "_cm93_relation20_raw": 2261 + }, + "2233": { + "_cm93_relation20_raw": 2261 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2262, + "lon": 141.51800601669967, + "lat": 40.54032821853955, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2016, + 2216 + ], + "direct_names": [], + "nav_relation_fields": { + "2016": { + "_cm93_relation20_raw": 2262 + }, + "2216": { + "_cm93_relation20_raw": 2262 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Pier for Tohoku Port", + "nearest_same_cell_distance_m": 313.54, + "same_cell_candidate_count": 4, + "all_candidate_count": 4, + "candidate_summary": [ + { + "feature_id": 606660, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2160, + "native_scale": 20000, + "lon": 141.51662761860706, + "lat": 40.5377102680129, + "text": "Pier for Tohoku Port", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 313.54, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606663, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2163, + "native_scale": 20000, + "lon": 141.51672934540358, + "lat": 40.53728325278595, + "text": "Service Co., Inc.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 355.36, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606713, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2213, + "native_scale": 20000, + "lon": 141.51138360224738, + "lat": 40.53952505236351, + "text": "Toyosu", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 566.7, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 786.16, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2263, + "lon": 141.52535069140714, + "lat": 40.53333831674283, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 1995, + 2228 + ], + "direct_names": [ + { + "object_class": "LIGHTS", + "source_record_index": 1995, + "field": "OBJNAM", + "text": "R1" + } + ], + "nav_relation_fields": { + "1995": { + "_cm93_relation20_raw": 2263 + }, + "2228": { + "_cm93_relation20_raw": 2263 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi No 1 Wharf [Port Island]", + "nearest_same_cell_distance_m": 497.15, + "same_cell_candidate_count": 7, + "all_candidate_count": 7, + "candidate_summary": [ + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 497.15, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 674.28, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606673, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2173, + "native_scale": 20000, + "lon": 141.5319018971019, + "lat": 40.52964735441949, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 689.19, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606670, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2170, + "native_scale": 20000, + "lon": 141.53193241514083, + "lat": 40.529362643645946, + "text": "(Tatehana)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 710.52, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606665, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2165, + "native_scale": 20000, + "lon": 141.52014736576604, + "lat": 40.52803567212025, + "text": "Tate Hana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 735.56, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606708, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2208, + "native_scale": 20000, + "lon": 141.5273089322398, + "lat": 40.52658665021444, + "text": "Shinminato", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 768.78, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606711, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2211, + "native_scale": 20000, + "lon": 141.5229906297283, + "lat": 40.52654597546327, + "text": "Tatehana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 781.17, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2264, + "lon": 141.56030401868534, + "lat": 40.544648883984316, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2018, + 2217 + ], + "direct_names": [], + "nav_relation_fields": { + "2018": { + "_cm93_relation20_raw": 2264 + }, + "2217": { + "_cm93_relation20_raw": 2264 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Hachinohe Fishing Harbour", + "nearest_same_cell_distance_m": 496.5, + "same_cell_candidate_count": 7, + "all_candidate_count": 7, + "candidate_summary": [ + { + "feature_id": 606672, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2172, + "native_scale": 20000, + "lon": 141.5649122425669, + "lat": 40.541878607023406, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 496.5, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606659, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2159, + "native_scale": 20000, + "lon": 141.56571079791942, + "lat": 40.54243775472137, + "text": "O Saki", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 518.82, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606668, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2168, + "native_scale": 20000, + "lon": 141.5648969835474, + "lat": 40.54151261691194, + "text": "(Ebisuhama)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 521.77, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606666, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2166, + "native_scale": 20000, + "lon": 141.56636184941704, + "lat": 40.546072100989115, + "text": "Hinode Iwa", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 535.77, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606682, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2182, + "native_scale": 20000, + "lon": 141.5536409135144, + "lat": 40.54388643386297, + "text": "Ko Ne", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 569.36, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606656, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2156, + "native_scale": 20000, + "lon": 141.55759299955852, + "lat": 40.5390929653105, + "text": "Kabu Shima", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 658.9, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606686, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2186, + "native_scale": 20000, + "lon": 141.56839129900726, + "lat": 40.547607108287096, + "text": "Ogomune", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 758.39, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2265, + "lon": 141.52588984342862, + "lat": 40.53368910010344, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 1997, + 2235 + ], + "direct_names": [ + { + "object_class": "LIGHTS", + "source_record_index": 1997, + "field": "OBJNAM", + "text": "L1" + } + ], + "nav_relation_fields": { + "1997": { + "_cm93_relation20_raw": 2265 + }, + "2235": { + "_cm93_relation20_raw": 2265 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi No 1 Wharf [Port Island]", + "nearest_same_cell_distance_m": 450.52, + "same_cell_candidate_count": 6, + "all_candidate_count": 6, + "candidate_summary": [ + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 450.52, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606673, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2173, + "native_scale": 20000, + "lon": 141.5319018971019, + "lat": 40.52964735441949, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 678.34, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606670, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2170, + "native_scale": 20000, + "lon": 141.53193241514083, + "lat": 40.529362643645946, + "text": "(Tatehana)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 701.59, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 727.86, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606665, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2165, + "native_scale": 20000, + "lon": 141.52014736576604, + "lat": 40.52803567212025, + "text": "Tate Hana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 794.18, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606708, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2208, + "native_scale": 20000, + "lon": 141.5273089322398, + "lat": 40.52658665021444, + "text": "Shinminato", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 798.81, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2266, + "lon": 141.52561518107802, + "lat": 40.53350099910942, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 1993, + 2226 + ], + "direct_names": [ + { + "object_class": "LIGHTS", + "source_record_index": 1993, + "field": "OBJNAM", + "text": "C1" + } + ], + "nav_relation_fields": { + "1993": { + "_cm93_relation20_raw": 2266 + }, + "2226": { + "_cm93_relation20_raw": 2266 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi No 1 Wharf [Port Island]", + "nearest_same_cell_distance_m": 474.92, + "same_cell_candidate_count": 6, + "all_candidate_count": 6, + "candidate_summary": [ + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 474.92, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606673, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2173, + "native_scale": 20000, + "lon": 141.5319018971019, + "lat": 40.52964735441949, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 682.58, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 700.18, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606670, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2170, + "native_scale": 20000, + "lon": 141.53193241514083, + "lat": 40.529362643645946, + "text": "(Tatehana)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 704.84, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606665, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2165, + "native_scale": 20000, + "lon": 141.52014736576604, + "lat": 40.52803567212025, + "text": "Tate Hana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 763.46, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606708, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2208, + "native_scale": 20000, + "lon": 141.5273089322398, + "lat": 40.52658665021444, + "text": "Shinminato", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 782.05, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2267, + "lon": 141.52294485266987, + "lat": 40.53044047091052, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2000, + 2230 + ], + "direct_names": [ + { + "object_class": "LIGHTS", + "source_record_index": 2000, + "field": "OBJNAM", + "text": "C1" + } + ], + "nav_relation_fields": { + "2000": { + "_cm93_relation20_raw": 2267 + }, + "2230": { + "_cm93_relation20_raw": 2267 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Tate Hana", + "nearest_same_cell_distance_m": 356.94, + "same_cell_candidate_count": 10, + "all_candidate_count": 10, + "candidate_summary": [ + { + "feature_id": 606665, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2165, + "native_scale": 20000, + "lon": 141.52014736576604, + "lat": 40.52803567212025, + "text": "Tate Hana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 356.94, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606711, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2211, + "native_scale": 20000, + "lon": 141.5229906297283, + "lat": 40.52654597546327, + "text": "Tatehana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 433.07, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 486.39, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606674, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2174, + "native_scale": 20000, + "lon": 141.51944036453034, + "lat": 40.52694255323407, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 488.89, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606669, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2169, + "native_scale": 20000, + "lon": 141.51948105524897, + "lat": 40.52654597546327, + "text": "(Konakano)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 522.72, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606708, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2208, + "native_scale": 20000, + "lon": 141.5273089322398, + "lat": 40.52658665021444, + "text": "Shinminato", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 565.4, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606685, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2185, + "native_scale": 20000, + "lon": 141.52122058346913, + "lat": 40.52476643093591, + "text": "Niida Kawa", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 647.54, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606714, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2214, + "native_scale": 20000, + "lon": 141.525121806115, + "lat": 40.52382579545554, + "text": "Uenoyama", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 758.18, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606673, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2173, + "native_scale": 20000, + "lon": 141.5319018971019, + "lat": 40.52964735441949, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 762.13, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606670, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2170, + "native_scale": 20000, + "lon": 141.53193241514083, + "lat": 40.529362643645946, + "text": "(Tatehana)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 768.99, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2268, + "lon": 141.52094592111857, + "lat": 40.55528669920913, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2021, + 2232 + ], + "direct_names": [], + "nav_relation_fields": { + "2021": { + "_cm93_relation20_raw": 2268 + }, + "2232": { + "_cm93_relation20_raw": 2268 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2269, + "lon": 141.50160257076368, + "lat": 40.552715074589145, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2022, + 2222 + ], + "direct_names": [], + "nav_relation_fields": { + "2022": { + "_cm93_relation20_raw": 2269 + }, + "2222": { + "_cm93_relation20_raw": 2269 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Hamana-Yachi", + "nearest_same_cell_distance_m": 667.81, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606692, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2192, + "native_scale": 20000, + "lon": 141.4941968599783, + "lat": 40.550616027137096, + "text": "Hamana-Yachi", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 667.81, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2270, + "lon": 141.5254269865045, + "lat": 40.53363317824145, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 1994, + 2219 + ], + "direct_names": [ + { + "object_class": "LIGHTS", + "source_record_index": 1994, + "field": "OBJNAM", + "text": "C2" + } + ], + "nav_relation_fields": { + "1994": { + "_cm93_relation20_raw": 2270 + }, + "2219": { + "_cm93_relation20_raw": 2270 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi No 1 Wharf [Port Island]", + "nearest_same_cell_distance_m": 463.74, + "same_cell_candidate_count": 6, + "all_candidate_count": 6, + "candidate_summary": [ + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 463.74, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 688.47, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606673, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2173, + "native_scale": 20000, + "lon": 141.5319018971019, + "lat": 40.52964735441949, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 704.19, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606670, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2170, + "native_scale": 20000, + "lon": 141.53193241514083, + "lat": 40.529362643645946, + "text": "(Tatehana)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 726.48, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606665, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2165, + "native_scale": 20000, + "lon": 141.52014736576604, + "lat": 40.52803567212025, + "text": "Tate Hana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 765.83, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606708, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2208, + "native_scale": 20000, + "lon": 141.5273089322398, + "lat": 40.52658665021444, + "text": "Shinminato", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 799.52, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2271, + "lon": 141.53291407872706, + "lat": 40.54241742215959, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2013, + 2231 + ], + "direct_names": [], + "nav_relation_fields": { + "2013": { + "_cm93_relation20_raw": 2271 + }, + "2231": { + "_cm93_relation20_raw": 2271 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi No 1 Wharf [Port Island]", + "nearest_same_cell_distance_m": 745.65, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 745.65, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2272, + "lon": 141.52043728713608, + "lat": 40.53762384848427, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 1976, + 2003 + ], + "direct_names": [], + "nav_relation_fields": { + "1976": { + "_cm93_relation20_raw": 2272 + }, + "2003": { + "_cm93_relation20_raw": 2272 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Service Co., Inc.", + "nearest_same_cell_distance_m": 315.62, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 606663, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2163, + "native_scale": 20000, + "lon": 141.51672934540358, + "lat": 40.53728325278595, + "text": "Service Co., Inc.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 315.62, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606660, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2160, + "native_scale": 20000, + "lon": 141.51662761860706, + "lat": 40.5377102680129, + "text": "Pier for Tohoku Port", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 322.08, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 524.46, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 670.56, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606713, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2213, + "native_scale": 20000, + "lon": 141.51138360224738, + "lat": 40.53952505236351, + "text": "Toyosu", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 793.75, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2273, + "lon": 141.53323451813606, + "lat": 40.53630720776126, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 1975, + 2004 + ], + "direct_names": [], + "nav_relation_fields": { + "1975": { + "_cm93_relation20_raw": 2273 + }, + "2004": { + "_cm93_relation20_raw": 2273 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi No 1 Wharf [Port Island]", + "nearest_same_cell_distance_m": 578.19, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 578.19, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606673, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2173, + "native_scale": 20000, + "lon": 141.5319018971019, + "lat": 40.52964735441949, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 749.06, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606670, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2170, + "native_scale": 20000, + "lon": 141.53193241514083, + "lat": 40.529362643645946, + "text": "(Tatehana)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 780.0, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2274, + "lon": 141.52411979716945, + "lat": 40.545101266953736, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2014, + 2223 + ], + "direct_names": [], + "nav_relation_fields": { + "2014": { + "_cm93_relation20_raw": 2274 + }, + "2223": { + "_cm93_relation20_raw": 2274 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2275, + "lon": 141.53280217925092, + "lat": 40.535966605369474, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2012, + 2221 + ], + "direct_names": [], + "nav_relation_fields": { + "2012": { + "_cm93_relation20_raw": 2275 + }, + "2221": { + "_cm93_relation20_raw": 2275 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi No 1 Wharf [Port Island]", + "nearest_same_cell_distance_m": 555.07, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 555.07, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606673, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2173, + "native_scale": 20000, + "lon": 141.5319018971019, + "lat": 40.52964735441949, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 706.78, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606670, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2170, + "native_scale": 20000, + "lon": 141.53193241514083, + "lat": 40.529362643645946, + "text": "(Tatehana)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 738.0, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2276, + "lon": 141.5251777558531, + "lat": 40.5334501609123, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 1996, + 2225 + ], + "direct_names": [ + { + "object_class": "LIGHTS", + "source_record_index": 1996, + "field": "OBJNAM", + "text": "R2" + } + ], + "nav_relation_fields": { + "1996": { + "_cm93_relation20_raw": 2276 + }, + "2225": { + "_cm93_relation20_raw": 2276 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Kawaragi No 1 Wharf [Port Island]", + "nearest_same_cell_distance_m": 488.52, + "same_cell_candidate_count": 7, + "all_candidate_count": 7, + "candidate_summary": [ + { + "feature_id": 606657, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2157, + "native_scale": 20000, + "lon": 141.52664262172271, + "lat": 40.53770010101532, + "text": "Kawaragi No 1 Wharf [Port Island]", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 488.52, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606715, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2215, + "native_scale": 20000, + "lon": 141.5175685914747, + "lat": 40.53200125607943, + "text": "Uheikawara", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 662.94, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606673, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2173, + "native_scale": 20000, + "lon": 141.5319018971019, + "lat": 40.52964735441949, + "text": "Hachinohe Fishing Harbour", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 708.34, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606670, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2170, + "native_scale": 20000, + "lon": 141.53193241514083, + "lat": 40.529362643645946, + "text": "(Tatehana)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 729.7, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606665, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2165, + "native_scale": 20000, + "lon": 141.52014736576604, + "lat": 40.52803567212025, + "text": "Tate Hana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 737.04, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606708, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2208, + "native_scale": 20000, + "lon": 141.5273089322398, + "lat": 40.52658665021444, + "text": "Shinminato", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 784.16, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 606711, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2211, + "native_scale": 20000, + "lon": 141.5229906297283, + "lat": 40.52654597546327, + "text": "Tatehana", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 789.65, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2277, + "lon": 141.4824321559628, + "lat": 40.58365441116841, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2023, + 2224 + ], + "direct_names": [], + "nav_relation_fields": { + "2023": { + "_cm93_relation20_raw": 2277 + }, + "2224": { + "_cm93_relation20_raw": 2277 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Ichikawa Basin", + "nearest_same_cell_distance_m": 671.1, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606678, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2178, + "native_scale": 20000, + "lon": 141.47547404308204, + "lat": 40.586570273697056, + "text": "Ichikawa Basin", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 671.1, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 20000, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "relation20": 2278, + "lon": 141.54953623727556, + "lat": 40.549818066898325, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 2020, + 2234 + ], + "direct_names": [], + "nav_relation_fields": { + "2020": { + "_cm93_relation20_raw": 2278 + }, + "2234": { + "_cm93_relation20_raw": 2278 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Ko Ne", + "nearest_same_cell_distance_m": 745.2, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 606682, + "cell_id": 693, + "source_relative_path": "03900420\\F\\03910424.F", + "source_record_index": 2182, + "native_scale": 20000, + "lon": 141.5536409135144, + "lat": 40.54388643386297, + "text": "Ko Ne", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 745.2, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.48717605911006, + "lat": 40.55602965032755, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 847 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "HACHINOHE", + "nearest_same_cell_distance_m": 533.7, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 513876, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 946, + "native_scale": 50000, + "lon": 141.48158617070516, + "lat": 40.558265740394994, + "text": "HACHINOHE", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 533.7, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513897, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 967, + "native_scale": 50000, + "lon": 141.48120469515436, + "lat": 40.55764065910144, + "text": "STEEL JETTY", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 535.33, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513875, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 945, + "native_scale": 50000, + "lon": 141.48103684591197, + "lat": 40.55301589260543, + "text": "H A C H I T A R O", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 617.51, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513885, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 955, + "native_scale": 50000, + "lon": 141.48523307697113, + "lat": 40.561558755232554, + "text": "MITSUBUSHI JETTY", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 636.34, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513889, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 959, + "native_scale": 50000, + "lon": 141.4954515353928, + "lat": 40.55533848010609, + "text": "No 1 WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 703.35, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.48734390835241, + "lat": 40.556837700583436, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 843 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "HACHINOHE", + "nearest_same_cell_distance_m": 511.68, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 513876, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 946, + "native_scale": 50000, + "lon": 141.48158617070516, + "lat": 40.558265740394994, + "text": "HACHINOHE", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 511.68, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513897, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 967, + "native_scale": 50000, + "lon": 141.48120469515436, + "lat": 40.55764065910144, + "text": "STEEL JETTY", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 526.28, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513885, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 955, + "native_scale": 50000, + "lon": 141.48523307697113, + "lat": 40.561558755232554, + "text": "MITSUBUSHI JETTY", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 554.42, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513875, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 945, + "native_scale": 50000, + "lon": 141.48103684591197, + "lat": 40.55301589260543, + "text": "H A C H I T A R O", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 681.56, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513889, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 959, + "native_scale": 50000, + "lon": 141.4954515353928, + "lat": 40.55533848010609, + "text": "No 1 WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 704.95, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.48806616872866, + "lat": 40.55652769503456, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 836 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "HACHINOHE", + "nearest_same_cell_distance_m": 580.55, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 513876, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 946, + "native_scale": 50000, + "lon": 141.48158617070516, + "lat": 40.558265740394994, + "text": "HACHINOHE", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 580.55, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513897, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 967, + "native_scale": 50000, + "lon": 141.48120469515436, + "lat": 40.55764065910144, + "text": "STEEL JETTY", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 592.73, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513885, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 955, + "native_scale": 50000, + "lon": 141.48523307697113, + "lat": 40.561558755232554, + "text": "MITSUBUSHI JETTY", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 608.48, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513889, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 959, + "native_scale": 50000, + "lon": 141.4954515353928, + "lat": 40.55533848010609, + "text": "No 1 WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 637.8, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513875, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 945, + "native_scale": 50000, + "lon": 141.48103684591197, + "lat": 40.55301589260543, + "text": "H A C H I T A R O", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 710.75, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.48813737749816, + "lat": 40.55581111933769, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 835 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "HACHINOHE", + "nearest_same_cell_distance_m": 617.1, + "same_cell_candidate_count": 5, + "all_candidate_count": 5, + "candidate_summary": [ + { + "feature_id": 513876, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 946, + "native_scale": 50000, + "lon": 141.48158617070516, + "lat": 40.558265740394994, + "text": "HACHINOHE", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 617.1, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513897, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 967, + "native_scale": 50000, + "lon": 141.48120469515436, + "lat": 40.55764065910144, + "text": "STEEL JETTY", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 620.01, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513889, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 959, + "native_scale": 50000, + "lon": 141.4954515353928, + "lat": 40.55533848010609, + "text": "No 1 WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 620.16, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513875, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 945, + "native_scale": 50000, + "lon": 141.48103684591197, + "lat": 40.55301589260543, + "text": "H A C H I T A R O", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 675.63, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513885, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 955, + "native_scale": 50000, + "lon": 141.48523307697113, + "lat": 40.561558755232554, + "text": "MITSUBUSHI JETTY", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 684.59, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.4973487404656, + "lat": 40.52984659582941, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 837 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "MABECHI KAWA", + "nearest_same_cell_distance_m": 724.41, + "same_cell_candidate_count": 2, + "all_candidate_count": 2, + "candidate_summary": [ + { + "feature_id": 513884, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 954, + "native_scale": 50000, + "lon": 141.49523790908432, + "lat": 40.536160743936016, + "text": "MABECHI KAWA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 724.41, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513880, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 950, + "native_scale": 50000, + "lon": 141.5020485192519, + "lat": 40.53586589358092, + "text": "K A W A R A G I", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 778.29, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.49998855127737, + "lat": 40.535169431555296, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 838 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "K A W A R A G I", + "nearest_same_cell_distance_m": 190.53, + "same_cell_candidate_count": 2, + "all_candidate_count": 2, + "candidate_summary": [ + { + "feature_id": 513880, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 950, + "native_scale": 50000, + "lon": 141.5020485192519, + "lat": 40.53586589358092, + "text": "K A W A R A G I", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 190.53, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513884, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 954, + "native_scale": 50000, + "lon": 141.49523790908432, + "lat": 40.536160743936016, + "text": "MABECHI KAWA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 416.33, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.5003496814655, + "lat": 40.5374977215057, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 840 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "K A W A R A G I", + "nearest_same_cell_distance_m": 231.38, + "same_cell_candidate_count": 2, + "all_candidate_count": 2, + "candidate_summary": [ + { + "feature_id": 513880, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 950, + "native_scale": 50000, + "lon": 141.5020485192519, + "lat": 40.53586589358092, + "text": "K A W A R A G I", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 231.38, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513884, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 954, + "native_scale": 50000, + "lon": 141.49523790908432, + "lat": 40.536160743936016, + "text": "MABECHI KAWA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 456.85, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.51056813988717, + "lat": 40.53031941496734, + "component_classes": [ + "BCNSPP" + ], + "component_source_record_indices": [ + 857 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TANKS", + "nearest_same_cell_distance_m": 620.33, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 620.33, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.510807197899, + "lat": 40.53193104223212, + "component_classes": [ + "BCNSPP" + ], + "component_source_record_indices": [ + 858 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TANKS", + "nearest_same_cell_distance_m": 580.3, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 580.3, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.52138678650883, + "lat": 40.52817899202388, + "component_classes": [ + "SISTAT" + ], + "component_source_record_indices": [ + 914 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TATE HANA", + "nearest_same_cell_distance_m": 164.96, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513899, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 969, + "native_scale": 50000, + "lon": 141.52025761887836, + "lat": 40.526968936454345, + "text": "TATE HANA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 164.96, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513888, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 958, + "native_scale": 50000, + "lon": 141.52083237537494, + "lat": 40.52605375386633, + "text": "NIIDA KAWA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 240.92, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 504.88, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.52366546713245, + "lat": 40.529897436757, + "component_classes": [ + "SISTAT" + ], + "component_source_record_indices": [ + 915 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TATE HANA", + "nearest_same_cell_distance_m": 434.74, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513899, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 969, + "native_scale": 50000, + "lon": 141.52025761887836, + "lat": 40.526968936454345, + "text": "TATE HANA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 434.74, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513888, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 958, + "native_scale": 50000, + "lon": 141.52083237537494, + "lat": 40.52605375386633, + "text": "NIIDA KAWA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 489.9, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 546.36, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.5467930581943, + "lat": 40.52788410654553, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 846 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "SHIROGANE WHARF", + "nearest_same_cell_distance_m": 102.45, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513895, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 965, + "native_scale": 50000, + "lon": 141.5459995890486, + "lat": 40.52858064429507, + "text": "SHIROGANE WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 102.45, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513877, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 947, + "native_scale": 50000, + "lon": 141.55060781370267, + "lat": 40.524482661283564, + "text": "HACHINOHE", + "prefix": [ + 16, + 12, + 0 + ], + "same_cell": true, + "distance_m": 497.0, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 508.83, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.54746445516378, + "lat": 40.527868853813075, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 844 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "SHIROGANE WHARF", + "nearest_same_cell_distance_m": 146.94, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513895, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 965, + "native_scale": 50000, + "lon": 141.5459995890486, + "lat": 40.52858064429507, + "text": "SHIROGANE WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 146.94, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513877, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 947, + "native_scale": 50000, + "lon": 141.55060781370267, + "lat": 40.524482661283564, + "text": "HACHINOHE", + "prefix": [ + 16, + 12, + 0 + ], + "same_cell": true, + "distance_m": 460.82, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 470.32, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.54755600929602, + "lat": 40.52753837709095, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 850 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "SHIROGANE WHARF", + "nearest_same_cell_distance_m": 175.32, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513895, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 965, + "native_scale": 50000, + "lon": 141.5459995890486, + "lat": 40.52858064429507, + "text": "SHIROGANE WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 175.32, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513877, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 947, + "native_scale": 50000, + "lon": 141.55060781370267, + "lat": 40.524482661283564, + "text": "HACHINOHE", + "prefix": [ + 16, + 12, + 0 + ], + "same_cell": true, + "distance_m": 426.6, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 493.43, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.5533900420534, + "lat": 40.526968936454345, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 845 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "HACHINOHE", + "nearest_same_cell_distance_m": 362.95, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513877, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 947, + "native_scale": 50000, + "lon": 141.55060781370267, + "lat": 40.524482661283564, + "text": "HACHINOHE", + "prefix": [ + 16, + 12, + 0 + ], + "same_cell": true, + "distance_m": 362.95, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 487.15, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513895, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 965, + "native_scale": 50000, + "lon": 141.5459995890486, + "lat": 40.52858064429507, + "text": "SHIROGANE WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 649.83, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.55384272637372, + "lat": 40.52673505764836, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 849 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "HACHINOHE", + "nearest_same_cell_distance_m": 370.79, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513877, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 947, + "native_scale": 50000, + "lon": 141.55060781370267, + "lat": 40.524482661283564, + "text": "HACHINOHE", + "prefix": [ + 16, + 12, + 0 + ], + "same_cell": true, + "distance_m": 370.79, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 526.44, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513895, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 965, + "native_scale": 50000, + "lon": 141.5459995890486, + "lat": 40.52858064429507, + "text": "SHIROGANE WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 693.93, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.55386815807714, + "lat": 40.527284163118864, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 851 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "HACHINOHE", + "nearest_same_cell_distance_m": 415.91, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513877, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 947, + "native_scale": 50000, + "lon": 141.55060781370267, + "lat": 40.524482661283564, + "text": "HACHINOHE", + "prefix": [ + 16, + 12, + 0 + ], + "same_cell": true, + "distance_m": 415.91, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 472.97, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513895, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 965, + "native_scale": 50000, + "lon": 141.5459995890486, + "lat": 40.52858064429507, + "text": "SHIROGANE WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 680.48, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.55415807949575, + "lat": 40.52702486387398, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 848 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "HACHINOHE", + "nearest_same_cell_distance_m": 412.25, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513877, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 947, + "native_scale": 50000, + "lon": 141.55060781370267, + "lat": 40.524482661283564, + "text": "HACHINOHE", + "prefix": [ + 16, + 12, + 0 + ], + "same_cell": true, + "distance_m": 412.25, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 510.09, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513895, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 965, + "native_scale": 50000, + "lon": 141.5459995890486, + "lat": 40.52858064429507, + "text": "SHIROGANE WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 710.91, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.55434627410082, + "lat": 40.5319869655108, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 841 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "SILOS", + "nearest_same_cell_distance_m": 288.35, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 288.35, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.55470740428896, + "lat": 40.53283089295858, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 839 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "SILOS", + "nearest_same_cell_distance_m": 359.82, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 359.82, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.55557208220415, + "lat": 40.533908664364674, + "component_classes": [ + "TOWERS" + ], + "component_source_record_indices": [ + 842 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "SILOS", + "nearest_same_cell_distance_m": 491.0, + "same_cell_candidate_count": 2, + "all_candidate_count": 2, + "candidate_summary": [ + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 491.0, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513882, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 952, + "native_scale": 50000, + "lon": 141.55808982083965, + "lat": 40.54033426236749, + "text": "KABU SH.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 745.5, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.57267744590357, + "lat": 40.5397649304665, + "component_classes": [ + "RTPBCN" + ], + "component_source_record_indices": [ + 913 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "SAME KADO", + "nearest_same_cell_distance_m": 92.49, + "same_cell_candidate_count": 4, + "all_candidate_count": 4, + "candidate_summary": [ + { + "feature_id": 513894, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 964, + "native_scale": 50000, + "lon": 141.5729622809815, + "lat": 40.540568093710775, + "text": "SAME KADO", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 92.49, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513886, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 956, + "native_scale": 50000, + "lon": 141.57202639429678, + "lat": 40.5385550841112, + "text": "MONOMIWA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 145.34, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513900, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 970, + "native_scale": 50000, + "lon": 141.57416265738146, + "lat": 40.5442127071797, + "text": "TODO SH.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 510.25, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513892, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 962, + "native_scale": 50000, + "lon": 141.5659329581648, + "lat": 40.54184906832527, + "text": "O SAKI", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 615.24, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": null, + "lon": 141.57687367696272, + "lat": 40.54005976366212, + "component_classes": [ + "BCNSPP" + ], + "component_source_record_indices": [ + 859 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": "SAME KADO", + "nearest_same_cell_distance_m": 335.32, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513894, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 964, + "native_scale": 50000, + "lon": 141.5729622809815, + "lat": 40.540568093710775, + "text": "SAME KADO", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 335.32, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513886, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 956, + "native_scale": 50000, + "lon": 141.57202639429678, + "lat": 40.5385550841112, + "text": "MONOMIWA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 442.47, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513900, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 970, + "native_scale": 50000, + "lon": 141.57416265738146, + "lat": 40.5442127071797, + "text": "TODO SH.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 515.49, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 992, + "lon": 141.51457109000057, + "lat": 40.552446668497204, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 831, + 864 + ], + "direct_names": [], + "nav_relation_fields": { + "831": { + "_cm93_relation20_raw": 992 + }, + "864": { + "_cm93_relation20_raw": 992 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 993, + "lon": 141.55525672908215, + "lat": 40.53632341943859, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 833, + 870 + ], + "direct_names": [], + "nav_relation_fields": { + "833": { + "_cm93_relation20_raw": 993 + }, + "870": { + "_cm93_relation20_raw": 993 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "KABU SH.", + "nearest_same_cell_distance_m": 506.18, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513882, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 952, + "native_scale": 50000, + "lon": 141.55808982083965, + "lat": 40.54033426236749, + "text": "KABU SH.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 506.18, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513887, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 957, + "native_scale": 50000, + "lon": 141.54777472194513, + "lat": 40.538041655314935, + "text": "N. BREAKWATER", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 660.51, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 683.26, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 994, + "lon": 141.54818162919935, + "lat": 40.53947009597325, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 830, + 871 + ], + "direct_names": [], + "nav_relation_fields": { + "830": { + "_cm93_relation20_raw": 994 + }, + "871": { + "_cm93_relation20_raw": 994 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "N. BREAKWATER", + "nearest_same_cell_distance_m": 162.51, + "same_cell_candidate_count": 2, + "all_candidate_count": 2, + "candidate_summary": [ + { + "feature_id": 513887, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 957, + "native_scale": 50000, + "lon": 141.54777472194513, + "lat": 40.538041655314935, + "text": "N. BREAKWATER", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 162.51, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513883, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 953, + "native_scale": 50000, + "lon": 141.55228630612632, + "lat": 40.54426862020725, + "text": "KO NE", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 636.4, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 995, + "lon": 141.53501309318457, + "lat": 40.562163473376586, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 834, + 873 + ], + "direct_names": [], + "nav_relation_fields": { + "834": { + "_cm93_relation20_raw": 995 + }, + "873": { + "_cm93_relation20_raw": 995 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 996, + "lon": 141.57615650292712, + "lat": 40.539856430562644, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 832, + 865 + ], + "direct_names": [], + "nav_relation_fields": { + "832": { + "_cm93_relation20_raw": 996 + }, + "865": { + "_cm93_relation20_raw": 996 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "SAME KADO", + "nearest_same_cell_distance_m": 281.28, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513894, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 964, + "native_scale": 50000, + "lon": 141.5729622809815, + "lat": 40.540568093710775, + "text": "SAME KADO", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 281.28, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513886, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 956, + "native_scale": 50000, + "lon": 141.57202639429678, + "lat": 40.5385550841112, + "text": "MONOMIWA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 377.82, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513900, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 970, + "native_scale": 50000, + "lon": 141.57416265738146, + "lat": 40.5442127071797, + "text": "TODO SH.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 512.86, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 997, + "lon": 141.5340263430931, + "lat": 40.538229743548484, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 828, + 872 + ], + "direct_names": [], + "nav_relation_fields": { + "828": { + "_cm93_relation20_raw": 997 + }, + "872": { + "_cm93_relation20_raw": 997 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 998, + "lon": 141.56775895446813, + "lat": 40.5424742970387, + "component_classes": [ + "TOWERS", + "LIGHTS", + "LIGHTS" + ], + "component_source_record_indices": [ + 829, + 874, + 883 + ], + "direct_names": [], + "nav_relation_fields": { + "829": { + "_cm93_relation20_raw": 998 + }, + "874": { + "_cm93_relation20_raw": 998 + }, + "883": { + "_cm93_relation20_raw": 998 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "O SAKI", + "nearest_same_cell_distance_m": 169.24, + "same_cell_candidate_count": 7, + "all_candidate_count": 7, + "candidate_summary": [ + { + "feature_id": 513892, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 962, + "native_scale": 50000, + "lon": 141.5659329581648, + "lat": 40.54184906832527, + "text": "O SAKI", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 169.24, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513878, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 948, + "native_scale": 50000, + "lon": 141.56686884484952, + "lat": 40.54589516057982, + "text": "HINODE IWA(ILLUM)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 387.75, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513894, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 964, + "native_scale": 50000, + "lon": 141.5729622809815, + "lat": 40.540568093710775, + "text": "SAME KADO", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 488.11, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513893, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 963, + "native_scale": 50000, + "lon": 141.5689796762308, + "lat": 40.54747083389779, + "text": "OGOMUNE", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 565.08, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513886, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 956, + "native_scale": 50000, + "lon": 141.57202639429678, + "lat": 40.5385550841112, + "text": "MONOMIWA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 565.65, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513900, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 970, + "native_scale": 50000, + "lon": 141.57416265738146, + "lat": 40.5442127071797, + "text": "TODO SH.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 574.6, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513881, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 951, + "native_scale": 50000, + "lon": 141.57125835685446, + "lat": 40.54915320545376, + "text": "KABAYAMA NE", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 799.36, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 999, + "lon": 141.5684761285037, + "lat": 40.56065929040829, + "component_classes": [ + "BOYSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 860, + 896 + ], + "direct_names": [], + "nav_relation_fields": { + "860": { + "_cm93_relation20_raw": 999 + }, + "896": { + "_cm93_relation20_raw": 999 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1000, + "lon": 141.51750082223097, + "lat": 40.5455495240557, + "component_classes": [ + "BOYSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 861, + 897 + ], + "direct_names": [], + "nav_relation_fields": { + "861": { + "_cm93_relation20_raw": 1000 + }, + "897": { + "_cm93_relation20_raw": 1000 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1001, + "lon": 141.52584750728323, + "lat": 40.53372564780069, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 879, + 977 + ], + "direct_names": [], + "nav_relation_fields": { + "879": { + "_cm93_relation20_raw": 1001 + }, + "977": { + "_cm93_relation20_raw": 1001 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TANKS", + "nearest_same_cell_distance_m": 725.86, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 725.86, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1002, + "lon": 141.52560844927135, + "lat": 40.533562965990825, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 875, + 975 + ], + "direct_names": [], + "nav_relation_fields": { + "875": { + "_cm93_relation20_raw": 1002 + }, + "975": { + "_cm93_relation20_raw": 1002 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TANKS", + "nearest_same_cell_distance_m": 701.19, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 701.19, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1003, + "lon": 141.52294320675622, + "lat": 40.530431264167966, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 881, + 986 + ], + "direct_names": [], + "nav_relation_fields": { + "881": { + "_cm93_relation20_raw": 1003 + }, + "986": { + "_cm93_relation20_raw": 1003 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TATE HANA", + "nearest_same_cell_distance_m": 446.92, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513899, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 969, + "native_scale": 50000, + "lon": 141.52025761887836, + "lat": 40.526968936454345, + "text": "TATE HANA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 446.92, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 468.68, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513888, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 958, + "native_scale": 50000, + "lon": 141.52083237537494, + "lat": 40.52605375386633, + "text": "NIIDA KAWA", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 518.42, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1004, + "lon": 141.54681340355705, + "lat": 40.537767147215504, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 852, + 869 + ], + "direct_names": [], + "nav_relation_fields": { + "852": { + "_cm93_relation20_raw": 1004 + }, + "869": { + "_cm93_relation20_raw": 1004 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "N. BREAKWATER", + "nearest_same_cell_distance_m": 86.78, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513887, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 957, + "native_scale": 50000, + "lon": 141.54777472194513, + "lat": 40.538041655314935, + "text": "N. BREAKWATER", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 86.78, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1005, + "lon": 141.5349622297778, + "lat": 40.56547154065089, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 895, + 989 + ], + "direct_names": [], + "nav_relation_fields": { + "895": { + "_cm93_relation20_raw": 1005 + }, + "989": { + "_cm93_relation20_raw": 1005 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1006, + "lon": 141.53273441256093, + "lat": 40.53599298441033, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 885, + 982 + ], + "direct_names": [], + "nav_relation_fields": { + "885": { + "_cm93_relation20_raw": 1006 + }, + "982": { + "_cm93_relation20_raw": 1006 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1007, + "lon": 141.5524745007314, + "lat": 40.53454921840199, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 856, + 866 + ], + "direct_names": [], + "nav_relation_fields": { + "856": { + "_cm93_relation20_raw": 1007 + }, + "866": { + "_cm93_relation20_raw": 1007 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "SILOS", + "nearest_same_cell_distance_m": 407.77, + "same_cell_candidate_count": 3, + "all_candidate_count": 3, + "candidate_summary": [ + { + "feature_id": 513896, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 966, + "native_scale": 50000, + "lon": 141.55118257019924, + "lat": 40.531015927405434, + "text": "SILOS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 407.77, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513887, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 957, + "native_scale": 50000, + "lon": 141.54777472194513, + "lat": 40.538041655314935, + "text": "N. BREAKWATER", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 555.47, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513882, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 952, + "native_scale": 50000, + "lon": 141.55808982083965, + "lat": 40.54033426236749, + "text": "KABU SH.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 799.36, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1008, + "lon": 141.52035425935122, + "lat": 40.53766039376199, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 855, + 867 + ], + "direct_names": [], + "nav_relation_fields": { + "855": { + "_cm93_relation20_raw": 1008 + }, + "867": { + "_cm93_relation20_raw": 1008 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TANKS", + "nearest_same_cell_distance_m": 697.1, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 697.1, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1009, + "lon": 141.52412323779345, + "lat": 40.545107310019546, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 886, + 974 + ], + "direct_names": [], + "nav_relation_fields": { + "886": { + "_cm93_relation20_raw": 1009 + }, + "974": { + "_cm93_relation20_raw": 1009 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1010, + "lon": 141.5310508337966, + "lat": 40.54428386920667, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 888, + 978 + ], + "direct_names": [], + "nav_relation_fields": { + "888": { + "_cm93_relation20_raw": 1010 + }, + "978": { + "_cm93_relation20_raw": 1010 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1011, + "lon": 141.5495244231383, + "lat": 40.54752166145216, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 892, + 972 + ], + "direct_names": [], + "nav_relation_fields": { + "892": { + "_cm93_relation20_raw": 1011 + }, + "972": { + "_cm93_relation20_raw": 1011 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "KO NE", + "nearest_same_cell_distance_m": 430.47, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513883, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 953, + "native_scale": 50000, + "lon": 141.55228630612632, + "lat": 40.54426862020725, + "text": "KO NE", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 430.47, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1012, + "lon": 141.51802980166147, + "lat": 40.54034951226258, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 894, + 976 + ], + "direct_names": [], + "nav_relation_fields": { + "894": { + "_cm93_relation20_raw": 1012 + }, + "976": { + "_cm93_relation20_raw": 1012 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1013, + "lon": 141.53316675151854, + "lat": 40.53632341943859, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 853, + 868 + ], + "direct_names": [], + "nav_relation_fields": { + "853": { + "_cm93_relation20_raw": 1013 + }, + "868": { + "_cm93_relation20_raw": 1013 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1014, + "lon": 141.52822282837974, + "lat": 40.54622554676639, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 891, + 983 + ], + "direct_names": [], + "nav_relation_fields": { + "891": { + "_cm93_relation20_raw": 1014 + }, + "983": { + "_cm93_relation20_raw": 1014 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1015, + "lon": 141.52565422633748, + "lat": 40.53388832921558, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 880, + 987 + ], + "direct_names": [], + "nav_relation_fields": { + "880": { + "_cm93_relation20_raw": 1015 + }, + "987": { + "_cm93_relation20_raw": 1015 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TANKS", + "nearest_same_cell_distance_m": 716.18, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 716.18, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1016, + "lon": 141.52510490154427, + "lat": 40.53350704402745, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 878, + 990 + ], + "direct_names": [], + "nav_relation_fields": { + "878": { + "_cm93_relation20_raw": 1016 + }, + "990": { + "_cm93_relation20_raw": 1016 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TANKS", + "nearest_same_cell_distance_m": 658.69, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 658.69, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1017, + "lon": 141.54959563190778, + "lat": 40.54994100842045, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 889, + 981 + ], + "direct_names": [], + "nav_relation_fields": { + "889": { + "_cm93_relation20_raw": 1017 + }, + "981": { + "_cm93_relation20_raw": 1017 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "KO NE", + "nearest_same_cell_distance_m": 670.46, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513883, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 953, + "native_scale": 50000, + "lon": 141.55228630612632, + "lat": 40.54426862020725, + "text": "KO NE", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 670.46, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1018, + "lon": 141.5280092020713, + "lat": 40.558667212294104, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 854, + 863 + ], + "direct_names": [], + "nav_relation_fields": { + "854": { + "_cm93_relation20_raw": 1018 + }, + "863": { + "_cm93_relation20_raw": 1018 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1019, + "lon": 141.54412781567916, + "lat": 40.549463245146605, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 890, + 979 + ], + "direct_names": [], + "nav_relation_fields": { + "890": { + "_cm93_relation20_raw": 1019 + }, + "979": { + "_cm93_relation20_raw": 1019 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1020, + "lon": 141.55782533112443, + "lat": 40.545163222300296, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 893, + 988 + ], + "direct_names": [], + "nav_relation_fields": { + "893": { + "_cm93_relation20_raw": 1020 + }, + "988": { + "_cm93_relation20_raw": 1020 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "KO NE", + "nearest_same_cell_distance_m": 478.49, + "same_cell_candidate_count": 4, + "all_candidate_count": 4, + "candidate_summary": [ + { + "feature_id": 513883, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 953, + "native_scale": 50000, + "lon": 141.55228630612632, + "lat": 40.54426862020725, + "text": "KO NE", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 478.49, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513882, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 952, + "native_scale": 50000, + "lon": 141.55808982083965, + "lat": 40.54033426236749, + "text": "KABU SH.", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 537.42, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513878, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 948, + "native_scale": 50000, + "lon": 141.56686884484952, + "lat": 40.54589516057982, + "text": "HINODE IWA(ILLUM)", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 768.46, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513892, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 962, + "native_scale": 50000, + "lon": 141.5659329581648, + "lat": 40.54184906832527, + "text": "O SAKI", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 777.91, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1021, + "lon": 141.52536939125952, + "lat": 40.533395199960694, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 877, + 980 + ], + "direct_names": [], + "nav_relation_fields": { + "877": { + "_cm93_relation20_raw": 1021 + }, + "980": { + "_cm93_relation20_raw": 1021 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TANKS", + "nearest_same_cell_distance_m": 676.55, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 676.55, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1022, + "lon": 141.5254151683256, + "lat": 40.53372564780069, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 876, + 985 + ], + "direct_names": [], + "nav_relation_fields": { + "876": { + "_cm93_relation20_raw": 1022 + }, + "985": { + "_cm93_relation20_raw": 1022 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "TANKS", + "nearest_same_cell_distance_m": 691.16, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513898, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 968, + "native_scale": 50000, + "lon": 141.51766867147336, + "lat": 40.53173276841354, + "text": "TANKS", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 691.16, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1023, + "lon": 141.49825919544693, + "lat": 40.55623293432891, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 884, + 984 + ], + "direct_names": [], + "nav_relation_fields": { + "884": { + "_cm93_relation20_raw": 1023 + }, + "984": { + "_cm93_relation20_raw": 1023 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "No 1 WHARF", + "nearest_same_cell_distance_m": 257.21, + "same_cell_candidate_count": 2, + "all_candidate_count": 2, + "candidate_summary": [ + { + "feature_id": 513889, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 959, + "native_scale": 50000, + "lon": 141.4954515353928, + "lat": 40.55533848010609, + "text": "No 1 WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 257.21, + "explicit_relation_overlap": [], + "text_relation_fields": {} + }, + { + "feature_id": 513890, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 960, + "native_scale": 50000, + "lon": 141.49809134620457, + "lat": 40.55028662228105, + "text": "No 2 WHARF", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 661.35, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1024, + "lon": 141.50759263059066, + "lat": 40.53502708806053, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 882, + 971 + ], + "direct_names": [], + "nav_relation_fields": { + "882": { + "_cm93_relation20_raw": 1024 + }, + "971": { + "_cm93_relation20_raw": 1024 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "K A W A R A G I", + "nearest_same_cell_distance_m": 477.72, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 513880, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "source_record_index": 950, + "native_scale": 50000, + "lon": 141.5020485192519, + "lat": 40.53586589358092, + "text": "K A W A R A G I", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 477.72, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 50000, + "cell_id": 351, + "source_relative_path": "03900420\\E\\03910424.E", + "relation20": 1025, + "lon": 141.52097987925458, + "lat": 40.555318151462146, + "component_classes": [ + "LIGHTS", + "_extgn" + ], + "component_source_record_indices": [ + 887, + 973 + ], + "direct_names": [], + "nav_relation_fields": { + "887": { + "_cm93_relation20_raw": 1025 + }, + "973": { + "_cm93_relation20_raw": 1025 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": null, + "lon": 141.65804316559033, + "lat": 40.467367860055134, + "component_classes": [ + "LIGHTS" + ], + "component_source_record_indices": [ + 4877 + ], + "direct_names": [], + "nav_relation_fields": {}, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6486, + "lon": 141.53481130881366, + "lat": 40.56513638820441, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4300, + 4741 + ], + "direct_names": [], + "nav_relation_fields": { + "4300": { + "_cm93_relation20_raw": 6486 + }, + "4741": { + "_cm93_relation20_raw": 6486 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6501, + "lon": 141.43965605140164, + "lat": 40.68046315791786, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4325, + 4781 + ], + "direct_names": [], + "nav_relation_fields": { + "4325": { + "_cm93_relation20_raw": 6501 + }, + "4781": { + "_cm93_relation20_raw": 6501 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6510, + "lon": 141.6269147619469, + "lat": 40.49949414054503, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4291, + 4747 + ], + "direct_names": [], + "nav_relation_fields": { + "4291": { + "_cm93_relation20_raw": 6510 + }, + "4747": { + "_cm93_relation20_raw": 6510 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6521, + "lon": 141.5676487228532, + "lat": 40.541909757522724, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4246, + 4842 + ], + "direct_names": [], + "nav_relation_fields": { + "4246": { + "_cm93_relation20_raw": 6521 + }, + "4842": { + "_cm93_relation20_raw": 6521 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6528, + "lon": 141.67305804264188, + "lat": 40.454613089799984, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4304, + 4777 + ], + "direct_names": [], + "nav_relation_fields": { + "4304": { + "_cm93_relation20_raw": 6528 + }, + "4777": { + "_cm93_relation20_raw": 6528 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6548, + "lon": 141.53481130881366, + "lat": 40.56201499793302, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4364, + 4830 + ], + "direct_names": [], + "nav_relation_fields": { + "4364": { + "_cm93_relation20_raw": 6548 + }, + "4830": { + "_cm93_relation20_raw": 6548 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6558, + "lon": 141.51424214797476, + "lat": 40.55215044794532, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4259, + 4598 + ], + "direct_names": [], + "nav_relation_fields": { + "4259": { + "_cm93_relation20_raw": 6558 + }, + "4598": { + "_cm93_relation20_raw": 6558 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6567, + "lon": 141.5765599913472, + "lat": 40.53922443934611, + "component_classes": [ + "TOWERS", + "LIGHTS" + ], + "component_source_record_indices": [ + 4274, + 4619 + ], + "direct_names": [], + "nav_relation_fields": { + "4274": { + "_cm93_relation20_raw": 6567 + }, + "4619": { + "_cm93_relation20_raw": 6567 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": "Same Kado", + "nearest_same_cell_distance_m": 528.84, + "same_cell_candidate_count": 1, + "all_candidate_count": 1, + "candidate_summary": [ + { + "feature_id": 361674, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "source_record_index": 6002, + "native_scale": 200000, + "lon": 141.58071044516635, + "lat": 40.54278402393275, + "text": "Same Kado", + "prefix": [ + 0, + 12, + 0 + ], + "same_cell": true, + "distance_m": 528.84, + "explicit_relation_overlap": [], + "text_relation_fields": {} + } + ] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6602, + "lon": 141.52785319505807, + "lat": 40.55864373294613, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 4439, + 4737 + ], + "direct_names": [], + "nav_relation_fields": { + "4439": { + "_cm93_relation20_raw": 6602 + }, + "4737": { + "_cm93_relation20_raw": 6602 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6620, + "lon": 141.3592715266989, + "lat": 40.68775404209214, + "component_classes": [ + "BCNSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 4540, + 4584 + ], + "direct_names": [], + "nav_relation_fields": { + "4540": { + "_cm93_relation20_raw": 6620 + }, + "4584": { + "_cm93_relation20_raw": 6620 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6632, + "lon": 141.54707956201432, + "lat": 40.53735089780069, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 4422, + 4714 + ], + "direct_names": [], + "nav_relation_fields": { + "4422": { + "_cm93_relation20_raw": 6632 + }, + "4714": { + "_cm93_relation20_raw": 6632 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6640, + "lon": 141.6516343766049, + "lat": 40.472369069669675, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 4460, + 4646 + ], + "direct_names": [], + "nav_relation_fields": { + "4460": { + "_cm93_relation20_raw": 6640 + }, + "4646": { + "_cm93_relation20_raw": 6640 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6657, + "lon": 141.5203457565323, + "lat": 40.53735089780069, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 4492, + 4673 + ], + "direct_names": [], + "nav_relation_fields": { + "4492": { + "_cm93_relation20_raw": 6657 + }, + "4673": { + "_cm93_relation20_raw": 6657 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6663, + "lon": 141.53426198404347, + "lat": 40.53797541747083, + "component_classes": [ + "BCNSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 4538, + 4784 + ], + "direct_names": [], + "nav_relation_fields": { + "4538": { + "_cm93_relation20_raw": 6663 + }, + "4784": { + "_cm93_relation20_raw": 6663 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6691, + "lon": 141.55232866537378, + "lat": 40.533978390984394, + "component_classes": [ + "BCNLAT", + "LIGHTS" + ], + "component_source_record_indices": [ + 4500, + 4670 + ], + "direct_names": [], + "nav_relation_fields": { + "4500": { + "_cm93_relation20_raw": 6691 + }, + "4670": { + "_cm93_relation20_raw": 6691 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + }, + { + "native_scale": 200000, + "cell_id": 40, + "source_relative_path": "03900420\\C\\03900420.C", + "relation20": 6720, + "lon": 141.47084549113066, + "lat": 40.54653075073066, + "component_classes": [ + "BCNSPP", + "LIGHTS" + ], + "component_source_record_indices": [ + 4539, + 4839 + ], + "direct_names": [], + "nav_relation_fields": { + "4539": { + "_cm93_relation20_raw": 6720 + }, + "4839": { + "_cm93_relation20_raw": 6720 + } + }, + "explicit_text_candidates": [], + "nearest_same_cell_text": null, + "nearest_same_cell_distance_m": null, + "same_cell_candidate_count": 0, + "all_candidate_count": 0, + "candidate_summary": [] + } + ], + "decision": "READY_FOR_SAFE_NAME_RULE_REVIEW" +} \ No newline at end of file diff --git a/cm95_nav_name_multiscale_audit_v2.txt b/cm95_nav_name_multiscale_audit_v2.txt new file mode 100644 index 0000000..298d3ac --- /dev/null +++ b/cm95_nav_name_multiscale_audit_v2.txt @@ -0,0 +1,36 @@ +CM95 / CM93 助航名称多尺度与显式关系审计 v2 +================================================================================== +Dataset ID : 1 +Scales : 20000,50000,200000 +Nav component rows : 227 +Nav groups : 136 +_texto rows : 110 + +1:20000 + groups : 62 + direct names : 7 + explicit text relation: 0 + same-cell <= 50m : 0 + same-cell <= 100m : 0 + same-cell <= 250m : 15 + +1:50000 + groups : 57 + direct names : 0 + explicit text relation: 0 + same-cell <= 50m : 0 + same-cell <= 100m : 2 + same-cell <= 250m : 10 + +1:200000 + groups : 17 + direct names : 0 + explicit text relation: 0 + same-cell <= 50m : 0 + same-cell <= 100m : 0 + same-cell <= 250m : 0 + +注意: +- 显式关系候选优先于距离候选。 +- 最近文字仍不会被脚本自动写入 chart_label_text。 +- 若 20k/50k/200k 都无安全来源,则该数据源的助航名称保持为空,不从 NEWPEC 反灌。 \ No newline at end of file diff --git a/cm95_nav_name_multiscale_groups_v2.csv b/cm95_nav_name_multiscale_groups_v2.csv new file mode 100644 index 0000000..39e467f --- /dev/null +++ b/cm95_nav_name_multiscale_groups_v2.csv @@ -0,0 +1,137 @@ +native_scale,cell_id,source_relative_path,relation20,lon,lat,component_classes,component_source_record_indices,direct_names,nav_relation_fields,explicit_text_candidates,nearest_same_cell_text,nearest_same_cell_distance_m,same_cell_candidate_count,all_candidate_count,candidate_summary +20000,693,03900420\F\03910424.F,,141.487254006117,40.55602869111419,"[""TOWERS""]",[1959],[],{},[],Kitanuma,730.41,1,1,"[{""feature_id"":606700,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2200,""native_scale"":20000,""lon"":141.4815623918527,""lat"":40.56097339975906,""text"":""Kitanuma"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":730.41,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.487370991933,40.55682149529551,"[""TOWERS""]",[1960],[],{},[],Kitanuma,673.74,1,1,"[{""feature_id"":606700,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2200,""native_scale"":20000,""lon"":141.4815623918527,""lat"":40.56097339975906,""text"":""Kitanuma"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":673.74,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.48809833852798,40.556491161360874,"[""TOWERS""]",[1958],[],{},[],Kitanuma,743.83,1,1,"[{""feature_id"":606700,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2200,""native_scale"":20000,""lon"":141.4815623918527,""lat"":40.56097339975906,""text"":""Kitanuma"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":743.83,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.48819497898467,40.55577458522323,"[""TOWERS""]",[1961],[],{},[],Hamana-Yachi,765.61,1,1,"[{""feature_id"":606692,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2192,""native_scale"":20000,""lon"":141.4941968599783,""lat"":40.550616027137096,""text"":""Hamana-Yachi"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":765.61,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.49735547700973,40.52981512984462,"[""TOWERS""]",[1970],[],{},[],Toyama-Shinden,517.72,3,3,"[{""feature_id"":606712,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2212,""native_scale"":20000,""lon"":141.50044288528355,""lat"":40.53383653024312,""text"":""Toyama-Shinden"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":517.72,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606702,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2202,""native_scale"":20000,""lon"":141.49126712823906,""lat"":40.529042342579885,""text"":""Numadate"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":521.69,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606652,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2152,""native_scale"":20000,""lon"":141.5038354739469,""lat"":40.5271713470344,""text"":""Area 3 Koyo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":621.58,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.5000054600586,40.535127801051665,"[""TOWERS""]",[1966],[],{},[],Toyama-Shinden,148.27,4,4,"[{""feature_id"":606712,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2212,""native_scale"":20000,""lon"":141.50044288528355,""lat"":40.53383653024312,""text"":""Toyama-Shinden"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":148.27,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606683,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2183,""native_scale"":20000,""lon"":141.4964857128996,""lat"":40.53749167722482,""text"":""Mabechi Kawa"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":396.94,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606710,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2210,""native_scale"":20000,""lon"":141.5023960397764,""lat"":40.538406703674674,""text"":""Tate"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":416.83,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606699,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2199,""native_scale"":20000,""lon"":141.50835214371162,""lat"":40.53415680839427,""text"":""Kawaragi"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":713.59,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.5003564175065,40.53742559149734,"[""TOWERS""]",[1964],[],{},[],Tate,203.98,5,5,"[{""feature_id"":606710,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2210,""native_scale"":20000,""lon"":141.5023960397764,""lat"":40.538406703674674,""text"":""Tate"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":203.98,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606683,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2183,""native_scale"":20000,""lon"":141.4964857128996,""lat"":40.53749167722482,""text"":""Mabechi Kawa"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":327.18,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606712,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2212,""native_scale"":20000,""lon"":141.50044288528355,""lat"":40.53383653024312,""text"":""Toyama-Shinden"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":399.15,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606695,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2195,""native_scale"":20000,""lon"":141.49386116154983,""lat"":40.54159903142414,""text"":""Hattaro"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":718.76,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606699,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2199,""native_scale"":20000,""lon"":141.50835214371162,""lat"":40.53415680839427,""text"":""Kawaragi"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":767.26,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.51061556493377,40.53027778111349,"[""BCNSPP""]",[1980],[],{},[],Kawaragi,471.84,4,4,"[{""feature_id"":606699,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2199,""native_scale"":20000,""lon"":141.50835214371162,""lat"":40.53415680839427,""text"":""Kawaragi"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":471.84,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606653,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2153,""native_scale"":20000,""lon"":141.51512206201883,""lat"":40.52610363595054,""text"":""Area 4 Koyo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":600.42,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":618.09,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606652,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2152,""native_scale"":20000,""lon"":141.5038354739469,""lat"":40.5271713470344,""text"":""Area 3 Koyo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":669.09,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.5108444502259,40.531909745248655,"[""BCNSPP""]",[1979],[],{},[],Kawaragi,326.8,5,5,"[{""feature_id"":606699,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2199,""native_scale"":20000,""lon"":141.50835214371162,""lat"":40.53415680839427,""text"":""Kawaragi"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":326.8,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":568.37,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606653,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2153,""native_scale"":20000,""lon"":141.51512206201883,""lat"":40.52610363595054,""text"":""Area 4 Koyo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":739.94,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606663,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2163,""native_scale"":20000,""lon"":141.51672934540358,""lat"":40.53728325278595,""text"":""Service Co., Inc."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":777.4,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606652,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2152,""native_scale"":20000,""lon"":141.5038354739469,""lat"":40.5271713470344,""text"":""Area 3 Koyo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":792.79,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.5214392960816,40.52781196552014,"[""TOWERS""]",[1962],[],{},[],Tate Hana,111.99,9,9,"[{""feature_id"":606665,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2165,""native_scale"":20000,""lon"":141.52014736576604,""lat"":40.52803567212025,""text"":""Tate Hana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":111.99,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606711,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2211,""native_scale"":20000,""lon"":141.5229906297283,""lat"":40.52654597546327,""text"":""Tatehana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":192.38,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606674,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2174,""native_scale"":20000,""lon"":141.51944036453034,""lat"":40.52694255323407,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":194.65,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606669,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2169,""native_scale"":20000,""lon"":141.51948105524897,""lat"":40.52654597546327,""text"":""(Konakano)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":217.28,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606685,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2185,""native_scale"":20000,""lon"":141.52122058346913,""lat"":40.52476643093591,""text"":""Niida Kawa"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":339.15,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606708,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2208,""native_scale"":20000,""lon"":141.5273089322398,""lat"":40.52658665021444,""text"":""Shinminato"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":514.47,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606714,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2214,""native_scale"":20000,""lon"":141.525121806115,""lat"":40.52382579545554,""text"":""Uenoyama"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":541.61,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606653,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2153,""native_scale"":20000,""lon"":141.51512206201883,""lat"":40.52610363595054,""text"":""Area 4 Koyo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":566.71,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":569.22,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.5214392960816,40.52813227246671,"[""SISTAT""]",[2046],[],{},[],Tate Hana,109.72,9,9,"[{""feature_id"":606665,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2165,""native_scale"":20000,""lon"":141.52014736576604,""lat"":40.52803567212025,""text"":""Tate Hana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":109.72,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606674,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2174,""native_scale"":20000,""lon"":141.51944036453034,""lat"":40.52694255323407,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":214.58,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606711,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2211,""native_scale"":20000,""lon"":141.5229906297283,""lat"":40.52654597546327,""text"":""Tatehana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":219.78,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606669,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2169,""native_scale"":20000,""lon"":141.51948105524897,""lat"":40.52654597546327,""text"":""(Konakano)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":241.88,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606685,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2185,""native_scale"":20000,""lon"":141.52122058346913,""lat"":40.52476643093591,""text"":""Niida Kawa"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":374.72,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606708,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2208,""native_scale"":20000,""lon"":141.5273089322398,""lat"":40.52658665021444,""text"":""Shinminato"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":525.02,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":540.46,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606714,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2214,""native_scale"":20000,""lon"":141.525121806115,""lat"":40.52382579545554,""text"":""Uenoyama"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":571.12,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606653,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2153,""native_scale"":20000,""lon"":141.51512206201883,""lat"":40.52610363595054,""text"":""Area 4 Koyo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":579.62,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.52367219926484,40.52990155944516,"[""SISTAT""]",[2047],[],{},[],Tate Hana,363.04,10,10,"[{""feature_id"":606665,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2165,""native_scale"":20000,""lon"":141.52014736576604,""lat"":40.52803567212025,""text"":""Tate Hana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":363.04,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606711,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2211,""native_scale"":20000,""lon"":141.5229906297283,""lat"":40.52654597546327,""text"":""Tatehana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":377.54,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606708,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2208,""native_scale"":20000,""lon"":141.5273089322398,""lat"":40.52658665021444,""text"":""Shinminato"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":479.94,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606674,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2174,""native_scale"":20000,""lon"":141.51944036453034,""lat"":40.52694255323407,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":485.99,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606669,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2169,""native_scale"":20000,""lon"":141.51948105524897,""lat"":40.52654597546327,""text"":""(Konakano)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":514.49,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":566.22,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606685,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2185,""native_scale"":20000,""lon"":141.52122058346913,""lat"":40.52476643093591,""text"":""Niida Kawa"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":607.44,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606714,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2214,""native_scale"":20000,""lon"":141.525121806115,""lat"":40.52382579545554,""text"":""Uenoyama"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":686.61,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606673,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2173,""native_scale"":20000,""lon"":141.5319018971019,""lat"":40.52964735441949,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":696.11,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606670,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2170,""native_scale"":20000,""lon"":141.53193241514083,""lat"":40.529362643645946,""text"":""(Tatehana)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":700.69,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.54550785613407,40.549177658809995,"[""LIGHTS""]",[2027],[],{},[],,,0,0,[] +20000,693,03900420\F\03910424.F,,141.55333573312492,40.526886625741874,"[""TOWERS""]",[1967],[],{},[],Sunamori,163.04,5,5,"[{""feature_id"":606709,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2209,""native_scale"":20000,""lon"":141.55269485430696,""lat"":40.525503676544034,""text"":""Sunamori"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":163.04,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606654,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2154,""native_scale"":20000,""lon"":141.54897165355496,""lat"":40.52447661492469,""text"":""Area 5 Shirogane"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":455.93,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606651,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2151,""native_scale"":20000,""lon"":141.54794421291032,""lat"":40.52869661907635,""text"":""Area 2 Chikkogai"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":498.15,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":639.35,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":655.78,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.55378333102954,40.527262864335846,"[""TOWERS""]",[1968],[],{},[],Sunamori,216.17,5,5,"[{""feature_id"":606709,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2209,""native_scale"":20000,""lon"":141.55269485430696,""lat"":40.525503676544034,""text"":""Sunamori"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":216.17,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606654,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2154,""native_scale"":20000,""lon"":141.54897165355496,""lat"":40.52447661492469,""text"":""Area 5 Shirogane"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":511.25,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606651,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2151,""native_scale"":20000,""lon"":141.54794421291032,""lat"":40.52869661907635,""text"":""Area 2 Chikkogai"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":518.62,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":587.75,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":614.98,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.553798590049,40.526698505652824,"[""TOWERS""]",[1963],[],{},[],Sunamori,162.34,5,5,"[{""feature_id"":606709,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2209,""native_scale"":20000,""lon"":141.55269485430696,""lat"":40.525503676544034,""text"":""Sunamori"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":162.34,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606654,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2154,""native_scale"":20000,""lon"":141.54897165355496,""lat"":40.52447661492469,""text"":""Area 5 Shirogane"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":476.96,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606651,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2151,""native_scale"":20000,""lon"":141.54794421291032,""lat"":40.52869661907635,""text"":""Area 2 Chikkogai"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":542.4,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":647.61,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":677.71,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.55411902945798,40.52698322774454,"[""TOWERS""]",[1972],[],{},[],Sunamori,203.85,5,5,"[{""feature_id"":606709,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2209,""native_scale"":20000,""lon"":141.55269485430696,""lat"":40.525503676544034,""text"":""Sunamori"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":203.85,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606654,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2154,""native_scale"":20000,""lon"":141.54897165355496,""lat"":40.52447661492469,""text"":""Area 5 Shirogane"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":516.69,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606651,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2151,""native_scale"":20000,""lon"":141.54794421291032,""lat"":40.52869661907635,""text"":""Area 2 Chikkogai"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":555.57,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":610.12,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":648.21,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.55427670599258,40.53193516493641,"[""TOWERS""]",[1971],[],{},[],Hachinohe Fishing Harbour (Same),122.06,6,6,"[{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":122.06,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":138.85,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606698,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2198,""native_scale"":20000,""lon"":141.55856449046513,""lat"":40.53529047907352,""text"":""Kami-Same"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":520.1,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606651,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2151,""native_scale"":20000,""lon"":141.54794421291032,""lat"":40.52869661907635,""text"":""Area 2 Chikkogai"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":645.07,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606655,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2155,""native_scale"":20000,""lon"":141.55846276366864,""lat"":40.53757809692398,""text"":""Kabu Island Marine Park"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":720.32,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606709,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2209,""native_scale"":20000,""lon"":141.55269485430696,""lat"":40.525503676544034,""text"":""Sunamori"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":727.54,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.5546683541591,40.532753673727576,"[""TOWERS""]",[1969],[],{},[],Hachinohe Fishing Harbour (Same),110.53,6,6,"[{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":110.53,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":110.81,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606698,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2198,""native_scale"":20000,""lon"":141.55856449046513,""lat"":40.53529047907352,""text"":""Kami-Same"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":433.57,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606655,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2155,""native_scale"":20000,""lon"":141.55846276366864,""lat"":40.53757809692398,""text"":""Kabu Island Marine Park"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":624.98,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606651,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2151,""native_scale"":20000,""lon"":141.54794421291032,""lat"":40.52869661907635,""text"":""Area 2 Chikkogai"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":725.58,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606656,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2156,""native_scale"":20000,""lon"":141.55759299955852,""lat"":40.5390929653105,""text"":""Kabu Shima"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":746.97,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.55547708219132,40.535127801051665,"[""SISTAW""]",[2048],[],{},[],Kami-Same,261.54,6,6,"[{""feature_id"":606698,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2198,""native_scale"":20000,""lon"":141.55856449046513,""lat"":40.53529047907352,""text"":""Kami-Same"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":261.54,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":314.7,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":316.05,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606655,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2155,""native_scale"":20000,""lon"":141.55846276366864,""lat"":40.53757809692398,""text"":""Kabu Island Marine Park"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":371.34,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606656,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2156,""native_scale"":20000,""lon"":141.55759299955852,""lat"":40.5390929653105,""text"":""Kabu Shima"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":475.79,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606705,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2205,""native_scale"":20000,""lon"":141.56257761258715,""lat"":40.537257835127086,""text"":""Shimo-Matsunaeba"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":645.1,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.55552285924972,40.53378060850419,"[""TOWERS""]",[1965],[],{},[],Hinode,165.6,6,6,"[{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":165.6,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":213.66,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606698,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2198,""native_scale"":20000,""lon"":141.55856449046513,""lat"":40.53529047907352,""text"":""Kami-Same"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":307.02,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606655,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2155,""native_scale"":20000,""lon"":141.55846276366864,""lat"":40.53757809692398,""text"":""Kabu Island Marine Park"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":489.93,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606656,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2156,""native_scale"":20000,""lon"":141.55759299955852,""lat"":40.5390929653105,""text"":""Kabu Shima"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":616.07,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606705,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2205,""native_scale"":20000,""lon"":141.56257761258715,""lat"":40.537257835127086,""text"":""Shimo-Matsunaeba"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":710.59,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,,141.57670746462134,40.53993171998525,"[""BCNSPP""]",[1981],[],{},[],Same Kado,178.61,9,9,"[{""feature_id"":606661,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2161,""native_scale"":20000,""lon"":141.5748967276436,""lat"":40.54076029762526,""text"":""Same Kado"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":178.61,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606667,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2167,""native_scale"":20000,""lon"":141.5763209027946,""lat"":40.543855935677584,""text"":""Todo Shima"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":437.57,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606687,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2187,""native_scale"":20000,""lon"":141.5735793656289,""lat"":40.54424224499966,""text"":""Okitonda"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":547.36,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606688,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2188,""native_scale"":20000,""lon"":141.58198199901997,""lat"":40.543093476529926,""text"":""Saku Ne"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":567.67,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606704,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2204,""native_scale"":20000,""lon"":141.5761581399202,""lat"":40.53474143916679,""text"":""Senzogakubo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":579.0,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606680,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2180,""native_scale"":20000,""lon"":141.58295348992658,""lat"":40.54273765929082,""text"":""Kankitsu"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":613.12,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606690,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2190,""native_scale"":20000,""lon"":141.58495242147782,""lat"":40.53972330313749,""text"":""Yahazukomone"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":697.11,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606677,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2177,""native_scale"":20000,""lon"":141.58476422690433,""lat"":40.53782210488448,""text"":""Hon-Karimata"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":720.11,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606706,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2206,""native_scale"":20000,""lon"":141.56734859934312,""lat"":40.53952505236351,""text"":""Shimo-Mekurakubo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":792.15,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2239,141.51452696025927,40.55241521469589,"[""TOWERS"",""LIGHTS""]","[1954,1999]",[],"{""1954"":{""_cm93_relation20_raw"":2239},""1999"":{""_cm93_relation20_raw"":2239}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2240,141.56767921143177,40.54238692330532,"[""TOWERS"",""LIGHTS""]","[1953,2011]",[],"{""1953"":{""_cm93_relation20_raw"":2240},""2011"":{""_cm93_relation20_raw"":2240}}",[],O Saki,166.43,10,10,"[{""feature_id"":606659,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2159,""native_scale"":20000,""lon"":141.56571079791942,""lat"":40.54243775472137,""text"":""O Saki"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":166.43,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606672,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2172,""native_scale"":20000,""lon"":141.5649122425669,""lat"":40.541878607023406,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":240.54,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606668,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2168,""native_scale"":20000,""lon"":141.5648969835474,""lat"":40.54151261691194,""text"":""(Ebisuhama)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":254.41,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606706,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2206,""native_scale"":20000,""lon"":141.56734859934312,""lat"":40.53952505236351,""text"":""Shimo-Mekurakubo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":319.45,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606666,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2166,""native_scale"":20000,""lon"":141.56636184941704,""lat"":40.546072100989115,""text"":""Hinode Iwa"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":424.62,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606687,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2187,""native_scale"":20000,""lon"":141.5735793656289,""lat"":40.54424224499966,""text"":""Okitonda"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":539.55,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606686,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2186,""native_scale"":20000,""lon"":141.56839129900726,""lat"":40.547607108287096,""text"":""Ogomune"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":583.57,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606661,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2161,""native_scale"":20000,""lon"":141.5748967276436,""lat"":40.54076029762526,""text"":""Same Kado"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":636.14,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606705,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2205,""native_scale"":20000,""lon"":141.56257761258715,""lat"":40.537257835127086,""text"":""Shimo-Matsunaeba"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":714.93,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606667,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2167,""native_scale"":20000,""lon"":141.5763209027946,""lat"":40.543855935677584,""text"":""Todo Shima"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":748.26,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2241,141.5759546863272,40.53986563666468,"[""TOWERS"",""LIGHTS""]","[1955,2001]",[],"{""1955"":{""_cm93_relation20_raw"":2241},""2001"":{""_cm93_relation20_raw"":2241}}",[],Same Kado,133.75,9,9,"[{""feature_id"":606661,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2161,""native_scale"":20000,""lon"":141.5748967276436,""lat"":40.54076029762526,""text"":""Same Kado"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":133.75,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606667,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2167,""native_scale"":20000,""lon"":141.5763209027946,""lat"":40.543855935677584,""text"":""Todo Shima"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":444.78,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606687,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2187,""native_scale"":20000,""lon"":141.5735793656289,""lat"":40.54424224499966,""text"":""Okitonda"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":526.42,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606704,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2204,""native_scale"":20000,""lon"":141.5761581399202,""lat"":40.53474143916679,""text"":""Senzogakubo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":570.04,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606688,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2188,""native_scale"":20000,""lon"":141.58198199901997,""lat"":40.543093476529926,""text"":""Saku Ne"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":623.08,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606680,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2180,""native_scale"":20000,""lon"":141.58295348992658,""lat"":40.54273765929082,""text"":""Kankitsu"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":672.12,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606706,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2206,""native_scale"":20000,""lon"":141.56734859934312,""lat"":40.53952505236351,""text"":""Shimo-Mekurakubo"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":728.23,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606690,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2190,""native_scale"":20000,""lon"":141.58495242147782,""lat"":40.53972330313749,""text"":""Yahazukomone"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":760.5,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606677,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2177,""native_scale"":20000,""lon"":141.58476422690433,""lat"":40.53782210488448,""text"":""Hon-Karimata"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":778.35,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2242,141.5350198234147,40.56587201094555,"[""TOWERS"",""LIGHTS""]","[1956,2007]",[],"{""1956"":{""_cm93_relation20_raw"":2242},""2007"":{""_cm93_relation20_raw"":2242}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2243,141.54813240748382,40.53939288485493,"[""TOWERS"",""LIGHTS""]","[1952,2009]",[],"{""1952"":{""_cm93_relation20_raw"":2243},""2009"":{""_cm93_relation20_raw"":2243}}",[],Ko Ne,682.88,1,1,"[{""feature_id"":606682,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2182,""native_scale"":20000,""lon"":141.5536409135144,""lat"":40.54388643386297,""text"":""Ko Ne"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":682.88,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2244,141.55521767886023,40.536297040550764,"[""TOWERS"",""LIGHTS""]","[1957,2008]",[],"{""1957"":{""_cm93_relation20_raw"":2244},""2008"":{""_cm93_relation20_raw"":2244}}",[],Kami-Same,304.17,6,6,"[{""feature_id"":606698,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2198,""native_scale"":20000,""lon"":141.55856449046513,""lat"":40.53529047907352,""text"":""Kami-Same"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":304.17,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606655,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2155,""native_scale"":20000,""lon"":141.55846276366864,""lat"":40.53757809692398,""text"":""Kabu Island Marine Park"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":309.02,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606656,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2156,""native_scale"":20000,""lon"":141.55759299955852,""lat"":40.5390929653105,""text"":""Kabu Shima"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":370.06,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":420.94,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":446.33,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606705,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2205,""native_scale"":20000,""lon"":141.56257761258715,""lat"":40.537257835127086,""text"":""Shimo-Matsunaeba"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":631.08,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2245,141.54756782376322,40.54819670438723,"[""BOYSPP"",""LIGHTS""]","[1987,2032]",[],"{""1987"":{""_cm93_relation20_raw"":2245},""2032"":{""_cm93_relation20_raw"":2245}}",[],Ko Ne,702.16,1,1,"[{""feature_id"":606682,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2182,""native_scale"":20000,""lon"":141.5536409135144,""lat"":40.54388643386297,""text"":""Ko Ne"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":702.16,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2246,141.51764488657207,40.545787460007524,"[""BOYSPP"",""LIGHTS""]","[1984,2028]",[],"{""1984"":{""_cm93_relation20_raw"":2246},""2028"":{""_cm93_relation20_raw"":2246}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2247,141.55372738129145,40.53761368147356,"[""BOYSPP"",""LIGHTS""]","[1985,2031]",[],"{""1985"":{""_cm93_relation20_raw"":2247},""2031"":{""_cm93_relation20_raw"":2247}}",[],Kabu Shima,365.74,7,7,"[{""feature_id"":606656,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2156,""native_scale"":20000,""lon"":141.55759299955852,""lat"":40.5390929653105,""text"":""Kabu Shima"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":365.74,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606655,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2155,""native_scale"":20000,""lon"":141.55846276366864,""lat"":40.53757809692398,""text"":""Kabu Island Marine Park"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":400.19,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606698,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2198,""native_scale"":20000,""lon"":141.55856449046513,""lat"":40.53529047907352,""text"":""Kami-Same"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":483.56,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":537.91,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":616.11,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606682,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2182,""native_scale"":20000,""lon"":141.5536409135144,""lat"":40.54388643386297,""text"":""Ko Ne"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":697.54,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606705,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2205,""native_scale"":20000,""lon"":141.56257761258715,""lat"":40.537257835127086,""text"":""Shimo-Matsunaeba"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":748.95,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2248,141.51602234416788,40.54453705850963,"[""BOYSPP"",""LIGHTS""]","[1982,2026]",[],"{""1982"":{""_cm93_relation20_raw"":2248},""2026"":{""_cm93_relation20_raw"":2248}}",[],Toyosu,681.35,2,2,"[{""feature_id"":606713,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2213,""native_scale"":20000,""lon"":141.51138360224738,""lat"":40.53952505236351,""text"":""Toyosu"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":681.35,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606660,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2160,""native_scale"":20000,""lon"":141.51662761860706,""lat"":40.5377102680129,""text"":""Pier for Tohoku Port"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":760.83,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2249,141.5144252334628,40.54336796282291,"[""BOYSPP"",""LIGHTS""]","[1983,2030]",[],"{""1983"":{""_cm93_relation20_raw"":2249},""2030"":{""_cm93_relation20_raw"":2249}}",[],Toyosu,498.65,3,3,"[{""feature_id"":606713,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2213,""native_scale"":20000,""lon"":141.51138360224738,""lat"":40.53952505236351,""text"":""Toyosu"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":498.65,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606660,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2160,""native_scale"":20000,""lon"":141.51662761860706,""lat"":40.5377102680129,""text"":""Pier for Tohoku Port"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":656.06,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606663,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2163,""native_scale"":20000,""lon"":141.51672934540358,""lat"":40.53728325278595,""text"":""Service Co., Inc."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":704.05,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2250,141.54760851448182,40.55077866754792,"[""BOYSPP"",""LIGHTS""]","[1986,2025]",[],"{""1986"":{""_cm93_relation20_raw"":2250},""2025"":{""_cm93_relation20_raw"":2250}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2251,141.5279752427569,40.55872215426594,"[""BCNLAT"",""LIGHTS""]","[1974,2006]",[],"{""1974"":{""_cm93_relation20_raw"":2251},""2006"":{""_cm93_relation20_raw"":2251}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2252,141.47915655311542,40.58768781797142,"[""LIGHTS"",""_extgn""]","[2017,2218]",[],"{""2017"":{""_cm93_relation20_raw"":2252},""2218"":{""_cm93_relation20_raw"":2252}}",[],Ichikawa Basin,334.87,1,1,"[{""feature_id"":606678,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2178,""native_scale"":20000,""lon"":141.47547404308204,""lat"":40.586570273697056,""text"":""Ichikawa Basin"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":334.87,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2253,141.50487817361105,40.55268966278586,"[""LIGHTS"",""_extgn""]","[2019,2236]",[],"{""2019"":{""_cm93_relation20_raw"":2253},""2236"":{""_cm93_relation20_raw"":2253}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2254,141.55245070999536,40.53446183378157,"[""BCNLAT"",""LIGHTS""]","[1977,2002]",[],"{""1977"":{""_cm93_relation20_raw"":2254},""2002"":{""_cm93_relation20_raw"":2254}}",[],Hachinohe Fishing Harbour (Same),201.79,6,6,"[{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":201.79,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606697,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2197,""native_scale"":20000,""lon"":141.55584329865871,""lat"":40.532311375187646,""text"":""Hinode"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":373.34,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606698,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2198,""native_scale"":20000,""lon"":141.55856449046513,""lat"":40.53529047907352,""text"":""Kami-Same"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":524.82,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606655,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2155,""native_scale"":20000,""lon"":141.55846276366864,""lat"":40.53757809692398,""text"":""Kabu Island Marine Park"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":614.98,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606656,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2156,""native_scale"":20000,""lon"":141.55759299955852,""lat"":40.5390929653105,""text"":""Kabu Shima"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":673.81,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606651,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2151,""native_scale"":20000,""lon"":141.54794421291032,""lat"":40.52869661907635,""text"":""Area 2 Chikkogai"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":745.67,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2255,141.53411954126562,40.53822878284375,"[""BCNSPP"",""LIGHTS""]","[1978,2010]",[],"{""1978"":{""_cm93_relation20_raw"":2255},""2010"":{""_cm93_relation20_raw"":2255}}",[],Kawaragi No 1 Wharf [Port Island],634.57,1,1,"[{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":634.57,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2256,141.54682521814877,40.5377458524923,"[""BCNLAT"",""LIGHTS""]","[1973,2005]",[],"{""1973"":{""_cm93_relation20_raw"":2256},""2005"":{""_cm93_relation20_raw"":2256}}",[],Hachinohe Fishing Harbour (Same),780.69,1,1,"[{""feature_id"":606671,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2171,""native_scale"":20000,""lon"":141.55336116482405,""lat"":40.53278417696755,""text"":""Hachinohe Fishing Harbour (Same)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":780.69,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2257,141.47109979083245,40.546926016675656,"[""LIGHTS"",""_extgn""]","[2029,2227]",[],"{""2029"":{""_cm93_relation20_raw"":2257},""2227"":{""_cm93_relation20_raw"":2257}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2258,141.52570164885506,40.53382127886439,"[""LIGHTS"",""_extgn""]","[1998,2229]","[{""object_class"":""LIGHTS"",""source_record_index"":1998,""field"":""OBJNAM"",""text"":""L2""}]","{""1998"":{""_cm93_relation20_raw"":2258},""2229"":{""_cm93_relation20_raw"":2258}}",[],Kawaragi No 1 Wharf [Port Island],438.58,5,5,"[{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":438.58,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606673,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2173,""native_scale"":20000,""lon"":141.5319018971019,""lat"":40.52964735441949,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":699.99,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":716.51,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606670,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2170,""native_scale"":20000,""lon"":141.53193241514083,""lat"":40.529362643645946,""text"":""(Tatehana)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":723.25,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606665,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2165,""native_scale"":20000,""lon"":141.52014736576604,""lat"":40.52803567212025,""text"":""Tate Hana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":796.38,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2259,141.49831170889684,40.55619131837828,"[""LIGHTS"",""_extgn""]","[2033,2237]",[],"{""2033"":{""_cm93_relation20_raw"":2259},""2237"":{""_cm93_relation20_raw"":2259}}",[],Hamana-Yachi,710.77,1,1,"[{""feature_id"":606692,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2192,""native_scale"":20000,""lon"":141.4941968599783,""lat"":40.550616027137096,""text"":""Hamana-Yachi"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":710.77,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2260,141.5075434156794,40.549081088805,"[""LIGHTS"",""_extgn""]","[2015,2220]",[],"{""2015"":{""_cm93_relation20_raw"":2260},""2220"":{""_cm93_relation20_raw"":2260}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2261,141.52826516412694,40.54623983528677,"[""LIGHTS"",""_extgn""]","[2024,2233]",[],"{""2024"":{""_cm93_relation20_raw"":2261},""2233"":{""_cm93_relation20_raw"":2261}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2262,141.51800601669967,40.54032821853955,"[""LIGHTS"",""_extgn""]","[2016,2216]",[],"{""2016"":{""_cm93_relation20_raw"":2262},""2216"":{""_cm93_relation20_raw"":2262}}",[],Pier for Tohoku Port,313.54,4,4,"[{""feature_id"":606660,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2160,""native_scale"":20000,""lon"":141.51662761860706,""lat"":40.5377102680129,""text"":""Pier for Tohoku Port"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":313.54,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606663,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2163,""native_scale"":20000,""lon"":141.51672934540358,""lat"":40.53728325278595,""text"":""Service Co., Inc."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":355.36,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606713,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2213,""native_scale"":20000,""lon"":141.51138360224738,""lat"":40.53952505236351,""text"":""Toyosu"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":566.7,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":786.16,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2263,141.52535069140714,40.53333831674283,"[""LIGHTS"",""_extgn""]","[1995,2228]","[{""object_class"":""LIGHTS"",""source_record_index"":1995,""field"":""OBJNAM"",""text"":""R1""}]","{""1995"":{""_cm93_relation20_raw"":2263},""2228"":{""_cm93_relation20_raw"":2263}}",[],Kawaragi No 1 Wharf [Port Island],497.15,7,7,"[{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":497.15,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":674.28,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606673,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2173,""native_scale"":20000,""lon"":141.5319018971019,""lat"":40.52964735441949,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":689.19,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606670,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2170,""native_scale"":20000,""lon"":141.53193241514083,""lat"":40.529362643645946,""text"":""(Tatehana)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":710.52,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606665,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2165,""native_scale"":20000,""lon"":141.52014736576604,""lat"":40.52803567212025,""text"":""Tate Hana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":735.56,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606708,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2208,""native_scale"":20000,""lon"":141.5273089322398,""lat"":40.52658665021444,""text"":""Shinminato"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":768.78,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606711,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2211,""native_scale"":20000,""lon"":141.5229906297283,""lat"":40.52654597546327,""text"":""Tatehana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":781.17,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2264,141.56030401868534,40.544648883984316,"[""LIGHTS"",""_extgn""]","[2018,2217]",[],"{""2018"":{""_cm93_relation20_raw"":2264},""2217"":{""_cm93_relation20_raw"":2264}}",[],Hachinohe Fishing Harbour,496.5,7,7,"[{""feature_id"":606672,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2172,""native_scale"":20000,""lon"":141.5649122425669,""lat"":40.541878607023406,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":496.5,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606659,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2159,""native_scale"":20000,""lon"":141.56571079791942,""lat"":40.54243775472137,""text"":""O Saki"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":518.82,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606668,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2168,""native_scale"":20000,""lon"":141.5648969835474,""lat"":40.54151261691194,""text"":""(Ebisuhama)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":521.77,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606666,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2166,""native_scale"":20000,""lon"":141.56636184941704,""lat"":40.546072100989115,""text"":""Hinode Iwa"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":535.77,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606682,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2182,""native_scale"":20000,""lon"":141.5536409135144,""lat"":40.54388643386297,""text"":""Ko Ne"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":569.36,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606656,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2156,""native_scale"":20000,""lon"":141.55759299955852,""lat"":40.5390929653105,""text"":""Kabu Shima"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":658.9,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606686,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2186,""native_scale"":20000,""lon"":141.56839129900726,""lat"":40.547607108287096,""text"":""Ogomune"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":758.39,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2265,141.52588984342862,40.53368910010344,"[""LIGHTS"",""_extgn""]","[1997,2235]","[{""object_class"":""LIGHTS"",""source_record_index"":1997,""field"":""OBJNAM"",""text"":""L1""}]","{""1997"":{""_cm93_relation20_raw"":2265},""2235"":{""_cm93_relation20_raw"":2265}}",[],Kawaragi No 1 Wharf [Port Island],450.52,6,6,"[{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":450.52,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606673,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2173,""native_scale"":20000,""lon"":141.5319018971019,""lat"":40.52964735441949,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":678.34,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606670,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2170,""native_scale"":20000,""lon"":141.53193241514083,""lat"":40.529362643645946,""text"":""(Tatehana)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":701.59,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":727.86,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606665,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2165,""native_scale"":20000,""lon"":141.52014736576604,""lat"":40.52803567212025,""text"":""Tate Hana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":794.18,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606708,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2208,""native_scale"":20000,""lon"":141.5273089322398,""lat"":40.52658665021444,""text"":""Shinminato"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":798.81,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2266,141.52561518107802,40.53350099910942,"[""LIGHTS"",""_extgn""]","[1993,2226]","[{""object_class"":""LIGHTS"",""source_record_index"":1993,""field"":""OBJNAM"",""text"":""C1""}]","{""1993"":{""_cm93_relation20_raw"":2266},""2226"":{""_cm93_relation20_raw"":2266}}",[],Kawaragi No 1 Wharf [Port Island],474.92,6,6,"[{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":474.92,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606673,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2173,""native_scale"":20000,""lon"":141.5319018971019,""lat"":40.52964735441949,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":682.58,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":700.18,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606670,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2170,""native_scale"":20000,""lon"":141.53193241514083,""lat"":40.529362643645946,""text"":""(Tatehana)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":704.84,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606665,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2165,""native_scale"":20000,""lon"":141.52014736576604,""lat"":40.52803567212025,""text"":""Tate Hana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":763.46,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606708,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2208,""native_scale"":20000,""lon"":141.5273089322398,""lat"":40.52658665021444,""text"":""Shinminato"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":782.05,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2267,141.52294485266987,40.53044047091052,"[""LIGHTS"",""_extgn""]","[2000,2230]","[{""object_class"":""LIGHTS"",""source_record_index"":2000,""field"":""OBJNAM"",""text"":""C1""}]","{""2000"":{""_cm93_relation20_raw"":2267},""2230"":{""_cm93_relation20_raw"":2267}}",[],Tate Hana,356.94,10,10,"[{""feature_id"":606665,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2165,""native_scale"":20000,""lon"":141.52014736576604,""lat"":40.52803567212025,""text"":""Tate Hana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":356.94,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606711,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2211,""native_scale"":20000,""lon"":141.5229906297283,""lat"":40.52654597546327,""text"":""Tatehana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":433.07,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":486.39,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606674,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2174,""native_scale"":20000,""lon"":141.51944036453034,""lat"":40.52694255323407,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":488.89,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606669,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2169,""native_scale"":20000,""lon"":141.51948105524897,""lat"":40.52654597546327,""text"":""(Konakano)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":522.72,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606708,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2208,""native_scale"":20000,""lon"":141.5273089322398,""lat"":40.52658665021444,""text"":""Shinminato"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":565.4,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606685,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2185,""native_scale"":20000,""lon"":141.52122058346913,""lat"":40.52476643093591,""text"":""Niida Kawa"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":647.54,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606714,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2214,""native_scale"":20000,""lon"":141.525121806115,""lat"":40.52382579545554,""text"":""Uenoyama"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":758.18,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606673,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2173,""native_scale"":20000,""lon"":141.5319018971019,""lat"":40.52964735441949,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":762.13,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606670,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2170,""native_scale"":20000,""lon"":141.53193241514083,""lat"":40.529362643645946,""text"":""(Tatehana)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":768.99,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2268,141.52094592111857,40.55528669920913,"[""LIGHTS"",""_extgn""]","[2021,2232]",[],"{""2021"":{""_cm93_relation20_raw"":2268},""2232"":{""_cm93_relation20_raw"":2268}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2269,141.50160257076368,40.552715074589145,"[""LIGHTS"",""_extgn""]","[2022,2222]",[],"{""2022"":{""_cm93_relation20_raw"":2269},""2222"":{""_cm93_relation20_raw"":2269}}",[],Hamana-Yachi,667.81,1,1,"[{""feature_id"":606692,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2192,""native_scale"":20000,""lon"":141.4941968599783,""lat"":40.550616027137096,""text"":""Hamana-Yachi"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":667.81,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2270,141.5254269865045,40.53363317824145,"[""LIGHTS"",""_extgn""]","[1994,2219]","[{""object_class"":""LIGHTS"",""source_record_index"":1994,""field"":""OBJNAM"",""text"":""C2""}]","{""1994"":{""_cm93_relation20_raw"":2270},""2219"":{""_cm93_relation20_raw"":2270}}",[],Kawaragi No 1 Wharf [Port Island],463.74,6,6,"[{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":463.74,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":688.47,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606673,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2173,""native_scale"":20000,""lon"":141.5319018971019,""lat"":40.52964735441949,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":704.19,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606670,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2170,""native_scale"":20000,""lon"":141.53193241514083,""lat"":40.529362643645946,""text"":""(Tatehana)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":726.48,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606665,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2165,""native_scale"":20000,""lon"":141.52014736576604,""lat"":40.52803567212025,""text"":""Tate Hana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":765.83,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606708,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2208,""native_scale"":20000,""lon"":141.5273089322398,""lat"":40.52658665021444,""text"":""Shinminato"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":799.52,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2271,141.53291407872706,40.54241742215959,"[""LIGHTS"",""_extgn""]","[2013,2231]",[],"{""2013"":{""_cm93_relation20_raw"":2271},""2231"":{""_cm93_relation20_raw"":2271}}",[],Kawaragi No 1 Wharf [Port Island],745.65,1,1,"[{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":745.65,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2272,141.52043728713608,40.53762384848427,"[""BCNLAT"",""LIGHTS""]","[1976,2003]",[],"{""1976"":{""_cm93_relation20_raw"":2272},""2003"":{""_cm93_relation20_raw"":2272}}",[],"Service Co., Inc.",315.62,5,5,"[{""feature_id"":606663,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2163,""native_scale"":20000,""lon"":141.51672934540358,""lat"":40.53728325278595,""text"":""Service Co., Inc."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":315.62,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606660,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2160,""native_scale"":20000,""lon"":141.51662761860706,""lat"":40.5377102680129,""text"":""Pier for Tohoku Port"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":322.08,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":524.46,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":670.56,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606713,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2213,""native_scale"":20000,""lon"":141.51138360224738,""lat"":40.53952505236351,""text"":""Toyosu"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":793.75,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2273,141.53323451813606,40.53630720776126,"[""BCNLAT"",""LIGHTS""]","[1975,2004]",[],"{""1975"":{""_cm93_relation20_raw"":2273},""2004"":{""_cm93_relation20_raw"":2273}}",[],Kawaragi No 1 Wharf [Port Island],578.19,3,3,"[{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":578.19,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606673,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2173,""native_scale"":20000,""lon"":141.5319018971019,""lat"":40.52964735441949,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":749.06,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606670,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2170,""native_scale"":20000,""lon"":141.53193241514083,""lat"":40.529362643645946,""text"":""(Tatehana)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":780.0,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2274,141.52411979716945,40.545101266953736,"[""LIGHTS"",""_extgn""]","[2014,2223]",[],"{""2014"":{""_cm93_relation20_raw"":2274},""2223"":{""_cm93_relation20_raw"":2274}}",[],,,0,0,[] +20000,693,03900420\F\03910424.F,2275,141.53280217925092,40.535966605369474,"[""LIGHTS"",""_extgn""]","[2012,2221]",[],"{""2012"":{""_cm93_relation20_raw"":2275},""2221"":{""_cm93_relation20_raw"":2275}}",[],Kawaragi No 1 Wharf [Port Island],555.07,3,3,"[{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":555.07,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606673,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2173,""native_scale"":20000,""lon"":141.5319018971019,""lat"":40.52964735441949,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":706.78,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606670,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2170,""native_scale"":20000,""lon"":141.53193241514083,""lat"":40.529362643645946,""text"":""(Tatehana)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":738.0,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2276,141.5251777558531,40.5334501609123,"[""LIGHTS"",""_extgn""]","[1996,2225]","[{""object_class"":""LIGHTS"",""source_record_index"":1996,""field"":""OBJNAM"",""text"":""R2""}]","{""1996"":{""_cm93_relation20_raw"":2276},""2225"":{""_cm93_relation20_raw"":2276}}",[],Kawaragi No 1 Wharf [Port Island],488.52,7,7,"[{""feature_id"":606657,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2157,""native_scale"":20000,""lon"":141.52664262172271,""lat"":40.53770010101532,""text"":""Kawaragi No 1 Wharf [Port Island]"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":488.52,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606715,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2215,""native_scale"":20000,""lon"":141.5175685914747,""lat"":40.53200125607943,""text"":""Uheikawara"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":662.94,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606673,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2173,""native_scale"":20000,""lon"":141.5319018971019,""lat"":40.52964735441949,""text"":""Hachinohe Fishing Harbour"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":708.34,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606670,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2170,""native_scale"":20000,""lon"":141.53193241514083,""lat"":40.529362643645946,""text"":""(Tatehana)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":729.7,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606665,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2165,""native_scale"":20000,""lon"":141.52014736576604,""lat"":40.52803567212025,""text"":""Tate Hana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":737.04,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606708,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2208,""native_scale"":20000,""lon"":141.5273089322398,""lat"":40.52658665021444,""text"":""Shinminato"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":784.16,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":606711,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2211,""native_scale"":20000,""lon"":141.5229906297283,""lat"":40.52654597546327,""text"":""Tatehana"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":789.65,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2277,141.4824321559628,40.58365441116841,"[""LIGHTS"",""_extgn""]","[2023,2224]",[],"{""2023"":{""_cm93_relation20_raw"":2277},""2224"":{""_cm93_relation20_raw"":2277}}",[],Ichikawa Basin,671.1,1,1,"[{""feature_id"":606678,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2178,""native_scale"":20000,""lon"":141.47547404308204,""lat"":40.586570273697056,""text"":""Ichikawa Basin"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":671.1,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +20000,693,03900420\F\03910424.F,2278,141.54953623727556,40.549818066898325,"[""LIGHTS"",""_extgn""]","[2020,2234]",[],"{""2020"":{""_cm93_relation20_raw"":2278},""2234"":{""_cm93_relation20_raw"":2278}}",[],Ko Ne,745.2,1,1,"[{""feature_id"":606682,""cell_id"":693,""source_relative_path"":""03900420\\F\\03910424.F"",""source_record_index"":2182,""native_scale"":20000,""lon"":141.5536409135144,""lat"":40.54388643386297,""text"":""Ko Ne"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":745.2,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.48717605911006,40.55602965032755,"[""TOWERS""]",[847],[],{},[],HACHINOHE,533.7,5,5,"[{""feature_id"":513876,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":946,""native_scale"":50000,""lon"":141.48158617070516,""lat"":40.558265740394994,""text"":""HACHINOHE"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":533.7,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513897,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":967,""native_scale"":50000,""lon"":141.48120469515436,""lat"":40.55764065910144,""text"":""STEEL JETTY"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":535.33,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513875,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":945,""native_scale"":50000,""lon"":141.48103684591197,""lat"":40.55301589260543,""text"":""H A C H I T A R O"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":617.51,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513885,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":955,""native_scale"":50000,""lon"":141.48523307697113,""lat"":40.561558755232554,""text"":""MITSUBUSHI JETTY"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":636.34,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513889,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":959,""native_scale"":50000,""lon"":141.4954515353928,""lat"":40.55533848010609,""text"":""No 1 WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":703.35,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.48734390835241,40.556837700583436,"[""TOWERS""]",[843],[],{},[],HACHINOHE,511.68,5,5,"[{""feature_id"":513876,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":946,""native_scale"":50000,""lon"":141.48158617070516,""lat"":40.558265740394994,""text"":""HACHINOHE"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":511.68,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513897,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":967,""native_scale"":50000,""lon"":141.48120469515436,""lat"":40.55764065910144,""text"":""STEEL JETTY"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":526.28,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513885,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":955,""native_scale"":50000,""lon"":141.48523307697113,""lat"":40.561558755232554,""text"":""MITSUBUSHI JETTY"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":554.42,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513875,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":945,""native_scale"":50000,""lon"":141.48103684591197,""lat"":40.55301589260543,""text"":""H A C H I T A R O"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":681.56,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513889,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":959,""native_scale"":50000,""lon"":141.4954515353928,""lat"":40.55533848010609,""text"":""No 1 WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":704.95,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.48806616872866,40.55652769503456,"[""TOWERS""]",[836],[],{},[],HACHINOHE,580.55,5,5,"[{""feature_id"":513876,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":946,""native_scale"":50000,""lon"":141.48158617070516,""lat"":40.558265740394994,""text"":""HACHINOHE"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":580.55,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513897,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":967,""native_scale"":50000,""lon"":141.48120469515436,""lat"":40.55764065910144,""text"":""STEEL JETTY"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":592.73,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513885,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":955,""native_scale"":50000,""lon"":141.48523307697113,""lat"":40.561558755232554,""text"":""MITSUBUSHI JETTY"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":608.48,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513889,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":959,""native_scale"":50000,""lon"":141.4954515353928,""lat"":40.55533848010609,""text"":""No 1 WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":637.8,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513875,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":945,""native_scale"":50000,""lon"":141.48103684591197,""lat"":40.55301589260543,""text"":""H A C H I T A R O"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":710.75,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.48813737749816,40.55581111933769,"[""TOWERS""]",[835],[],{},[],HACHINOHE,617.1,5,5,"[{""feature_id"":513876,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":946,""native_scale"":50000,""lon"":141.48158617070516,""lat"":40.558265740394994,""text"":""HACHINOHE"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":617.1,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513897,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":967,""native_scale"":50000,""lon"":141.48120469515436,""lat"":40.55764065910144,""text"":""STEEL JETTY"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":620.01,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513889,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":959,""native_scale"":50000,""lon"":141.4954515353928,""lat"":40.55533848010609,""text"":""No 1 WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":620.16,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513875,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":945,""native_scale"":50000,""lon"":141.48103684591197,""lat"":40.55301589260543,""text"":""H A C H I T A R O"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":675.63,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513885,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":955,""native_scale"":50000,""lon"":141.48523307697113,""lat"":40.561558755232554,""text"":""MITSUBUSHI JETTY"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":684.59,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.4973487404656,40.52984659582941,"[""TOWERS""]",[837],[],{},[],MABECHI KAWA,724.41,2,2,"[{""feature_id"":513884,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":954,""native_scale"":50000,""lon"":141.49523790908432,""lat"":40.536160743936016,""text"":""MABECHI KAWA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":724.41,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513880,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":950,""native_scale"":50000,""lon"":141.5020485192519,""lat"":40.53586589358092,""text"":""K A W A R A G I"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":778.29,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.49998855127737,40.535169431555296,"[""TOWERS""]",[838],[],{},[],K A W A R A G I,190.53,2,2,"[{""feature_id"":513880,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":950,""native_scale"":50000,""lon"":141.5020485192519,""lat"":40.53586589358092,""text"":""K A W A R A G I"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":190.53,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513884,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":954,""native_scale"":50000,""lon"":141.49523790908432,""lat"":40.536160743936016,""text"":""MABECHI KAWA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":416.33,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.5003496814655,40.5374977215057,"[""TOWERS""]",[840],[],{},[],K A W A R A G I,231.38,2,2,"[{""feature_id"":513880,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":950,""native_scale"":50000,""lon"":141.5020485192519,""lat"":40.53586589358092,""text"":""K A W A R A G I"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":231.38,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513884,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":954,""native_scale"":50000,""lon"":141.49523790908432,""lat"":40.536160743936016,""text"":""MABECHI KAWA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":456.85,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.51056813988717,40.53031941496734,"[""BCNSPP""]",[857],[],{},[],TANKS,620.33,1,1,"[{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":620.33,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.510807197899,40.53193104223212,"[""BCNSPP""]",[858],[],{},[],TANKS,580.3,1,1,"[{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":580.3,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.52138678650883,40.52817899202388,"[""SISTAT""]",[914],[],{},[],TATE HANA,164.96,3,3,"[{""feature_id"":513899,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":969,""native_scale"":50000,""lon"":141.52025761887836,""lat"":40.526968936454345,""text"":""TATE HANA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":164.96,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513888,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":958,""native_scale"":50000,""lon"":141.52083237537494,""lat"":40.52605375386633,""text"":""NIIDA KAWA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":240.92,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":504.88,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.52366546713245,40.529897436757,"[""SISTAT""]",[915],[],{},[],TATE HANA,434.74,3,3,"[{""feature_id"":513899,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":969,""native_scale"":50000,""lon"":141.52025761887836,""lat"":40.526968936454345,""text"":""TATE HANA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":434.74,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513888,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":958,""native_scale"":50000,""lon"":141.52083237537494,""lat"":40.52605375386633,""text"":""NIIDA KAWA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":489.9,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":546.36,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.5467930581943,40.52788410654553,"[""TOWERS""]",[846],[],{},[],SHIROGANE WHARF,102.45,3,3,"[{""feature_id"":513895,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":965,""native_scale"":50000,""lon"":141.5459995890486,""lat"":40.52858064429507,""text"":""SHIROGANE WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":102.45,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513877,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":947,""native_scale"":50000,""lon"":141.55060781370267,""lat"":40.524482661283564,""text"":""HACHINOHE"",""prefix"":[16,12,0],""same_cell"":true,""distance_m"":497.0,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":508.83,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.54746445516378,40.527868853813075,"[""TOWERS""]",[844],[],{},[],SHIROGANE WHARF,146.94,3,3,"[{""feature_id"":513895,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":965,""native_scale"":50000,""lon"":141.5459995890486,""lat"":40.52858064429507,""text"":""SHIROGANE WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":146.94,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513877,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":947,""native_scale"":50000,""lon"":141.55060781370267,""lat"":40.524482661283564,""text"":""HACHINOHE"",""prefix"":[16,12,0],""same_cell"":true,""distance_m"":460.82,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":470.32,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.54755600929602,40.52753837709095,"[""TOWERS""]",[850],[],{},[],SHIROGANE WHARF,175.32,3,3,"[{""feature_id"":513895,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":965,""native_scale"":50000,""lon"":141.5459995890486,""lat"":40.52858064429507,""text"":""SHIROGANE WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":175.32,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513877,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":947,""native_scale"":50000,""lon"":141.55060781370267,""lat"":40.524482661283564,""text"":""HACHINOHE"",""prefix"":[16,12,0],""same_cell"":true,""distance_m"":426.6,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":493.43,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.5533900420534,40.526968936454345,"[""TOWERS""]",[845],[],{},[],HACHINOHE,362.95,3,3,"[{""feature_id"":513877,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":947,""native_scale"":50000,""lon"":141.55060781370267,""lat"":40.524482661283564,""text"":""HACHINOHE"",""prefix"":[16,12,0],""same_cell"":true,""distance_m"":362.95,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":487.15,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513895,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":965,""native_scale"":50000,""lon"":141.5459995890486,""lat"":40.52858064429507,""text"":""SHIROGANE WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":649.83,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.55384272637372,40.52673505764836,"[""TOWERS""]",[849],[],{},[],HACHINOHE,370.79,3,3,"[{""feature_id"":513877,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":947,""native_scale"":50000,""lon"":141.55060781370267,""lat"":40.524482661283564,""text"":""HACHINOHE"",""prefix"":[16,12,0],""same_cell"":true,""distance_m"":370.79,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":526.44,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513895,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":965,""native_scale"":50000,""lon"":141.5459995890486,""lat"":40.52858064429507,""text"":""SHIROGANE WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":693.93,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.55386815807714,40.527284163118864,"[""TOWERS""]",[851],[],{},[],HACHINOHE,415.91,3,3,"[{""feature_id"":513877,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":947,""native_scale"":50000,""lon"":141.55060781370267,""lat"":40.524482661283564,""text"":""HACHINOHE"",""prefix"":[16,12,0],""same_cell"":true,""distance_m"":415.91,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":472.97,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513895,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":965,""native_scale"":50000,""lon"":141.5459995890486,""lat"":40.52858064429507,""text"":""SHIROGANE WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":680.48,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.55415807949575,40.52702486387398,"[""TOWERS""]",[848],[],{},[],HACHINOHE,412.25,3,3,"[{""feature_id"":513877,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":947,""native_scale"":50000,""lon"":141.55060781370267,""lat"":40.524482661283564,""text"":""HACHINOHE"",""prefix"":[16,12,0],""same_cell"":true,""distance_m"":412.25,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":510.09,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513895,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":965,""native_scale"":50000,""lon"":141.5459995890486,""lat"":40.52858064429507,""text"":""SHIROGANE WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":710.91,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.55434627410082,40.5319869655108,"[""TOWERS""]",[841],[],{},[],SILOS,288.35,1,1,"[{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":288.35,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.55470740428896,40.53283089295858,"[""TOWERS""]",[839],[],{},[],SILOS,359.82,1,1,"[{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":359.82,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.55557208220415,40.533908664364674,"[""TOWERS""]",[842],[],{},[],SILOS,491.0,2,2,"[{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":491.0,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513882,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":952,""native_scale"":50000,""lon"":141.55808982083965,""lat"":40.54033426236749,""text"":""KABU SH."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":745.5,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.57267744590357,40.5397649304665,"[""RTPBCN""]",[913],[],{},[],SAME KADO,92.49,4,4,"[{""feature_id"":513894,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":964,""native_scale"":50000,""lon"":141.5729622809815,""lat"":40.540568093710775,""text"":""SAME KADO"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":92.49,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513886,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":956,""native_scale"":50000,""lon"":141.57202639429678,""lat"":40.5385550841112,""text"":""MONOMIWA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":145.34,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513900,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":970,""native_scale"":50000,""lon"":141.57416265738146,""lat"":40.5442127071797,""text"":""TODO SH."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":510.25,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513892,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":962,""native_scale"":50000,""lon"":141.5659329581648,""lat"":40.54184906832527,""text"":""O SAKI"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":615.24,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,,141.57687367696272,40.54005976366212,"[""BCNSPP""]",[859],[],{},[],SAME KADO,335.32,3,3,"[{""feature_id"":513894,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":964,""native_scale"":50000,""lon"":141.5729622809815,""lat"":40.540568093710775,""text"":""SAME KADO"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":335.32,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513886,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":956,""native_scale"":50000,""lon"":141.57202639429678,""lat"":40.5385550841112,""text"":""MONOMIWA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":442.47,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513900,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":970,""native_scale"":50000,""lon"":141.57416265738146,""lat"":40.5442127071797,""text"":""TODO SH."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":515.49,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,992,141.51457109000057,40.552446668497204,"[""TOWERS"",""LIGHTS""]","[831,864]",[],"{""831"":{""_cm93_relation20_raw"":992},""864"":{""_cm93_relation20_raw"":992}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,993,141.55525672908215,40.53632341943859,"[""TOWERS"",""LIGHTS""]","[833,870]",[],"{""833"":{""_cm93_relation20_raw"":993},""870"":{""_cm93_relation20_raw"":993}}",[],KABU SH.,506.18,3,3,"[{""feature_id"":513882,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":952,""native_scale"":50000,""lon"":141.55808982083965,""lat"":40.54033426236749,""text"":""KABU SH."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":506.18,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513887,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":957,""native_scale"":50000,""lon"":141.54777472194513,""lat"":40.538041655314935,""text"":""N. BREAKWATER"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":660.51,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":683.26,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,994,141.54818162919935,40.53947009597325,"[""TOWERS"",""LIGHTS""]","[830,871]",[],"{""830"":{""_cm93_relation20_raw"":994},""871"":{""_cm93_relation20_raw"":994}}",[],N. BREAKWATER,162.51,2,2,"[{""feature_id"":513887,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":957,""native_scale"":50000,""lon"":141.54777472194513,""lat"":40.538041655314935,""text"":""N. BREAKWATER"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":162.51,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513883,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":953,""native_scale"":50000,""lon"":141.55228630612632,""lat"":40.54426862020725,""text"":""KO NE"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":636.4,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,995,141.53501309318457,40.562163473376586,"[""TOWERS"",""LIGHTS""]","[834,873]",[],"{""834"":{""_cm93_relation20_raw"":995},""873"":{""_cm93_relation20_raw"":995}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,996,141.57615650292712,40.539856430562644,"[""TOWERS"",""LIGHTS""]","[832,865]",[],"{""832"":{""_cm93_relation20_raw"":996},""865"":{""_cm93_relation20_raw"":996}}",[],SAME KADO,281.28,3,3,"[{""feature_id"":513894,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":964,""native_scale"":50000,""lon"":141.5729622809815,""lat"":40.540568093710775,""text"":""SAME KADO"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":281.28,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513886,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":956,""native_scale"":50000,""lon"":141.57202639429678,""lat"":40.5385550841112,""text"":""MONOMIWA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":377.82,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513900,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":970,""native_scale"":50000,""lon"":141.57416265738146,""lat"":40.5442127071797,""text"":""TODO SH."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":512.86,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,997,141.5340263430931,40.538229743548484,"[""TOWERS"",""LIGHTS""]","[828,872]",[],"{""828"":{""_cm93_relation20_raw"":997},""872"":{""_cm93_relation20_raw"":997}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,998,141.56775895446813,40.5424742970387,"[""TOWERS"",""LIGHTS"",""LIGHTS""]","[829,874,883]",[],"{""829"":{""_cm93_relation20_raw"":998},""874"":{""_cm93_relation20_raw"":998},""883"":{""_cm93_relation20_raw"":998}}",[],O SAKI,169.24,7,7,"[{""feature_id"":513892,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":962,""native_scale"":50000,""lon"":141.5659329581648,""lat"":40.54184906832527,""text"":""O SAKI"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":169.24,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513878,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":948,""native_scale"":50000,""lon"":141.56686884484952,""lat"":40.54589516057982,""text"":""HINODE IWA(ILLUM)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":387.75,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513894,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":964,""native_scale"":50000,""lon"":141.5729622809815,""lat"":40.540568093710775,""text"":""SAME KADO"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":488.11,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513893,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":963,""native_scale"":50000,""lon"":141.5689796762308,""lat"":40.54747083389779,""text"":""OGOMUNE"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":565.08,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513886,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":956,""native_scale"":50000,""lon"":141.57202639429678,""lat"":40.5385550841112,""text"":""MONOMIWA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":565.65,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513900,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":970,""native_scale"":50000,""lon"":141.57416265738146,""lat"":40.5442127071797,""text"":""TODO SH."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":574.6,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513881,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":951,""native_scale"":50000,""lon"":141.57125835685446,""lat"":40.54915320545376,""text"":""KABAYAMA NE"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":799.36,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,999,141.5684761285037,40.56065929040829,"[""BOYSPP"",""LIGHTS""]","[860,896]",[],"{""860"":{""_cm93_relation20_raw"":999},""896"":{""_cm93_relation20_raw"":999}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1000,141.51750082223097,40.5455495240557,"[""BOYSPP"",""LIGHTS""]","[861,897]",[],"{""861"":{""_cm93_relation20_raw"":1000},""897"":{""_cm93_relation20_raw"":1000}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1001,141.52584750728323,40.53372564780069,"[""LIGHTS"",""_extgn""]","[879,977]",[],"{""879"":{""_cm93_relation20_raw"":1001},""977"":{""_cm93_relation20_raw"":1001}}",[],TANKS,725.86,1,1,"[{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":725.86,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1002,141.52560844927135,40.533562965990825,"[""LIGHTS"",""_extgn""]","[875,975]",[],"{""875"":{""_cm93_relation20_raw"":1002},""975"":{""_cm93_relation20_raw"":1002}}",[],TANKS,701.19,1,1,"[{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":701.19,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1003,141.52294320675622,40.530431264167966,"[""LIGHTS"",""_extgn""]","[881,986]",[],"{""881"":{""_cm93_relation20_raw"":1003},""986"":{""_cm93_relation20_raw"":1003}}",[],TATE HANA,446.92,3,3,"[{""feature_id"":513899,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":969,""native_scale"":50000,""lon"":141.52025761887836,""lat"":40.526968936454345,""text"":""TATE HANA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":446.92,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":468.68,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513888,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":958,""native_scale"":50000,""lon"":141.52083237537494,""lat"":40.52605375386633,""text"":""NIIDA KAWA"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":518.42,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1004,141.54681340355705,40.537767147215504,"[""BCNLAT"",""LIGHTS""]","[852,869]",[],"{""852"":{""_cm93_relation20_raw"":1004},""869"":{""_cm93_relation20_raw"":1004}}",[],N. BREAKWATER,86.78,1,1,"[{""feature_id"":513887,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":957,""native_scale"":50000,""lon"":141.54777472194513,""lat"":40.538041655314935,""text"":""N. BREAKWATER"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":86.78,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1005,141.5349622297778,40.56547154065089,"[""LIGHTS"",""_extgn""]","[895,989]",[],"{""895"":{""_cm93_relation20_raw"":1005},""989"":{""_cm93_relation20_raw"":1005}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1006,141.53273441256093,40.53599298441033,"[""LIGHTS"",""_extgn""]","[885,982]",[],"{""885"":{""_cm93_relation20_raw"":1006},""982"":{""_cm93_relation20_raw"":1006}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1007,141.5524745007314,40.53454921840199,"[""BCNLAT"",""LIGHTS""]","[856,866]",[],"{""856"":{""_cm93_relation20_raw"":1007},""866"":{""_cm93_relation20_raw"":1007}}",[],SILOS,407.77,3,3,"[{""feature_id"":513896,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":966,""native_scale"":50000,""lon"":141.55118257019924,""lat"":40.531015927405434,""text"":""SILOS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":407.77,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513887,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":957,""native_scale"":50000,""lon"":141.54777472194513,""lat"":40.538041655314935,""text"":""N. BREAKWATER"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":555.47,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513882,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":952,""native_scale"":50000,""lon"":141.55808982083965,""lat"":40.54033426236749,""text"":""KABU SH."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":799.36,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1008,141.52035425935122,40.53766039376199,"[""BCNLAT"",""LIGHTS""]","[855,867]",[],"{""855"":{""_cm93_relation20_raw"":1008},""867"":{""_cm93_relation20_raw"":1008}}",[],TANKS,697.1,1,1,"[{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":697.1,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1009,141.52412323779345,40.545107310019546,"[""LIGHTS"",""_extgn""]","[886,974]",[],"{""886"":{""_cm93_relation20_raw"":1009},""974"":{""_cm93_relation20_raw"":1009}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1010,141.5310508337966,40.54428386920667,"[""LIGHTS"",""_extgn""]","[888,978]",[],"{""888"":{""_cm93_relation20_raw"":1010},""978"":{""_cm93_relation20_raw"":1010}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1011,141.5495244231383,40.54752166145216,"[""LIGHTS"",""_extgn""]","[892,972]",[],"{""892"":{""_cm93_relation20_raw"":1011},""972"":{""_cm93_relation20_raw"":1011}}",[],KO NE,430.47,1,1,"[{""feature_id"":513883,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":953,""native_scale"":50000,""lon"":141.55228630612632,""lat"":40.54426862020725,""text"":""KO NE"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":430.47,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1012,141.51802980166147,40.54034951226258,"[""LIGHTS"",""_extgn""]","[894,976]",[],"{""894"":{""_cm93_relation20_raw"":1012},""976"":{""_cm93_relation20_raw"":1012}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1013,141.53316675151854,40.53632341943859,"[""BCNLAT"",""LIGHTS""]","[853,868]",[],"{""853"":{""_cm93_relation20_raw"":1013},""868"":{""_cm93_relation20_raw"":1013}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1014,141.52822282837974,40.54622554676639,"[""LIGHTS"",""_extgn""]","[891,983]",[],"{""891"":{""_cm93_relation20_raw"":1014},""983"":{""_cm93_relation20_raw"":1014}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1015,141.52565422633748,40.53388832921558,"[""LIGHTS"",""_extgn""]","[880,987]",[],"{""880"":{""_cm93_relation20_raw"":1015},""987"":{""_cm93_relation20_raw"":1015}}",[],TANKS,716.18,1,1,"[{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":716.18,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1016,141.52510490154427,40.53350704402745,"[""LIGHTS"",""_extgn""]","[878,990]",[],"{""878"":{""_cm93_relation20_raw"":1016},""990"":{""_cm93_relation20_raw"":1016}}",[],TANKS,658.69,1,1,"[{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":658.69,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1017,141.54959563190778,40.54994100842045,"[""LIGHTS"",""_extgn""]","[889,981]",[],"{""889"":{""_cm93_relation20_raw"":1017},""981"":{""_cm93_relation20_raw"":1017}}",[],KO NE,670.46,1,1,"[{""feature_id"":513883,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":953,""native_scale"":50000,""lon"":141.55228630612632,""lat"":40.54426862020725,""text"":""KO NE"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":670.46,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1018,141.5280092020713,40.558667212294104,"[""BCNLAT"",""LIGHTS""]","[854,863]",[],"{""854"":{""_cm93_relation20_raw"":1018},""863"":{""_cm93_relation20_raw"":1018}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1019,141.54412781567916,40.549463245146605,"[""LIGHTS"",""_extgn""]","[890,979]",[],"{""890"":{""_cm93_relation20_raw"":1019},""979"":{""_cm93_relation20_raw"":1019}}",[],,,0,0,[] +50000,351,03900420\E\03910424.E,1020,141.55782533112443,40.545163222300296,"[""LIGHTS"",""_extgn""]","[893,988]",[],"{""893"":{""_cm93_relation20_raw"":1020},""988"":{""_cm93_relation20_raw"":1020}}",[],KO NE,478.49,4,4,"[{""feature_id"":513883,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":953,""native_scale"":50000,""lon"":141.55228630612632,""lat"":40.54426862020725,""text"":""KO NE"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":478.49,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513882,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":952,""native_scale"":50000,""lon"":141.55808982083965,""lat"":40.54033426236749,""text"":""KABU SH."",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":537.42,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513878,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":948,""native_scale"":50000,""lon"":141.56686884484952,""lat"":40.54589516057982,""text"":""HINODE IWA(ILLUM)"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":768.46,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513892,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":962,""native_scale"":50000,""lon"":141.5659329581648,""lat"":40.54184906832527,""text"":""O SAKI"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":777.91,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1021,141.52536939125952,40.533395199960694,"[""LIGHTS"",""_extgn""]","[877,980]",[],"{""877"":{""_cm93_relation20_raw"":1021},""980"":{""_cm93_relation20_raw"":1021}}",[],TANKS,676.55,1,1,"[{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":676.55,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1022,141.5254151683256,40.53372564780069,"[""LIGHTS"",""_extgn""]","[876,985]",[],"{""876"":{""_cm93_relation20_raw"":1022},""985"":{""_cm93_relation20_raw"":1022}}",[],TANKS,691.16,1,1,"[{""feature_id"":513898,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":968,""native_scale"":50000,""lon"":141.51766867147336,""lat"":40.53173276841354,""text"":""TANKS"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":691.16,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1023,141.49825919544693,40.55623293432891,"[""LIGHTS"",""_extgn""]","[884,984]",[],"{""884"":{""_cm93_relation20_raw"":1023},""984"":{""_cm93_relation20_raw"":1023}}",[],No 1 WHARF,257.21,2,2,"[{""feature_id"":513889,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":959,""native_scale"":50000,""lon"":141.4954515353928,""lat"":40.55533848010609,""text"":""No 1 WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":257.21,""explicit_relation_overlap"":[],""text_relation_fields"":{}},{""feature_id"":513890,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":960,""native_scale"":50000,""lon"":141.49809134620457,""lat"":40.55028662228105,""text"":""No 2 WHARF"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":661.35,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1024,141.50759263059066,40.53502708806053,"[""LIGHTS"",""_extgn""]","[882,971]",[],"{""882"":{""_cm93_relation20_raw"":1024},""971"":{""_cm93_relation20_raw"":1024}}",[],K A W A R A G I,477.72,1,1,"[{""feature_id"":513880,""cell_id"":351,""source_relative_path"":""03900420\\E\\03910424.E"",""source_record_index"":950,""native_scale"":50000,""lon"":141.5020485192519,""lat"":40.53586589358092,""text"":""K A W A R A G I"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":477.72,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +50000,351,03900420\E\03910424.E,1025,141.52097987925458,40.555318151462146,"[""LIGHTS"",""_extgn""]","[887,973]",[],"{""887"":{""_cm93_relation20_raw"":1025},""973"":{""_cm93_relation20_raw"":1025}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,,141.65804316559033,40.467367860055134,"[""LIGHTS""]",[4877],[],{},[],,,0,0,[] +200000,40,03900420\C\03900420.C,6486,141.53481130881366,40.56513638820441,"[""TOWERS"",""LIGHTS""]","[4300,4741]",[],"{""4300"":{""_cm93_relation20_raw"":6486},""4741"":{""_cm93_relation20_raw"":6486}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6501,141.43965605140164,40.68046315791786,"[""TOWERS"",""LIGHTS""]","[4325,4781]",[],"{""4325"":{""_cm93_relation20_raw"":6501},""4781"":{""_cm93_relation20_raw"":6501}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6510,141.6269147619469,40.49949414054503,"[""TOWERS"",""LIGHTS""]","[4291,4747]",[],"{""4291"":{""_cm93_relation20_raw"":6510},""4747"":{""_cm93_relation20_raw"":6510}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6521,141.5676487228532,40.541909757522724,"[""TOWERS"",""LIGHTS""]","[4246,4842]",[],"{""4246"":{""_cm93_relation20_raw"":6521},""4842"":{""_cm93_relation20_raw"":6521}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6528,141.67305804264188,40.454613089799984,"[""TOWERS"",""LIGHTS""]","[4304,4777]",[],"{""4304"":{""_cm93_relation20_raw"":6528},""4777"":{""_cm93_relation20_raw"":6528}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6548,141.53481130881366,40.56201499793302,"[""TOWERS"",""LIGHTS""]","[4364,4830]",[],"{""4364"":{""_cm93_relation20_raw"":6548},""4830"":{""_cm93_relation20_raw"":6548}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6558,141.51424214797476,40.55215044794532,"[""TOWERS"",""LIGHTS""]","[4259,4598]",[],"{""4259"":{""_cm93_relation20_raw"":6558},""4598"":{""_cm93_relation20_raw"":6558}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6567,141.5765599913472,40.53922443934611,"[""TOWERS"",""LIGHTS""]","[4274,4619]",[],"{""4274"":{""_cm93_relation20_raw"":6567},""4619"":{""_cm93_relation20_raw"":6567}}",[],Same Kado,528.84,1,1,"[{""feature_id"":361674,""cell_id"":40,""source_relative_path"":""03900420\\C\\03900420.C"",""source_record_index"":6002,""native_scale"":200000,""lon"":141.58071044516635,""lat"":40.54278402393275,""text"":""Same Kado"",""prefix"":[0,12,0],""same_cell"":true,""distance_m"":528.84,""explicit_relation_overlap"":[],""text_relation_fields"":{}}]" +200000,40,03900420\C\03900420.C,6602,141.52785319505807,40.55864373294613,"[""BCNLAT"",""LIGHTS""]","[4439,4737]",[],"{""4439"":{""_cm93_relation20_raw"":6602},""4737"":{""_cm93_relation20_raw"":6602}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6620,141.3592715266989,40.68775404209214,"[""BCNSPP"",""LIGHTS""]","[4540,4584]",[],"{""4540"":{""_cm93_relation20_raw"":6620},""4584"":{""_cm93_relation20_raw"":6620}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6632,141.54707956201432,40.53735089780069,"[""BCNLAT"",""LIGHTS""]","[4422,4714]",[],"{""4422"":{""_cm93_relation20_raw"":6632},""4714"":{""_cm93_relation20_raw"":6632}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6640,141.6516343766049,40.472369069669675,"[""BCNLAT"",""LIGHTS""]","[4460,4646]",[],"{""4460"":{""_cm93_relation20_raw"":6640},""4646"":{""_cm93_relation20_raw"":6640}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6657,141.5203457565323,40.53735089780069,"[""BCNLAT"",""LIGHTS""]","[4492,4673]",[],"{""4492"":{""_cm93_relation20_raw"":6657},""4673"":{""_cm93_relation20_raw"":6657}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6663,141.53426198404347,40.53797541747083,"[""BCNSPP"",""LIGHTS""]","[4538,4784]",[],"{""4538"":{""_cm93_relation20_raw"":6663},""4784"":{""_cm93_relation20_raw"":6663}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6691,141.55232866537378,40.533978390984394,"[""BCNLAT"",""LIGHTS""]","[4500,4670]",[],"{""4500"":{""_cm93_relation20_raw"":6691},""4670"":{""_cm93_relation20_raw"":6691}}",[],,,0,0,[] +200000,40,03900420\C\03900420.C,6720,141.47084549113066,40.54653075073066,"[""BCNSPP"",""LIGHTS""]","[4539,4839]",[],"{""4539"":{""_cm93_relation20_raw"":6720},""4839"":{""_cm93_relation20_raw"":6720}}",[],,,0,0,[] diff --git a/cm95_nav_text_relation_fields_v2.csv b/cm95_nav_text_relation_fields_v2.csv new file mode 100644 index 0000000..6b99c15 --- /dev/null +++ b/cm95_nav_text_relation_fields_v2.csv @@ -0,0 +1 @@ +native_scale,field_name,occurrence_count diff --git a/cm95_navsea_selected_aoi_mapping_audit_v2.py b/cm95_navsea_selected_aoi_mapping_audit_v2.py new file mode 100644 index 0000000..4081c3c --- /dev/null +++ b/cm95_navsea_selected_aoi_mapping_audit_v2.py @@ -0,0 +1,1008 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 / CM93 MySQL 选定 AOI → NavSea PBF 映射输入审计 v2 + +用途 +==== +从已经通过最终验收的 CM95/CM93 MySQL Dataset 中,只读导出选定 AOI +(默认对应现有 NavSea 样本 tile z10/914/385)内的真实对象与属性分布, +作为下一步 `cm95_to_navsea_v1.yaml` 的唯一 MySQL 输入依据。 + +默认 AOI: + z10 / x=914 / y=385 + lon: 129.7265625 .. 130.078125 + lat: 33.43144133557529 .. 33.7243396617476 + +该 z10 tile 已覆盖本次提供的: + z11/1828-1829/770-771 + z12/3656-3659/1540-1543 + +本脚本: +- 只读 MySQL; +- 不修改 importer/schema; +- 不生成 PBF; +- 不依赖历史 V 系列结果; +- 不需要 NEWPEC/旧 PBF 数据库; +- 不涉及 style 修改。 + +输出: +- AOI报告_v1.json +- 对象类别汇总_v1.csv +- 对象类别尺度分布_v1.csv +- 属性字段汇总_v1.csv +- 属性值域汇总_v1.csv +- 对象字典_v1.csv +- 属性字典_v1.csv +- AOI_Cell清单_v1.csv +- AOI_Feature样本_v1.jsonl +- AOI_关联对象样本_v1.jsonl +- AOI_对象映射准备表_v1.csv +- 摘要_v1.txt +- ZIP + +执行示例: + python .\cm95_karatsu_aoi_mapping_audit_v1.py ` + --host 127.0.0.1 ` + --port 3306 ` + --user root ` + --database cm93_chart ` + --dataset-id 1 + +如不传密码,会安全提示输入。 +""" + +from __future__ import annotations + +import argparse +import csv +import getpass +import json +import math +import sys +import zipfile +from collections import Counter, defaultdict +from datetime import datetime +from pathlib import Path +from typing import Any, Iterable + +try: + import pymysql + from pymysql.cursors import DictCursor +except ImportError: + print("缺少 pymysql,请执行: pip install pymysql") + sys.exit(2) + + +VERSION = "v2.0" + + +def parse_args(): + p = argparse.ArgumentParser( + description="CM95 选定 AOI → NavSea PBF 映射输入审计 v2" + ) + p.add_argument("--host", default="127.0.0.1") + p.add_argument("--port", type=int, default=3306) + p.add_argument("--user", default="root") + p.add_argument("--password", default=None) + p.add_argument("--database", default="cm93_chart") + p.add_argument("--dataset-id", type=int, default=1) + + p.add_argument("--z", type=int, default=10) + p.add_argument("--x", type=int, default=914) + p.add_argument("--y", type=int, default=385) + + p.add_argument( + "--sample-per-class", + type=int, + default=12, + help="每个 object_class + geometry_type 最多保存多少条 Feature 样本", + ) + p.add_argument( + "--value-sample-limit", + type=int, + default=40, + help="每个属性值域最多在 CSV 中列出多少个高频值", + ) + p.add_argument("--output-dir", default=None) + return p.parse_args() + + +def tile_bounds(z: int, x: int, y: int): + n = 2 ** z + lon_min = x / n * 360.0 - 180.0 + lon_max = (x + 1) / n * 360.0 - 180.0 + + def tile_lat(ty: int) -> float: + return math.degrees( + math.atan( + math.sinh( + math.pi * (1.0 - 2.0 * ty / n) + ) + ) + ) + + lat_max = tile_lat(y) + lat_min = tile_lat(y + 1) + return lon_min, lat_min, lon_max, lat_max + + +def begin_read_only(cur, warnings: list[str]): + try: + cur.execute("SET SESSION TRANSACTION READ ONLY") + except Exception as e: + warnings.append(f"SET SESSION TRANSACTION READ ONLY failed: {e}") + + try: + cur.execute("START TRANSACTION READ ONLY") + except Exception as e: + warnings.append(f"START TRANSACTION READ ONLY failed: {e}") + cur.execute("START TRANSACTION") + + +def scalar(cur, sql: str, params=()): + cur.execute(sql, params) + row = cur.fetchone() + if not row: + return None + return next(iter(row.values())) + + +def fetchall(cur, sql: str, params=()): + cur.execute(sql, params) + return list(cur.fetchall()) + + +def write_csv(path: Path, rows: Iterable[dict[str, Any]]): + rows = list(rows) + if not rows: + path.write_text("", encoding="utf-8-sig") + return + + keys = [] + seen = set() + for row in rows: + for key in row: + if key not in seen: + seen.add(key) + keys.append(key) + + with path.open("w", encoding="utf-8-sig", newline="") as f: + w = csv.DictWriter(f, fieldnames=keys, extrasaction="ignore") + w.writeheader() + for row in rows: + out = {} + for key in keys: + value = row.get(key) + if isinstance(value, (dict, list, tuple)): + value = json.dumps( + value, + ensure_ascii=False, + default=str, + ) + out[key] = value + w.writerow(out) + + +def json_obj(v): + if v is None: + return {} + if isinstance(v, dict): + return v + if isinstance(v, (bytes, bytearray, memoryview)): + v = bytes(v).decode("utf-8") + obj = json.loads(v) + return obj if isinstance(obj, dict) else {} + + +def normalized_attr_value(row: dict[str, Any]): + vt = row.get("value_type") + if vt in ("BYTE", "INT", "LONG"): + return row.get("value_int") + if vt in ("REAL", "WORD10"): + return row.get("value_real") + if vt == "STRING": + return row.get("value_text") + if vt in ("LIST", "COMPLEX"): + value = row.get("value_json") + if value is not None: + try: + if isinstance(value, (dict, list)): + return value + return json.loads(value) + except Exception: + return str(value) + return row.get("value_text") + return ( + row.get("value_text") + if row.get("value_text") is not None + else row.get("value_int") + if row.get("value_int") is not None + else row.get("value_real") + ) + + +def stable_value_text(value: Any) -> str: + if isinstance(value, (dict, list)): + return json.dumps( + value, + ensure_ascii=False, + sort_keys=True, + separators=(",", ":"), + default=str, + ) + if value is None: + return "" + if isinstance(value, float): + return format(value, ".15g") + return str(value) + + +def suggested_source_id( + dataset_id: int, + cell_path: str, + source_record_index: int, + geometry_type: str, +): + # 这里只输出建议的稳定 identity 文本,不在本阶段分配 int32 fid。 + return ( + f"cm95:{dataset_id}:" + f"{cell_path.replace(chr(92), '/')}:" + f"{source_record_index}:" + f"{geometry_type.lower()}" + ) + + +def main(): + a = parse_args() + + if a.password is None: + a.password = getpass.getpass("MySQL password: ") + + lon_min, lat_min, lon_max, lat_max = tile_bounds(a.z, a.x, a.y) + + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + outdir = Path( + a.output_dir + or f"cm95_selected_aoi_mapping_audit_dataset_{a.dataset_id}_{stamp}" + ).resolve() + outdir.mkdir(parents=True, exist_ok=True) + + warnings: list[str] = [] + + conn = pymysql.connect( + host=a.host, + port=a.port, + user=a.user, + password=a.password, + database=a.database, + charset="utf8mb4", + cursorclass=DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + write_timeout=30, + ) + + report: dict[str, Any] = { + "version": "v2.0", + "generated_at": datetime.now().isoformat(timespec="seconds"), + "database": a.database, + "dataset_id": a.dataset_id, + "read_only": True, + "aoi": { + "tile": { + "z": a.z, + "x": a.x, + "y": a.y, + }, + "bbox_wgs84": { + "min_lon": lon_min, + "min_lat": lat_min, + "max_lon": lon_max, + "max_lat": lat_max, + }, + "known_navsea_samples_inside": [ + "z10/914/385", + "z11/1828-1829/770-771", + "z12/3656-3659/1540-1543", + ], + }, + } + + bbox_where = """ + f.dataset_id=%s + AND f.bbox_min_lon IS NOT NULL + AND f.bbox_min_lat IS NOT NULL + AND f.bbox_max_lon IS NOT NULL + AND f.bbox_max_lat IS NOT NULL + AND f.bbox_max_lon >= %s + AND f.bbox_min_lon <= %s + AND f.bbox_max_lat >= %s + AND f.bbox_min_lat <= %s + """ + bbox_params = ( + a.dataset_id, + lon_min, + lon_max, + lat_min, + lat_max, + ) + + try: + with conn.cursor() as cur: + begin_read_only(cur, warnings) + + print("[1/8] Dataset / AOI Cell ...") + + dataset = fetchall( + cur, + """ + SELECT + id, + source_type, + name, + source_root, + parser_version, + normalized_srid + FROM chart_dataset + WHERE id=%s + """, + (a.dataset_id,), + ) + if not dataset: + raise RuntimeError( + f"Dataset ID={a.dataset_id} 不存在" + ) + report["dataset"] = dataset[0] + + cells = fetchall( + cur, + """ + SELECT + id AS cell_id, + source_relative_path, + source_file_name, + scale_code, + native_scale, + cell_name, + feature_count, + attribute_count, + bbox_min_lon, + bbox_min_lat, + bbox_max_lon, + bbox_max_lat + FROM chart_cell + WHERE dataset_id=%s + AND bbox_max_lon >= %s + AND bbox_min_lon <= %s + AND bbox_max_lat >= %s + AND bbox_min_lat <= %s + ORDER BY native_scale,source_relative_path + """, + ( + a.dataset_id, + lon_min, + lon_max, + lat_min, + lat_max, + ), + ) + write_csv(outdir / "AOI_Cell清单_v1.csv", cells) + + print("[2/8] AOI Feature 对象类别统计 ...") + + class_summary = fetchall( + cur, + f""" + SELECT + f.object_class_id, + f.object_class, + f.geometry_type, + COUNT(*) AS feature_count, + COUNT(DISTINCT f.cell_id) AS cell_count, + MIN(f.native_scale) AS min_native_scale, + MAX(f.native_scale) AS max_native_scale, + SUM(CASE WHEN f.geometry_repaired=1 THEN 1 ELSE 0 END) + AS repaired_count, + SUM(CASE WHEN f.geometry_issue IS NOT NULL THEN 1 ELSE 0 END) + AS issue_count + FROM chart_feature f + WHERE {bbox_where} + GROUP BY + f.object_class_id, + f.object_class, + f.geometry_type + ORDER BY + feature_count DESC, + f.object_class, + f.geometry_type + """, + bbox_params, + ) + + object_dict = { + int(r["object_class_id"]): r + for r in fetchall( + cur, + """ + SELECT + object_class_id, + object_class, + geometry_code, + display_code, + description, + raw_line + FROM chart_dictionary_object + WHERE dataset_id=%s + """, + (a.dataset_id,), + ) + } + + for row in class_summary: + oid = row.get("object_class_id") + d = object_dict.get(int(oid)) if oid is not None else None + row["dictionary_geometry_code"] = ( + d.get("geometry_code") if d else None + ) + row["dictionary_display_code"] = ( + d.get("display_code") if d else None + ) + row["description"] = ( + d.get("description") if d else None + ) + + write_csv( + outdir / "对象类别汇总_v1.csv", + class_summary, + ) + + scale_summary = fetchall( + cur, + f""" + SELECT + f.object_class_id, + f.object_class, + f.geometry_type, + f.scale_code, + f.native_scale, + COUNT(*) AS feature_count + FROM chart_feature f + WHERE {bbox_where} + GROUP BY + f.object_class_id, + f.object_class, + f.geometry_type, + f.scale_code, + f.native_scale + ORDER BY + f.object_class, + f.geometry_type, + f.native_scale + """, + bbox_params, + ) + write_csv( + outdir / "对象类别尺度分布_v1.csv", + scale_summary, + ) + + print("[3/8] 属性字段 / 值域统计 ...") + + attr_rows = fetchall( + cur, + f""" + SELECT + f.object_class_id, + f.object_class, + f.geometry_type, + f.native_scale, + a.attribute_id, + a.attribute_name, + a.value_type, + a.value_int, + a.value_real, + a.value_text, + a.value_json + FROM chart_feature_attribute a + JOIN chart_feature f ON f.id=a.feature_id + WHERE {bbox_where} + ORDER BY + f.object_class, + f.geometry_type, + a.attribute_name + """, + bbox_params, + ) + + attr_stats: dict[ + tuple[Any, ...], + dict[str, Any], + ] = {} + attr_value_counts: dict[ + tuple[Any, ...], + Counter[str], + ] = defaultdict(Counter) + attr_scale_values: dict[ + tuple[Any, ...], + set[int], + ] = defaultdict(set) + + for row in attr_rows: + key = ( + row["object_class_id"], + row["object_class"], + row["geometry_type"], + row["attribute_id"], + row["attribute_name"], + row["value_type"], + ) + if key not in attr_stats: + attr_stats[key] = { + "object_class_id": row["object_class_id"], + "object_class": row["object_class"], + "geometry_type": row["geometry_type"], + "attribute_id": row["attribute_id"], + "attribute_name": row["attribute_name"], + "value_type": row["value_type"], + "occurrence_count": 0, + } + + attr_stats[key]["occurrence_count"] += 1 + attr_scale_values[key].add(int(row["native_scale"])) + + value = normalized_attr_value(row) + attr_value_counts[key][stable_value_text(value)] += 1 + + attr_summary_rows = [] + attr_value_rows = [] + + for key, info in attr_stats.items(): + values = attr_value_counts[key] + info = dict(info) + info["distinct_value_count"] = len(values) + info["native_scales"] = sorted(attr_scale_values[key]) + info["top_values"] = [ + { + "value": value, + "count": count, + } + for value, count + in values.most_common(a.value_sample_limit) + ] + attr_summary_rows.append(info) + + for rank, (value, count) in enumerate( + values.most_common(a.value_sample_limit), + start=1, + ): + attr_value_rows.append({ + "object_class_id": key[0], + "object_class": key[1], + "geometry_type": key[2], + "attribute_id": key[3], + "attribute_name": key[4], + "value_type": key[5], + "rank": rank, + "value": value, + "count": count, + "total_distinct_values": len(values), + }) + + attr_summary_rows.sort( + key=lambda r: ( + str(r["object_class"]), + str(r["geometry_type"]), + str(r["attribute_name"]), + ) + ) + + write_csv( + outdir / "属性字段汇总_v1.csv", + attr_summary_rows, + ) + write_csv( + outdir / "属性值域汇总_v1.csv", + attr_value_rows, + ) + + print("[4/8] Feature 样本 / attributes_json ...") + + sample_rows = fetchall( + cur, + f""" + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class_id, + f.object_class, + f.geometry_type, + f.scale_code, + f.native_scale, + f.raw_geotype, + f.coverage_id, + f.bbox_min_lon, + f.bbox_min_lat, + f.bbox_max_lon, + f.bbox_max_lat, + f.attributes_json, + f.geometry_repaired, + f.geometry_issue + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE {bbox_where} + ORDER BY + f.object_class, + f.geometry_type, + f.native_scale, + c.source_relative_path, + f.source_record_index + """, + bbox_params, + ) + + class_seen: Counter[tuple[str, str]] = Counter() + selected_samples: list[dict[str, Any]] = [] + selected_feature_ids: set[int] = set() + + for row in sample_rows: + key = ( + str(row["object_class"]), + str(row["geometry_type"]), + ) + if class_seen[key] >= a.sample_per_class: + continue + + class_seen[key] += 1 + + attrs = json_obj(row.pop("attributes_json")) + row["attributes"] = attrs + row["suggested_source_id"] = suggested_source_id( + a.dataset_id, + str(row["source_relative_path"]), + int(row["source_record_index"]), + str(row["geometry_type"]), + ) + selected_samples.append(row) + selected_feature_ids.add(int(row["feature_id"])) + + with ( + outdir / "AOI_Feature样本_v1.jsonl" + ).open("w", encoding="utf-8") as f: + for row in selected_samples: + f.write( + json.dumps( + row, + ensure_ascii=False, + default=str, + ) + + "\n" + ) + + print("[5/8] 关联对象样本 ...") + + # 从样本里的 _cm93_related_indices 追踪同 Cell Feature, + # 仅作为 mapping 调查辅助;不假设关系方向。 + related_keys: set[tuple[int, int]] = set() + + for row in selected_samples: + attrs = row.get("attributes") or {} + related = attrs.get("_cm93_related_indices") + if not isinstance(related, list): + continue + + for value in related: + try: + related_keys.add( + ( + int(row["cell_id"]), + int(value), + ) + ) + except Exception: + continue + + related_rows: list[dict[str, Any]] = [] + + # AOI 样本量有限,按 key 查询,避免构造超长 SQL IN。 + for cell_id, source_index in sorted(related_keys): + rows = fetchall( + cur, + """ + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class_id, + f.object_class, + f.geometry_type, + f.scale_code, + f.native_scale, + f.raw_geotype, + f.attributes_json + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.cell_id=%s + AND f.source_record_index=%s + LIMIT 1 + """, + ( + a.dataset_id, + cell_id, + source_index, + ), + ) + if not rows: + continue + row = rows[0] + row["attributes"] = json_obj( + row.pop("attributes_json") + ) + row["suggested_source_id"] = suggested_source_id( + a.dataset_id, + str(row["source_relative_path"]), + int(row["source_record_index"]), + str(row["geometry_type"]), + ) + related_rows.append(row) + + with ( + outdir / "AOI_关联对象样本_v1.jsonl" + ).open("w", encoding="utf-8") as f: + for row in related_rows: + f.write( + json.dumps( + row, + ensure_ascii=False, + default=str, + ) + + "\n" + ) + + print("[6/8] Dictionary 子集 ...") + + seen_object_ids = { + int(r["object_class_id"]) + for r in class_summary + if r.get("object_class_id") is not None + } + object_dict_rows = [ + object_dict[oid] + for oid in sorted(seen_object_ids) + if oid in object_dict + ] + write_csv( + outdir / "对象字典_v1.csv", + object_dict_rows, + ) + + seen_attr_ids = { + int(r["attribute_id"]) + for r in attr_summary_rows + if r.get("attribute_id") is not None + } + + all_attr_dict = fetchall( + cur, + """ + SELECT + attribute_id, + attribute_name, + source_type_name, + decoder_type, + min_value, + max_value, + raw_line + FROM chart_dictionary_attribute + WHERE dataset_id=%s + ORDER BY attribute_id + """, + (a.dataset_id,), + ) + attr_dict_rows = [ + r + for r in all_attr_dict + if int(r["attribute_id"]) in seen_attr_ids + ] + write_csv( + outdir / "属性字典_v1.csv", + attr_dict_rows, + ) + + print("[7/8] NavSea mapping 准备表 ...") + + attrs_by_class: dict[ + tuple[Any, Any, Any], + list[str], + ] = defaultdict(list) + + for row in attr_summary_rows: + ckey = ( + row["object_class_id"], + row["object_class"], + row["geometry_type"], + ) + attrs_by_class[ckey].append( + str(row["attribute_name"]) + ) + + mapping_prepare = [] + + for row in class_summary: + key = ( + row["object_class_id"], + row["object_class"], + row["geometry_type"], + ) + mapping_prepare.append({ + "cm95_object_class_id": row["object_class_id"], + "cm95_object_class": row["object_class"], + "cm95_description": row.get("description"), + "geometry_type": row["geometry_type"], + "aoi_feature_count": row["feature_count"], + "aoi_cell_count": row["cell_count"], + "min_native_scale": row["min_native_scale"], + "max_native_scale": row["max_native_scale"], + "available_attributes": sorted( + set(attrs_by_class.get(key, [])) + ), + "target_source_layer": "", + "canonical_family": "", + "canonical_object_type": "", + "chart_render_type": "", + "safety_class": "", + "mapping_status": "UNMAPPED", + "notes": "", + }) + + write_csv( + outdir / "AOI_对象映射准备表_v1.csv", + mapping_prepare, + ) + + print("[8/8] 汇总 ...") + + spatial_feature_count = int( + scalar( + cur, + f""" + SELECT COUNT(*) + FROM chart_feature f + WHERE {bbox_where} + """, + bbox_params, + ) + or 0 + ) + + geometry_counts = fetchall( + cur, + f""" + SELECT + f.geometry_type, + COUNT(*) AS feature_count + FROM chart_feature f + WHERE {bbox_where} + GROUP BY f.geometry_type + ORDER BY f.geometry_type + """, + bbox_params, + ) + + report.update({ + "warnings": warnings, + "counts": { + "aoi_cells": len(cells), + "aoi_spatial_features": spatial_feature_count, + "object_class_geometry_groups": len(class_summary), + "attribute_group_count": len(attr_summary_rows), + "sample_feature_count": len(selected_samples), + "related_sample_count": len(related_rows), + }, + "geometry_counts": geometry_counts, + "object_classes": [ + { + "object_class_id": r["object_class_id"], + "object_class": r["object_class"], + "geometry_type": r["geometry_type"], + "feature_count": r["feature_count"], + "description": r.get("description"), + } + for r in class_summary + ], + "next_step": ( + "Use AOI_对象映射准备表_v1.csv + 属性值域汇总_v1.csv " + "to author cm95_to_navsea_v1.yaml." + ), + }) + + conn.rollback() + + finally: + conn.close() + + ( + outdir / "AOI报告_v1.json" + ).write_text( + json.dumps( + report, + ensure_ascii=False, + indent=2, + default=str, + ), + encoding="utf-8", + ) + + lines = [ + "CM95 选定 AOI → NavSea PBF 映射输入审计 v2", + "=" * 84, + f"Dataset ID : {a.dataset_id}", + f"Tile : z{a.z}/{a.x}/{a.y}", + ( + "BBox WGS84 : " + f"{lon_min:.10f},{lat_min:.10f} " + f"→ {lon_max:.10f},{lat_max:.10f}" + ), + "", + f"AOI cells : {report['counts']['aoi_cells']}", + f"AOI spatial features : {report['counts']['aoi_spatial_features']}", + ( + "Object class/geom groups : " + f"{report['counts']['object_class_geometry_groups']}" + ), + ( + "Attribute groups : " + f"{report['counts']['attribute_group_count']}" + ), + f"Feature samples : {report['counts']['sample_feature_count']}", + f"Related samples : {report['counts']['related_sample_count']}", + "", + "Geometry counts:", + ] + + for row in report["geometry_counts"]: + lines.append( + f" {str(row['geometry_type']):10s} " + f"{int(row['feature_count'])}" + ) + + lines += [ + "", + "NEXT:", + " 上传本脚本生成的 ZIP。", + " 下一步直接生成 cm95_to_navsea_v1.yaml 初版并标注 UNMAPPED / hard_gate 缺口。", + ] + + summary = "\n".join(lines) + ( + outdir / "摘要_v1.txt" + ).write_text(summary, encoding="utf-8") + + zip_path = outdir.with_suffix(".zip") + with zipfile.ZipFile( + zip_path, + "w", + compression=zipfile.ZIP_DEFLATED, + ) as zf: + for p in sorted(outdir.rglob("*")): + if p.is_file(): + zf.write( + p, + p.relative_to(outdir.parent), + ) + + print("") + print(summary) + print("") + print(f"报告目录: {outdir}") + print(f"报告 ZIP : {zip_path}") + print("把 ZIP 上传给 ChatGPT。") + + +if __name__ == "__main__": + main() diff --git a/cm95_pbf_aoi_candidates_v1.csv b/cm95_pbf_aoi_candidates_v1.csv new file mode 100644 index 0000000..249d807 --- /dev/null +++ b/cm95_pbf_aoi_candidates_v1.csv @@ -0,0 +1,41 @@ +rank,score,z,x,y,tile_path,center_lon,center_lat,min_lon,min_lat,max_lon,max_lat,feature_count,detail_feature_count_le_50000,required_groups_present,land_count,depth_count,contour_count,navmark_light_count,hazard_count,point_count,line_count,area_count,top_classes,native_scales +1,6121875,10,887,375,10/887/375.pbf,132.01171875,43.19703272708128,131.8359375,43.06888777416962,132.1875,43.32517767999295,4475,3674,5,818,366,390,191,856,1373,2039,1050,"[{""class"": ""COALNE"", ""count"": 457}, {""class"": ""UWTROC"", ""count"": 440}, {""class"": ""DEPCNT"", ""count"": 390}, {""class"": ""DEPARE"", ""count"": 366}, {""class"": ""SLCONS"", ""count"": 284}, {""class"": ""RIVERS"", ""count"": 229}, {""class"": ""_texto"", ""count"": 169}, {""class"": ""SBDARE"", ""count"": 164}, {""class"": ""OBSTRN"", ""count"": 158}, {""class"": ""LNDELV"", ""count"": 132}, {""class"": ""SLOTOP"", ""count"": 132}, {""class"": ""ROADPT"", ""count"": 130}, {""class"": ""RIVBNK"", ""count"": 103}, {""class"": ""BRTFAC"", ""count"": 94}, {""class"": ""LNDARE"", ""count"": 77}]","[{""scale"": 7500, ""count"": 536}, {""scale"": 20000, ""count"": 1418}, {""scale"": 50000, ""count"": 1720}, {""scale"": 100000, ""count"": 650}, {""scale"": 200000, ""count"": 130}, {""scale"": 1000000, ""count"": 20}, {""scale"": 3000000, ""count"": 1}]" +2,6104723,10,890,377,10/890/377.pbf,133.06640625,42.682301017026845,132.890625,42.553080288955805,133.2421875,42.811521745097885,4323,3504,5,529,401,378,283,1493,2018,1251,1043,"[{""class"": ""UWTROC"", ""count"": 1140}, {""class"": ""DEPARE"", ""count"": 401}, {""class"": ""DEPCNT"", ""count"": 378}, {""class"": ""COALNE"", ""count"": 350}, {""class"": ""SBDARE"", ""count"": 203}, {""class"": ""SLOTOP"", ""count"": 137}, {""class"": ""LIGHTS"", ""count"": 132}, {""class"": ""SLCONS"", ""count"": 109}, {""class"": ""_texto"", ""count"": 104}, {""class"": ""SLOGRD"", ""count"": 98}, {""class"": ""OBSTRN"", ""count"": 81}, {""class"": ""BUISGL"", ""count"": 72}, {""class"": ""LNDARE"", ""count"": 70}, {""class"": ""ROADPT"", ""count"": 62}, {""class"": ""TOPMAR"", ""count"": 60}]","[{""scale"": 7500, ""count"": 881}, {""scale"": 20000, ""count"": 1443}, {""scale"": 50000, ""count"": 1180}, {""scale"": 100000, ""count"": 668}, {""scale"": 200000, ""count"": 112}, {""scale"": 1000000, ""count"": 39}]" +3,6076644,10,914,385,10/914/385.pbf,141.50390625,40.580451442943264,141.328125,40.44694705960049,141.6796875,40.71395582628604,3544,3231,5,647,401,441,132,1062,1632,952,956,"[{""class"": ""WRECKS"", ""count"": 481}, {""class"": ""DEPCNT"", ""count"": 441}, {""class"": ""DEPARE"", ""count"": 401}, {""class"": ""SLCONS"", ""count"": 328}, {""class"": ""SBDARE"", ""count"": 296}, {""class"": ""UWTROC"", ""count"": 176}, {""class"": ""COALNE"", ""count"": 165}, {""class"": ""LNDARE"", ""count"": 154}, {""class"": ""_texto"", ""count"": 113}, {""class"": ""LIGHTS"", ""count"": 96}, {""class"": ""BRTFAC"", ""count"": 89}, {""class"": ""ZEMCNT"", ""count"": 83}, {""class"": ""OBSTRN"", ""count"": 76}, {""class"": ""ITDARE"", ""count"": 68}, {""class"": ""TNKCON"", ""count"": 57}]","[{""scale"": 20000, ""count"": 2239}, {""scale"": 50000, ""count"": 992}, {""scale"": 100000, ""count"": 1}, {""scale"": 200000, ""count"": 278}, {""scale"": 1000000, ""count"": 33}, {""scale"": 3000000, ""count"": 1}]" +4,6023900,10,884,377,10/884/377.pbf,130.95703125,42.682301017026845,130.78125,42.553080288955805,131.1328125,42.811521745097885,3900,2700,5,588,244,227,85,1252,1616,1359,912,"[{""class"": ""UWTROC"", ""count"": 953}, {""class"": ""COALNE"", ""count"": 497}, {""class"": ""DEPARE"", ""count"": 244}, {""class"": ""DEPCNT"", ""count"": 227}, {""class"": ""SBDARE"", ""count"": 197}, {""class"": ""SLOTOP"", ""count"": 183}, {""class"": ""RIVERS"", ""count"": 147}, {""class"": ""LNDRGN"", ""count"": 138}, {""class"": ""_texto"", ""count"": 123}, {""class"": ""SLOGRD"", ""count"": 114}, {""class"": ""WEDKLP"", ""count"": 111}, {""class"": ""RIVBNK"", ""count"": 107}, {""class"": ""ROADPT"", ""count"": 76}, {""class"": ""LNDELV"", ""count"": 75}, {""class"": ""LNDARE"", ""count"": 57}]","[{""scale"": 7500, ""count"": 380}, {""scale"": 20000, ""count"": 2320}, {""scale"": 100000, ""count"": 1051}, {""scale"": 200000, ""count"": 125}, {""scale"": 1000000, ""count"": 24}]" +5,5997990,10,911,351,10/911/351.pbf,140.44921875,49.03773445996431,140.2734375,48.92249926375824,140.625,49.15296965617039,3190,2448,5,425,194,182,171,1106,1506,944,730,"[{""class"": ""UWTROC"", ""count"": 871}, {""class"": ""COALNE"", ""count"": 343}, {""class"": ""DEPARE"", ""count"": 194}, {""class"": ""DEPCNT"", ""count"": 182}, {""class"": ""SLOTOP"", ""count"": 148}, {""class"": ""_texto"", ""count"": 146}, {""class"": ""SBDARE"", ""count"": 116}, {""class"": ""SLOGRD"", ""count"": 85}, {""class"": ""BUAARE"", ""count"": 76}, {""class"": ""BCNSPP"", ""count"": 70}, {""class"": ""OBSTRN"", ""count"": 57}, {""class"": ""LNDELV"", ""count"": 55}, {""class"": ""RIVERS"", ""count"": 55}, {""class"": ""SEAARE"", ""count"": 52}, {""class"": ""LIGHTS"", ""count"": 51}]","[{""scale"": 20000, ""count"": 1220}, {""scale"": 50000, ""count"": 1228}, {""scale"": 100000, ""count"": 534}, {""scale"": 200000, ""count"": 176}, {""scale"": 1000000, ""count"": 31}, {""scale"": 3000000, ""count"": 1}]" +6,5954428,10,912,381,10/912/381.pbf,140.80078125,41.6399444886017,140.625,41.50857729743934,140.9765625,41.77131167976407,2228,2022,5,408,160,190,78,622,907,732,581,"[{""class"": ""UWTROC"", ""count"": 326}, {""class"": ""SBDARE"", ""count"": 216}, {""class"": ""SLCONS"", ""count"": 204}, {""class"": ""ZEMCNT"", ""count"": 198}, {""class"": ""ITDARE"", ""count"": 195}, {""class"": ""DEPCNT"", ""count"": 190}, {""class"": ""DEPARE"", ""count"": 160}, {""class"": ""COALNE"", ""count"": 112}, {""class"": ""LNDARE"", ""count"": 92}, {""class"": ""_texto"", ""count"": 79}, {""class"": ""TOWERS"", ""count"": 46}, {""class"": ""OBSTRN"", ""count"": 40}, {""class"": ""LIGHTS"", ""count"": 38}, {""class"": ""BUISGL"", ""count"": 35}, {""class"": ""BUAARE"", ""count"": 32}]","[{""scale"": 20000, ""count"": 903}, {""scale"": 50000, ""count"": 1119}, {""scale"": 200000, ""count"": 189}, {""scale"": 1000000, ""count"": 17}]" +7,5951203,10,856,384,10/856/384.pbf,121.11328125,40.84692694795308,120.9375,40.71395582628604,121.2890625,40.97989806962013,2303,1989,5,454,294,299,354,348,746,711,840,"[{""class"": ""SLCONS"", ""count"": 347}, {""class"": ""DEPCNT"", ""count"": 299}, {""class"": ""DEPARE"", ""count"": 294}, {""class"": ""SBDARE"", ""count"": 239}, {""class"": ""LIGHTS"", ""count"": 134}, {""class"": ""TOPMAR"", ""count"": 102}, {""class"": ""ITDARE"", ""count"": 92}, {""class"": ""ZEMCNT"", ""count"": 73}, {""class"": ""BOYLAT"", ""count"": 67}, {""class"": ""UWTROC"", ""count"": 63}, {""class"": ""$LINES"", ""count"": 60}, {""class"": ""COALNE"", ""count"": 58}, {""class"": ""_texto"", ""count"": 50}, {""class"": ""LNDARE"", ""count"": 49}, {""class"": ""LAKSHR"", ""count"": 41}]","[{""scale"": 20000, ""count"": 1042}, {""scale"": 50000, ""count"": 947}, {""scale"": 100000, ""count"": 206}, {""scale"": 200000, ""count"": 93}, {""scale"": 1000000, ""count"": 14}, {""scale"": 3000000, ""count"": 1}]" +8,5926940,10,887,376,10/887/376.pbf,132.01171875,42.94020475963375,131.8359375,42.811521745097885,132.1875,43.06888777416962,2340,1746,5,501,134,209,133,767,1089,714,534,"[{""class"": ""UWTROC"", ""count"": 544}, {""class"": ""COALNE"", ""count"": 303}, {""class"": ""DEPCNT"", ""count"": 209}, {""class"": ""LNDARE"", ""count"": 160}, {""class"": ""DEPARE"", ""count"": 134}, {""class"": ""SBDARE"", ""count"": 128}, {""class"": ""_texto"", ""count"": 102}, {""class"": ""OBSTRN"", ""count"": 59}, {""class"": ""LIGHTS"", ""count"": 49}, {""class"": ""SLOTOP"", ""count"": 40}, {""class"": ""SLCONS"", ""count"": 38}, {""class"": ""RESARE"", ""count"": 35}, {""class"": ""BCNSPP"", ""count"": 31}, {""class"": ""SLOGRD"", ""count"": 30}, {""class"": ""SEAARE"", ""count"": 28}]","[{""scale"": 7500, ""count"": 1}, {""scale"": 20000, ""count"": 718}, {""scale"": 50000, ""count"": 1027}, {""scale"": 100000, ""count"": 474}, {""scale"": 200000, ""count"": 78}, {""scale"": 1000000, ""count"": 38}, {""scale"": 3000000, ""count"": 2}, {""scale"": 20000000, ""count"": 2}]" +9,5925129,10,892,376,10/892/376.pbf,133.76953125,42.94020475963375,133.59375,42.811521745097885,133.9453125,43.06888777416962,2329,1728,5,393,73,67,31,734,865,936,522,"[{""class"": ""UWTROC"", ""count"": 566}, {""class"": ""COALNE"", ""count"": 326}, {""class"": ""RIVERS"", ""count"": 207}, {""class"": ""RIVBNK"", ""count"": 120}, {""class"": ""SBDARE"", ""count"": 119}, {""class"": ""SLOTOP"", ""count"": 93}, {""class"": ""LNDRGN"", ""count"": 88}, {""class"": ""ZEMCNT"", ""count"": 81}, {""class"": ""DEPARE"", ""count"": 73}, {""class"": ""SLOGRD"", ""count"": 72}, {""class"": ""ITDARE"", ""count"": 69}, {""class"": ""DEPCNT"", ""count"": 67}, {""class"": ""LNDELV"", ""count"": 60}, {""class"": ""LNDARE"", ""count"": 55}, {""class"": ""_texto"", ""count"": 54}]","[{""scale"": 20000, ""count"": 1728}, {""scale"": 100000, ""count"": 466}, {""scale"": 200000, ""count"": 114}, {""scale"": 1000000, ""count"": 21}]" +10,5913497,10,885,376,10/885/376.pbf,131.30859375,42.94020475963375,131.1328125,42.811521745097885,131.484375,43.06888777416962,2397,1611,5,357,88,91,50,678,887,1039,471,"[{""class"": ""UWTROC"", ""count"": 559}, {""class"": ""COALNE"", ""count"": 278}, {""class"": ""RIVERS"", ""count"": 240}, {""class"": ""SLOTOP"", ""count"": 119}, {""class"": ""DEPCNT"", ""count"": 91}, {""class"": ""DEPARE"", ""count"": 88}, {""class"": ""RIVBNK"", ""count"": 84}, {""class"": ""SLOGRD"", ""count"": 77}, {""class"": ""SBDARE"", ""count"": 74}, {""class"": ""ROADPT"", ""count"": 73}, {""class"": ""LAKSHR"", ""count"": 64}, {""class"": ""LNDELV"", ""count"": 60}, {""class"": ""VEGARE"", ""count"": 60}, {""class"": ""_texto"", ""count"": 59}, {""class"": ""LNDARE"", ""count"": 50}]","[{""scale"": 20000, ""count"": 1}, {""scale"": 50000, ""count"": 1610}, {""scale"": 100000, ""count"": 643}, {""scale"": 200000, ""count"": 110}, {""scale"": 1000000, ""count"": 33}]" +11,5913112,10,914,377,10/914/377.pbf,141.50390625,42.682301017026845,141.328125,42.553080288955805,141.6796875,42.811521745097885,1712,1614,5,430,162,181,101,232,713,485,510,"[{""class"": ""SLCONS"", ""count"": 277}, {""class"": ""SBDARE"", ""count"": 188}, {""class"": ""DEPCNT"", ""count"": 181}, {""class"": ""DEPARE"", ""count"": 162}, {""class"": ""_texto"", ""count"": 108}, {""class"": ""LNDARE"", ""count"": 95}, {""class"": ""BRTFAC"", ""count"": 79}, {""class"": ""PRDINS"", ""count"": 59}, {""class"": ""COALNE"", ""count"": 58}, {""class"": ""LIGHTS"", ""count"": 57}, {""class"": ""ITDARE"", ""count"": 41}, {""class"": ""TNKCON"", ""count"": 35}, {""class"": ""BUAARE"", ""count"": 33}, {""class"": ""ZEMCNT"", ""count"": 32}, {""class"": ""CHIMNY"", ""count"": 24}]","[{""scale"": 20000, ""count"": 971}, {""scale"": 50000, ""count"": 643}, {""scale"": 200000, ""count"": 84}, {""scale"": 1000000, ""count"": 14}]" +12,5909693,10,912,384,10/912/384.pbf,140.80078125,40.84692694795308,140.625,40.71395582628604,140.9765625,40.97989806962013,1893,1578,5,490,154,166,115,282,656,590,643,"[{""class"": ""SLCONS"", ""count"": 400}, {""class"": ""SBDARE"", ""count"": 229}, {""class"": ""DEPCNT"", ""count"": 166}, {""class"": ""DEPARE"", ""count"": 154}, {""class"": ""RIVBNK"", ""count"": 92}, {""class"": ""_texto"", ""count"": 92}, {""class"": ""ITDARE"", ""count"": 65}, {""class"": ""LIGHTS"", ""count"": 63}, {""class"": ""ZEMCNT"", ""count"": 63}, {""class"": ""BUISGL"", ""count"": 58}, {""class"": ""LNDARE"", ""count"": 57}, {""class"": ""BRIDGE"", ""count"": 56}, {""class"": ""BUAARE"", ""count"": 40}, {""class"": ""COALNE"", ""count"": 33}, {""class"": ""TOWERS"", ""count"": 26}]","[{""scale"": 20000, ""count"": 646}, {""scale"": 50000, ""count"": 932}, {""scale"": 100000, ""count"": 98}, {""scale"": 200000, ""count"": 197}, {""scale"": 1000000, ""count"": 15}, {""scale"": 3000000, ""count"": 3}, {""scale"": 20000000, ""count"": 2}]" +13,5907373,10,896,373,10/896/373.pbf,135.17578125,43.70745881892233,135.0,43.580390855607845,135.3515625,43.83452678223683,2073,1553,5,322,98,81,46,473,653,874,542,"[{""class"": ""UWTROC"", ""count"": 334}, {""class"": ""COALNE"", ""count"": 254}, {""class"": ""RIVERS"", ""count"": 222}, {""class"": ""LNDRGN"", ""count"": 174}, {""class"": ""RIVBNK"", ""count"": 171}, {""class"": ""SBDARE"", ""count"": 100}, {""class"": ""DEPARE"", ""count"": 98}, {""class"": ""DEPCNT"", ""count"": 81}, {""class"": ""LNDELV"", ""count"": 65}, {""class"": ""LNDARE"", ""count"": 64}, {""class"": ""SLOTOP"", ""count"": 63}, {""class"": ""SLOGRD"", ""count"": 52}, {""class"": ""VEGARE"", ""count"": 46}, {""class"": ""LAKSHR"", ""count"": 42}, {""class"": ""_texto"", ""count"": 38}]","[{""scale"": 20000, ""count"": 1553}, {""scale"": 100000, ""count"": 430}, {""scale"": 200000, ""count"": 65}, {""scale"": 1000000, ""count"": 24}, {""scale"": 3000000, ""count"": 1}]" +14,5906071,10,859,385,10/859/385.pbf,122.16796875,40.580451442943264,121.9921875,40.44694705960049,122.34375,40.71395582628604,2171,1539,5,471,224,226,417,112,625,791,747,"[{""class"": ""SLCONS"", ""count"": 342}, {""class"": ""DEPCNT"", ""count"": 226}, {""class"": ""DEPARE"", ""count"": 224}, {""class"": ""LIGHTS"", ""count"": 146}, {""class"": ""TOPMAR"", ""count"": 133}, {""class"": ""ZEMCNT"", ""count"": 127}, {""class"": ""ITDARE"", ""count"": 103}, {""class"": ""SBDARE"", ""count"": 77}, {""class"": ""BOYLAT"", ""count"": 75}, {""class"": ""COALNE"", ""count"": 67}, {""class"": ""LNDARE"", ""count"": 62}, {""class"": ""_texto"", ""count"": 56}, {""class"": ""BCNSPP"", ""count"": 42}, {""class"": ""LAKSHR"", ""count"": 40}, {""class"": ""LAKARE"", ""count"": 38}]","[{""scale"": 20000, ""count"": 936}, {""scale"": 50000, ""count"": 603}, {""scale"": 100000, ""count"": 554}, {""scale"": 200000, ""count"": 71}, {""scale"": 1000000, ""count"": 6}, {""scale"": 3000000, ""count"": 1}]" +15,5905467,10,922,376,10/922/376.pbf,144.31640625,42.94020475963375,144.140625,42.811521745097885,144.4921875,43.06888777416962,2067,1534,5,316,181,188,84,570,930,494,636,"[{""class"": ""SBDARE"", ""count"": 293}, {""class"": ""SLCONS"", ""count"": 228}, {""class"": ""DEPCNT"", ""count"": 188}, {""class"": ""DEPARE"", ""count"": 181}, {""class"": ""UWTROC"", ""count"": 174}, {""class"": ""_texto"", ""count"": 77}, {""class"": ""ITDARE"", ""count"": 74}, {""class"": ""WRECKS"", ""count"": 68}, {""class"": ""ZEMCNT"", ""count"": 60}, {""class"": ""LIGHTS"", ""count"": 57}, {""class"": ""LNDARE"", ""count"": 51}, {""class"": ""BRTFAC"", ""count"": 49}, {""class"": ""BUISGL"", ""count"": 49}, {""class"": ""PRDINS"", ""count"": 47}, {""class"": ""RIVBNK"", ""count"": 39}]","[{""scale"": 20000, ""count"": 1534}, {""scale"": 100000, ""count"": 445}, {""scale"": 200000, ""count"": 84}, {""scale"": 1000000, ""count"": 3}, {""scale"": 3000000, ""count"": 1}]" +16,5899347,10,888,376,10/888/376.pbf,132.36328125,42.94020475963375,132.1875,42.811521745097885,132.5390625,43.06888777416962,2747,1466,5,466,125,153,126,973,1295,940,504,"[{""class"": ""UWTROC"", ""count"": 793}, {""class"": ""COALNE"", ""count"": 393}, {""class"": ""DEPCNT"", ""count"": 153}, {""class"": ""SLOTOP"", ""count"": 143}, {""class"": ""DEPARE"", ""count"": 125}, {""class"": ""RIVERS"", ""count"": 125}, {""class"": ""SLOGRD"", ""count"": 116}, {""class"": ""_texto"", ""count"": 116}, {""class"": ""SBDARE"", ""count"": 81}, {""class"": ""LNDELV"", ""count"": 73}, {""class"": ""OBSTRN"", ""count"": 61}, {""class"": ""LIGHTS"", ""count"": 52}, {""class"": ""LNDARE"", ""count"": 49}, {""class"": ""SEAARE"", ""count"": 43}, {""class"": ""BCNSPP"", ""count"": 41}]","[{""scale"": 7500, ""count"": 374}, {""scale"": 50000, ""count"": 1092}, {""scale"": 100000, ""count"": 1056}, {""scale"": 200000, ""count"": 169}, {""scale"": 1000000, ""count"": 54}, {""scale"": 3000000, ""count"": 2}]" +17,5898662,10,926,374,10/926/374.pbf,145.72265625,43.452784267800396,145.546875,43.32517767999295,145.8984375,43.580390855607845,2562,1461,5,402,270,313,65,684,837,862,852,"[{""class"": ""UWTROC"", ""count"": 353}, {""class"": ""DEPCNT"", ""count"": 313}, {""class"": ""DEPARE"", ""count"": 270}, {""class"": ""ZEMCNT"", ""count"": 261}, {""class"": ""SBDARE"", ""count"": 228}, {""class"": ""ITDARE"", ""count"": 218}, {""class"": ""COALNE"", ""count"": 168}, {""class"": ""LNDARE"", ""count"": 129}, {""class"": ""_texto"", ""count"": 111}, {""class"": ""SLCONS"", ""count"": 105}, {""class"": ""OBSTRN"", ""count"": 77}, {""class"": ""LIGHTS"", ""count"": 60}, {""class"": ""TOWERS"", ""count"": 31}, {""class"": ""BUAARE"", ""count"": 30}, {""class"": ""$LINES"", ""count"": 24}]","[{""scale"": 20000, ""count"": 522}, {""scale"": 50000, ""count"": 939}, {""scale"": 100000, ""count"": 954}, {""scale"": 200000, ""count"": 133}, {""scale"": 1000000, ""count"": 13}, {""scale"": 3000000, ""count"": 1}]" +18,5894691,10,888,375,10/888/375.pbf,132.36328125,43.19703272708128,132.1875,43.06888777416962,132.5390625,43.32517767999295,2091,1426,5,281,61,66,49,695,885,880,321,"[{""class"": ""UWTROC"", ""count"": 565}, {""class"": ""COALNE"", ""count"": 243}, {""class"": ""RIVERS"", ""count"": 209}, {""class"": ""RIVBNK"", ""count"": 113}, {""class"": ""SBDARE"", ""count"": 95}, {""class"": ""SLOTOP"", ""count"": 86}, {""class"": ""LNDELV"", ""count"": 78}, {""class"": ""DEPCNT"", ""count"": 66}, {""class"": ""SLOGRD"", ""count"": 64}, {""class"": ""_texto"", ""count"": 62}, {""class"": ""DEPARE"", ""count"": 61}, {""class"": ""ROADPT"", ""count"": 53}, {""class"": ""RAILWY"", ""count"": 30}, {""class"": ""ZEMCNT"", ""count"": 27}, {""class"": ""LNDRGN"", ""count"": 26}]","[{""scale"": 7500, ""count"": 89}, {""scale"": 50000, ""count"": 1337}, {""scale"": 100000, ""count"": 538}, {""scale"": 200000, ""count"": 101}, {""scale"": 1000000, ""count"": 26}]" +19,5886280,10,889,377,10/889/377.pbf,132.71484375,42.682301017026845,132.5390625,42.553080288955805,132.890625,42.811521745097885,1680,1346,5,252,171,169,33,543,653,610,411,"[{""class"": ""UWTROC"", ""count"": 390}, {""class"": ""DEPARE"", ""count"": 171}, {""class"": ""DEPCNT"", ""count"": 169}, {""class"": ""SLCONS"", ""count"": 137}, {""class"": ""COALNE"", ""count"": 102}, {""class"": ""BRTFAC"", ""count"": 95}, {""class"": ""SBDARE"", ""count"": 88}, {""class"": ""_texto"", ""count"": 46}, {""class"": ""OBSTRN"", ""count"": 37}, {""class"": ""SLOGRD"", ""count"": 35}, {""class"": ""SLOTOP"", ""count"": 34}, {""class"": ""ROADPT"", ""count"": 33}, {""class"": ""BUAARE"", ""count"": 27}, {""class"": ""CBLSUB"", ""count"": 25}, {""class"": ""SEAARE"", ""count"": 22}]","[{""scale"": 7500, ""count"": 396}, {""scale"": 20000, ""count"": 425}, {""scale"": 50000, ""count"": 525}, {""scale"": 100000, ""count"": 284}, {""scale"": 200000, ""count"": 32}, {""scale"": 1000000, ""count"": 18}]" +20,5884667,10,911,350,10/911/350.pbf,140.44921875,49.26767122158997,140.2734375,49.15296965617039,140.625,49.38237278700955,1867,1328,5,231,75,70,48,509,638,813,410,"[{""class"": ""UWTROC"", ""count"": 367}, {""class"": ""RIVBNK"", ""count"": 258}, {""class"": ""COALNE"", ""count"": 193}, {""class"": ""SBDARE"", ""count"": 119}, {""class"": ""SLOTOP"", ""count"": 119}, {""class"": ""VEGARE"", ""count"": 92}, {""class"": ""DEPARE"", ""count"": 75}, {""class"": ""DEPCNT"", ""count"": 70}, {""class"": ""RIVERS"", ""count"": 65}, {""class"": ""LNDRGN"", ""count"": 61}, {""class"": ""_texto"", ""count"": 53}, {""class"": ""LNDARE"", ""count"": 37}, {""class"": ""ZEMCNT"", ""count"": 37}, {""class"": ""LAKSHR"", ""count"": 33}, {""class"": ""ITDARE"", ""count"": 30}]","[{""scale"": 20000, ""count"": 706}, {""scale"": 50000, ""count"": 622}, {""scale"": 100000, ""count"": 366}, {""scale"": 200000, ""count"": 149}, {""scale"": 1000000, ""count"": 24}]" +21,5883660,10,914,372,10/914/372.pbf,141.50390625,43.961055905241,141.328125,43.83452678223683,141.6796875,44.087585028245165,1560,1321,5,362,230,253,54,280,479,559,517,"[{""class"": ""DEPCNT"", ""count"": 253}, {""class"": ""DEPARE"", ""count"": 230}, {""class"": ""SLCONS"", ""count"": 191}, {""class"": ""SBDARE"", ""count"": 188}, {""class"": ""COALNE"", ""count"": 107}, {""class"": ""LNDARE"", ""count"": 64}, {""class"": ""UWTROC"", ""count"": 60}, {""class"": ""_texto"", ""count"": 54}, {""class"": ""ZEMCNT"", ""count"": 52}, {""class"": ""ITDARE"", ""count"": 44}, {""class"": ""LIGHTS"", ""count"": 43}, {""class"": ""TOWERS"", ""count"": 29}, {""class"": ""BUAARE"", ""count"": 23}, {""class"": ""BRTFAC"", ""count"": 22}, {""class"": ""BUISGL"", ""count"": 21}]","[{""scale"": 7500, ""count"": 616}, {""scale"": 20000, ""count"": 705}, {""scale"": 100000, ""count"": 107}, {""scale"": 200000, ""count"": 123}, {""scale"": 1000000, ""count"": 8}, {""scale"": 3000000, ""count"": 1}]" +22,5881827,10,910,351,10/910/351.pbf,140.09765625,49.03773445996431,139.921875,48.92249926375824,140.2734375,49.15296965617039,1627,1302,5,280,42,40,37,207,415,737,471,"[{""class"": ""COALNE"", ""count"": 209}, {""class"": ""RIVBNK"", ""count"": 138}, {""class"": ""BUAARE"", ""count"": 111}, {""class"": ""UWTROC"", ""count"": 98}, {""class"": ""SLOTOP"", ""count"": 78}, {""class"": ""RAILWY"", ""count"": 76}, {""class"": ""VEGARE"", ""count"": 70}, {""class"": ""_texto"", ""count"": 60}, {""class"": ""ROADPT"", ""count"": 56}, {""class"": ""LNDELV"", ""count"": 55}, {""class"": ""RIVERS"", ""count"": 55}, {""class"": ""LNDARE"", ""count"": 54}, {""class"": ""SBDARE"", ""count"": 51}, {""class"": ""WEDKLP"", ""count"": 51}, {""class"": ""DEPARE"", ""count"": 42}]","[{""scale"": 20000, ""count"": 730}, {""scale"": 50000, ""count"": 572}, {""scale"": 100000, ""count"": 244}, {""scale"": 200000, ""count"": 78}, {""scale"": 1000000, ""count"": 3}]" +23,5875328,10,912,380,10/912/380.pbf,140.80078125,41.90214300610273,140.625,41.77131167976407,140.9765625,42.03297433244139,1528,1238,5,268,119,125,160,334,751,402,372,"[{""class"": ""SLCONS"", ""count"": 220}, {""class"": ""SBDARE"", ""count"": 166}, {""class"": ""DEPCNT"", ""count"": 125}, {""class"": ""DEPARE"", ""count"": 119}, {""class"": ""WRECKS"", ""count"": 99}, {""class"": ""LIGHTS"", ""count"": 91}, {""class"": ""_texto"", ""count"": 77}, {""class"": ""BUAARE"", ""count"": 43}, {""class"": ""BRIDGE"", ""count"": 41}, {""class"": ""BUISGL"", ""count"": 41}, {""class"": ""RIVBNK"", ""count"": 34}, {""class"": ""UWTROC"", ""count"": 32}, {""class"": ""COALNE"", ""count"": 29}, {""class"": ""BOYSPP"", ""count"": 25}, {""class"": ""OBSTRN"", ""count"": 23}]","[{""scale"": 20000, ""count"": 922}, {""scale"": 50000, ""count"": 316}, {""scale"": 100000, ""count"": 126}, {""scale"": 200000, ""count"": 150}, {""scale"": 1000000, ""count"": 13}, {""scale"": 3000000, ""count"": 1}]" +24,5866952,10,915,377,10/915/377.pbf,141.85546875,42.682301017026845,141.6796875,42.553080288955805,142.03125,42.811521745097885,1252,1157,5,219,158,168,154,207,501,379,366,"[{""class"": ""DEPCNT"", ""count"": 168}, {""class"": ""DEPARE"", ""count"": 158}, {""class"": ""SBDARE"", ""count"": 139}, {""class"": ""SLCONS"", ""count"": 135}, {""class"": ""LIGHTS"", ""count"": 80}, {""class"": ""WRECKS"", ""count"": 45}, {""class"": ""LNDARE"", ""count"": 43}, {""class"": ""COALNE"", ""count"": 41}, {""class"": ""ZEMCNT"", ""count"": 37}, {""class"": ""ITDARE"", ""count"": 32}, {""class"": ""RIVBNK"", ""count"": 27}, {""class"": ""_texto"", ""count"": 27}, {""class"": ""BRTFAC"", ""count"": 25}, {""class"": ""BOYSPP"", ""count"": 23}, {""class"": ""_extgn"", ""count"": 18}]","[{""scale"": 20000, ""count"": 781}, {""scale"": 50000, ""count"": 376}, {""scale"": 200000, ""count"": 88}, {""scale"": 1000000, ""count"": 7}]" +25,5866237,10,886,376,10/886/376.pbf,131.66015625,42.94020475963375,131.484375,42.811521745097885,131.8359375,43.06888777416962,2537,1137,5,521,145,228,69,798,1064,906,558,"[{""class"": ""UWTROC"", ""count"": 561}, {""class"": ""COALNE"", ""count"": 356}, {""class"": ""DEPCNT"", ""count"": 228}, {""class"": ""SBDARE"", ""count"": 179}, {""class"": ""LNDARE"", ""count"": 146}, {""class"": ""DEPARE"", ""count"": 145}, {""class"": ""_texto"", ""count"": 142}, {""class"": ""SLOTOP"", ""count"": 104}, {""class"": ""SLOGRD"", ""count"": 85}, {""class"": ""RIVERS"", ""count"": 54}, {""class"": ""ZEMCNT"", ""count"": 45}, {""class"": ""ITDARE"", ""count"": 43}, {""class"": ""LNDELV"", ""count"": 43}, {""class"": ""OBSTRN"", ""count"": 43}, {""class"": ""SEAARE"", ""count"": 27}]","[{""scale"": 20000, ""count"": 7}, {""scale"": 50000, ""count"": 1130}, {""scale"": 100000, ""count"": 1107}, {""scale"": 200000, ""count"": 179}, {""scale"": 1000000, ""count"": 106}, {""scale"": 3000000, ""count"": 8}]" +26,5859715,10,859,386,10/859/386.pbf,122.16796875,40.312910186973724,121.9921875,40.17887331434696,122.34375,40.44694705960049,1715,1080,5,293,243,268,283,160,584,628,495,"[{""class"": ""DEPCNT"", ""count"": 268}, {""class"": ""SLCONS"", ""count"": 247}, {""class"": ""DEPARE"", ""count"": 243}, {""class"": ""LIGHTS"", ""count"": 120}, {""class"": ""SBDARE"", ""count"": 109}, {""class"": ""_texto"", ""count"": 75}, {""class"": ""TOPMAR"", ""count"": 67}, {""class"": ""ITDARE"", ""count"": 45}, {""class"": ""ZEMCNT"", ""count"": 45}, {""class"": ""BOYLAT"", ""count"": 41}, {""class"": ""$LINES"", ""count"": 36}, {""class"": ""BCNSPP"", ""count"": 35}, {""class"": ""BRTFAC"", ""count"": 29}, {""class"": ""BUAARE"", ""count"": 29}, {""class"": ""COALNE"", ""count"": 29}]","[{""scale"": 20000, ""count"": 418}, {""scale"": 50000, ""count"": 662}, {""scale"": 100000, ""count"": 498}, {""scale"": 200000, ""count"": 114}, {""scale"": 1000000, ""count"": 23}]" +27,5857080,10,910,377,10/910/377.pbf,140.09765625,42.682301017026845,139.921875,42.553080288955805,140.2734375,42.811521745097885,1280,1058,5,317,75,86,29,214,342,452,480,"[{""class"": ""COALNE"", ""count"": 157}, {""class"": ""UWTROC"", ""count"": 141}, {""class"": ""BUISGL"", ""count"": 118}, {""class"": ""DEPCNT"", ""count"": 86}, {""class"": ""LNDARE"", ""count"": 83}, {""class"": ""BUAARE"", ""count"": 82}, {""class"": ""SLCONS"", ""count"": 77}, {""class"": ""DEPARE"", ""count"": 75}, {""class"": ""ZEMCNT"", ""count"": 75}, {""class"": ""ITDARE"", ""count"": 51}, {""class"": ""SBDARE"", ""count"": 51}, {""class"": ""ROADPT"", ""count"": 46}, {""class"": ""_texto"", ""count"": 40}, {""class"": ""RIVERS"", ""count"": 27}, {""class"": ""LNDELV"", ""count"": 20}]","[{""scale"": 7500, ""count"": 442}, {""scale"": 20000, ""count"": 334}, {""scale"": 50000, ""count"": 282}, {""scale"": 100000, ""count"": 52}, {""scale"": 200000, ""count"": 165}, {""scale"": 1000000, ""count"": 5}]" +28,5855856,10,886,375,10/886/375.pbf,131.66015625,43.19703272708128,131.484375,43.06888777416962,131.8359375,43.32517767999295,1656,1042,5,227,27,27,19,244,375,904,372,"[{""class"": ""RIVERS"", ""count"": 308}, {""class"": ""COALNE"", ""count"": 170}, {""class"": ""UWTROC"", ""count"": 132}, {""class"": ""RIVBNK"", ""count"": 118}, {""class"": ""LAKSHR"", ""count"": 78}, {""class"": ""LNDELV"", ""count"": 62}, {""class"": ""LAKARE"", ""count"": 57}, {""class"": ""LNDRGN"", ""count"": 55}, {""class"": ""LNDARE"", ""count"": 53}, {""class"": ""ZEMCNT"", ""count"": 53}, {""class"": ""OBSTRN"", ""count"": 51}, {""class"": ""_texto"", ""count"": 46}, {""class"": ""SLOTOP"", ""count"": 45}, {""class"": ""SBDARE"", ""count"": 41}, {""class"": ""ITDARE"", ""count"": 40}]","[{""scale"": 7500, ""count"": 1}, {""scale"": 20000, ""count"": 4}, {""scale"": 50000, ""count"": 1037}, {""scale"": 100000, ""count"": 514}, {""scale"": 200000, ""count"": 89}, {""scale"": 1000000, ""count"": 11}]" +29,5848607,10,910,353,10/910/353.pbf,140.09765625,48.57465613686708,139.921875,48.45835188280865,140.2734375,48.6909603909255,1607,970,5,253,31,29,12,482,569,770,262,"[{""class"": ""UWTROC"", ""count"": 371}, {""class"": ""RIVERS"", ""count"": 255}, {""class"": ""RIVBNK"", ""count"": 245}, {""class"": ""COALNE"", ""count"": 195}, {""class"": ""SBDARE"", ""count"": 82}, {""class"": ""SLOTOP"", ""count"": 60}, {""class"": ""LNDRGN"", ""count"": 54}, {""class"": ""LNDARE"", ""count"": 52}, {""class"": ""_texto"", ""count"": 33}, {""class"": ""DEPARE"", ""count"": 31}, {""class"": ""DEPCNT"", ""count"": 29}, {""class"": ""SLOGRD"", ""count"": 29}, {""class"": ""WEDKLP"", ""count"": 23}, {""class"": ""CTNARE"", ""count"": 20}, {""class"": ""LNDELV"", ""count"": 18}]","[{""scale"": 7500, ""count"": 39}, {""scale"": 20000, ""count"": 683}, {""scale"": 50000, ""count"": 248}, {""scale"": 100000, ""count"": 524}, {""scale"": 200000, ""count"": 103}, {""scale"": 1000000, ""count"": 10}]" +30,5843249,10,914,366,10/914/366.pbf,141.50390625,45.45999583298721,141.328125,45.33670190996811,141.6796875,45.58328975600631,949,923,5,333,56,63,18,140,304,211,432,"[{""class"": ""SLCONS"", ""count"": 185}, {""class"": ""LNDARE"", ""count"": 116}, {""class"": ""SBDARE"", ""count"": 70}, {""class"": ""UWTROC"", ""count"": 66}, {""class"": ""DEPCNT"", ""count"": 63}, {""class"": ""DEPARE"", ""count"": 56}, {""class"": ""_texto"", ""count"": 50}, {""class"": ""BUAARE"", ""count"": 49}, {""class"": ""BUISGL"", ""count"": 39}, {""class"": ""COALNE"", ""count"": 32}, {""class"": ""ITDARE"", ""count"": 25}, {""class"": ""ZEMCNT"", ""count"": 25}, {""class"": ""TNKCON"", ""count"": 20}, {""class"": ""LIGHTS"", ""count"": 17}, {""class"": ""TOWERS"", ""count"": 13}]","[{""scale"": 7500, ""count"": 307}, {""scale"": 50000, ""count"": 616}, {""scale"": 100000, ""count"": 1}, {""scale"": 200000, ""count"": 22}, {""scale"": 1000000, ""count"": 2}, {""scale"": 3000000, ""count"": 1}]" +31,5841185,10,915,366,10/915/366.pbf,141.85546875,45.45999583298721,141.6796875,45.33670190996811,142.03125,45.58328975600631,985,902,5,282,60,63,39,199,340,226,415,"[{""class"": ""SLCONS"", ""count"": 164}, {""class"": ""SBDARE"", ""count"": 148}, {""class"": ""LNDARE"", ""count"": 88}, {""class"": ""DEPCNT"", ""count"": 63}, {""class"": ""DEPARE"", ""count"": 60}, {""class"": ""BUISGL"", ""count"": 58}, {""class"": ""UWTROC"", ""count"": 31}, {""class"": ""COALNE"", ""count"": 30}, {""class"": ""_texto"", ""count"": 30}, {""class"": ""LIGHTS"", ""count"": 27}, {""class"": ""RIVBNK"", ""count"": 25}, {""class"": ""TOWERS"", ""count"": 20}, {""class"": ""BRIDGE"", ""count"": 18}, {""class"": ""BUAARE"", ""count"": 17}, {""class"": ""ITDARE"", ""count"": 17}]","[{""scale"": 7500, ""count"": 432}, {""scale"": 50000, ""count"": 470}, {""scale"": 200000, ""count"": 75}, {""scale"": 1000000, ""count"": 8}]" +32,5839618,10,911,381,10/911/381.pbf,140.44921875,41.6399444886017,140.2734375,41.50857729743934,140.625,41.77131167976407,1018,886,5,212,64,72,84,235,498,315,201,"[{""class"": ""SBDARE"", ""count"": 102}, {""class"": ""UWTROC"", ""count"": 102}, {""class"": ""COALNE"", ""count"": 85}, {""class"": ""SLCONS"", ""count"": 75}, {""class"": ""DEPCNT"", ""count"": 72}, {""class"": ""DEPARE"", ""count"": 64}, {""class"": ""_texto"", ""count"": 53}, {""class"": ""LNDARE"", ""count"": 52}, {""class"": ""ITDARE"", ""count"": 46}, {""class"": ""ZEMCNT"", ""count"": 46}, {""class"": ""LIGHTS"", ""count"": 38}, {""class"": ""BUISGL"", ""count"": 28}, {""class"": ""BUIREL"", ""count"": 23}, {""class"": ""$LINES"", ""count"": 21}, {""class"": ""BUAARE"", ""count"": 21}]","[{""scale"": 50000, ""count"": 886}, {""scale"": 200000, ""count"": 123}, {""scale"": 1000000, ""count"": 9}]" +33,5838565,10,889,376,10/889/376.pbf,132.71484375,42.94020475963375,132.5390625,42.811521745097885,132.890625,43.06888777416962,1465,871,5,221,38,43,12,343,480,675,308,"[{""class"": ""UWTROC"", ""count"": 264}, {""class"": ""RIVERS"", ""count"": 245}, {""class"": ""COALNE"", ""count"": 175}, {""class"": ""BUAARE"", ""count"": 75}, {""class"": ""_texto"", ""count"": 64}, {""class"": ""RIVBNK"", ""count"": 56}, {""class"": ""LNDELV"", ""count"": 55}, {""class"": ""SLOTOP"", ""count"": 55}, {""class"": ""ROADPT"", ""count"": 51}, {""class"": ""SLOGRD"", ""count"": 48}, {""class"": ""DEPCNT"", ""count"": 43}, {""class"": ""DEPARE"", ""count"": 38}, {""class"": ""SBDARE"", ""count"": 36}, {""class"": ""SLCONS"", ""count"": 26}, {""class"": ""LAKSHR"", ""count"": 22}]","[{""scale"": 7500, ""count"": 10}, {""scale"": 20000, ""count"": 4}, {""scale"": 50000, ""count"": 857}, {""scale"": 100000, ""count"": 494}, {""scale"": 200000, ""count"": 86}, {""scale"": 1000000, ""count"": 14}]" +34,5834997,10,912,378,10/912/378.pbf,140.80078125,42.42332224056294,140.625,42.29356419217008,140.9765625,42.553080288955805,1297,837,5,450,98,117,113,194,454,477,362,"[{""class"": ""SLCONS"", ""count"": 239}, {""class"": ""DEPCNT"", ""count"": 117}, {""class"": ""LNDARE"", ""count"": 108}, {""class"": ""COALNE"", ""count"": 103}, {""class"": ""DEPARE"", ""count"": 98}, {""class"": ""UWTROC"", ""count"": 84}, {""class"": ""LIGHTS"", ""count"": 78}, {""class"": ""_texto"", ""count"": 63}, {""class"": ""SBDARE"", ""count"": 61}, {""class"": ""_extgn"", ""count"": 34}, {""class"": ""ZEMCNT"", ""count"": 33}, {""class"": ""ITDARE"", ""count"": 32}, {""class"": ""WRECKS"", ""count"": 26}, {""class"": ""TOWERS"", ""count"": 25}, {""class"": ""BUAARE"", ""count"": 22}]","[{""scale"": 50000, ""count"": 837}, {""scale"": 100000, ""count"": 330}, {""scale"": 200000, ""count"": 115}, {""scale"": 1000000, ""count"": 15}]" +35,5834080,10,915,361,10/915/361.pbf,141.85546875,46.679459874952244,141.6796875,46.55886030311718,142.03125,46.8000594467873,880,832,5,92,35,55,30,451,543,195,132,"[{""class"": ""UWTROC"", ""count"": 318}, {""class"": ""SBDARE"", ""count"": 113}, {""class"": ""DEPCNT"", ""count"": 55}, {""class"": ""_texto"", ""count"": 42}, {""class"": ""DEPARE"", ""count"": 35}, {""class"": ""COALNE"", ""count"": 34}, {""class"": ""LNDARE"", ""count"": 29}, {""class"": ""SLCONS"", ""count"": 29}, {""class"": ""$LINES"", ""count"": 28}, {""class"": ""ZEMCNT"", ""count"": 23}, {""class"": ""ITDARE"", ""count"": 20}, {""class"": ""BRTFAC"", ""count"": 16}, {""class"": ""LIGHTS"", ""count"": 15}, {""class"": ""RIVERS"", ""count"": 13}, {""class"": ""OBSTRN"", ""count"": 12}]","[{""scale"": 7500, ""count"": 459}, {""scale"": 20000, ""count"": 198}, {""scale"": 50000, ""count"": 175}, {""scale"": 200000, ""count"": 42}, {""scale"": 1000000, ""count"": 6}]" +36,5828506,10,926,375,10/926/375.pbf,145.72265625,43.19703272708128,145.546875,43.06888777416962,145.8984375,43.32517767999295,1406,771,5,299,213,228,56,306,437,488,477,"[{""class"": ""DEPCNT"", ""count"": 228}, {""class"": ""DEPARE"", ""count"": 213}, {""class"": ""COALNE"", ""count"": 134}, {""class"": ""SBDARE"", ""count"": 130}, {""class"": ""UWTROC"", ""count"": 107}, {""class"": ""LNDARE"", ""count"": 104}, {""class"": ""ZEMCNT"", ""count"": 64}, {""class"": ""_texto"", ""count"": 63}, {""class"": ""SLCONS"", ""count"": 61}, {""class"": ""ITDARE"", ""count"": 57}, {""class"": ""LIGHTS"", ""count"": 51}, {""class"": ""WRECKS"", ""count"": 40}, {""class"": ""OBSTRN"", ""count"": 25}, {""class"": ""TOWERS"", ""count"": 13}, {""class"": ""_extgn"", ""count"": 10}]","[{""scale"": 20000, ""count"": 445}, {""scale"": 50000, ""count"": 326}, {""scale"": 100000, ""count"": 504}, {""scale"": 200000, ""count"": 109}, {""scale"": 1000000, ""count"": 20}, {""scale"": 3000000, ""count"": 2}]" +37,5828459,10,931,368,10/931/368.pbf,147.48046875,44.96466310811451,147.3046875,44.84029065139799,147.65625,45.089035564831015,1359,771,5,203,95,91,23,394,479,604,271,"[{""class"": ""UWTROC"", ""count"": 306}, {""class"": ""COALNE"", ""count"": 179}, {""class"": ""RIVERS"", ""count"": 177}, {""class"": ""DEPARE"", ""count"": 95}, {""class"": ""SLOTOP"", ""count"": 94}, {""class"": ""DEPCNT"", ""count"": 91}, {""class"": ""SLOGRD"", ""count"": 65}, {""class"": ""SBDARE"", ""count"": 57}, {""class"": ""LNDELV"", ""count"": 30}, {""class"": ""RIVBNK"", ""count"": 30}, {""class"": ""_texto"", ""count"": 30}, {""class"": ""ROADPT"", ""count"": 24}, {""class"": ""LNDARE"", ""count"": 21}, {""class"": ""LNDRGN"", ""count"": 19}, {""class"": ""CTNARE"", ""count"": 15}]","[{""scale"": 20000, ""count"": 231}, {""scale"": 50000, ""count"": 540}, {""scale"": 100000, ""count"": 489}, {""scale"": 200000, ""count"": 91}, {""scale"": 1000000, ""count"": 6}, {""scale"": 3000000, ""count"": 2}]" +38,5828120,10,916,359,10/916/359.pbf,142.20703125,47.15970557368874,142.03125,47.04018214480666,142.3828125,47.27922900257082,820,773,5,108,15,30,99,144,300,312,206,"[{""class"": ""RIVERS"", ""count"": 123}, {""class"": ""UWTROC"", ""count"": 95}, {""class"": ""BUAARE"", ""count"": 82}, {""class"": ""SLCONS"", ""count"": 54}, {""class"": ""LIGHTS"", ""count"": 52}, {""class"": ""COALNE"", ""count"": 44}, {""class"": ""DEPCNT"", ""count"": 30}, {""class"": ""SLOTOP"", ""count"": 24}, {""class"": ""LNDELV"", ""count"": 23}, {""class"": ""SBDARE"", ""count"": 23}, {""class"": ""SLOGRD"", ""count"": 23}, {""class"": ""WATTUR"", ""count"": 22}, {""class"": ""BRTFAC"", ""count"": 18}, {""class"": ""DEPARE"", ""count"": 15}, {""class"": ""BCNSPP"", ""count"": 14}]","[{""scale"": 7500, ""count"": 195}, {""scale"": 20000, ""count"": 127}, {""scale"": 50000, ""count"": 451}, {""scale"": 200000, ""count"": 43}, {""scale"": 1000000, ""count"": 3}, {""scale"": 3000000, ""count"": 1}]" +39,5828023,10,932,368,10/932/368.pbf,147.83203125,44.96466310811451,147.65625,44.84029065139799,148.0078125,45.089035564831015,1223,768,5,193,81,55,12,303,373,542,301,"[{""class"": ""COALNE"", ""count"": 153}, {""class"": ""UWTROC"", ""count"": 146}, {""class"": ""RIVERS"", ""count"": 134}, {""class"": ""SBDARE"", ""count"": 122}, {""class"": ""DEPARE"", ""count"": 81}, {""class"": ""SLOTOP"", ""count"": 77}, {""class"": ""RIVBNK"", ""count"": 70}, {""class"": ""DEPCNT"", ""count"": 55}, {""class"": ""LAKSHR"", ""count"": 47}, {""class"": ""SLOGRD"", ""count"": 45}, {""class"": ""_texto"", ""count"": 42}, {""class"": ""LNDARE"", ""count"": 40}, {""class"": ""CTNARE"", ""count"": 34}, {""class"": ""LNDELV"", ""count"": 34}, {""class"": ""LAKARE"", ""count"": 31}]","[{""scale"": 20000, ""count"": 414}, {""scale"": 50000, ""count"": 354}, {""scale"": 100000, ""count"": 331}, {""scale"": 200000, ""count"": 114}, {""scale"": 1000000, ""count"": 2}, {""scale"": 3000000, ""count"": 4}, {""scale"": 20000000, ""count"": 4}]" +40,5823820,10,898,370,10/898/370.pbf,135.87890625,44.465016214702985,135.703125,44.33956524809713,136.0546875,44.590467181308846,1320,725,5,99,13,17,33,346,541,556,221,"[{""class"": ""UWTROC"", ""count"": 307}, {""class"": ""RIVERS"", ""count"": 219}, {""class"": ""RIVBNK"", ""count"": 170}, {""class"": ""_texto"", ""count"": 94}, {""class"": ""COALNE"", ""count"": 83}, {""class"": ""BUAARE"", ""count"": 74}, {""class"": ""LNDELV"", ""count"": 54}, {""class"": ""SLOTOP"", ""count"": 27}, {""class"": ""VEGARE"", ""count"": 23}, {""class"": ""SBDARE"", ""count"": 22}, {""class"": ""LIGHTS"", ""count"": 20}, {""class"": ""LNDRGN"", ""count"": 20}, {""class"": ""ROADPT"", ""count"": 20}, {""class"": ""SLOGRD"", ""count"": 18}, {""class"": ""DEPCNT"", ""count"": 17}]","[{""scale"": 50000, ""count"": 725}, {""scale"": 100000, ""count"": 534}, {""scale"": 200000, ""count"": 49}, {""scale"": 1000000, ""count"": 12}]" diff --git a/cm95_pbf_aoi_candidates_v1.json b/cm95_pbf_aoi_candidates_v1.json new file mode 100644 index 0000000..f4d80d3 --- /dev/null +++ b/cm95_pbf_aoi_candidates_v1.json @@ -0,0 +1,4411 @@ +{ + "version": "v1", + "generated_at": "2026-09-03T08:25:31", + "dataset_id": 1, + "search_bbox": [ + 120.0, + 40.0, + 160.0, + 50.0 + ], + "z": 10, + "candidate_count": 1649, + "top": [ + { + "score": 6121875, + "z": 10, + "x": 887, + "y": 375, + "tile_path": "10/887/375.pbf", + "center_lon": 132.01171875, + "center_lat": 43.19703272708128, + "min_lon": 131.8359375, + "min_lat": 43.06888777416962, + "max_lon": 132.1875, + "max_lat": 43.32517767999295, + "feature_count": 4475, + "detail_feature_count_le_50000": 3674, + "required_groups_present": 5, + "land_count": 818, + "depth_count": 366, + "contour_count": 390, + "navmark_light_count": 191, + "hazard_count": 856, + "point_count": 1373, + "line_count": 2039, + "area_count": 1050, + "top_classes": [ + { + "class": "COALNE", + "count": 457 + }, + { + "class": "UWTROC", + "count": 440 + }, + { + "class": "DEPCNT", + "count": 390 + }, + { + "class": "DEPARE", + "count": 366 + }, + { + "class": "SLCONS", + "count": 284 + }, + { + "class": "RIVERS", + "count": 229 + }, + { + "class": "_texto", + "count": 169 + }, + { + "class": "SBDARE", + "count": 164 + }, + { + "class": "OBSTRN", + "count": 158 + }, + { + "class": "LNDELV", + "count": 132 + }, + { + "class": "SLOTOP", + "count": 132 + }, + { + "class": "ROADPT", + "count": 130 + }, + { + "class": "RIVBNK", + "count": 103 + }, + { + "class": "BRTFAC", + "count": 94 + }, + { + "class": "LNDARE", + "count": 77 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 536 + }, + { + "scale": 20000, + "count": 1418 + }, + { + "scale": 50000, + "count": 1720 + }, + { + "scale": 100000, + "count": 650 + }, + { + "scale": 200000, + "count": 130 + }, + { + "scale": 1000000, + "count": 20 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 6104723, + "z": 10, + "x": 890, + "y": 377, + "tile_path": "10/890/377.pbf", + "center_lon": 133.06640625, + "center_lat": 42.682301017026845, + "min_lon": 132.890625, + "min_lat": 42.553080288955805, + "max_lon": 133.2421875, + "max_lat": 42.811521745097885, + "feature_count": 4323, + "detail_feature_count_le_50000": 3504, + "required_groups_present": 5, + "land_count": 529, + "depth_count": 401, + "contour_count": 378, + "navmark_light_count": 283, + "hazard_count": 1493, + "point_count": 2018, + "line_count": 1251, + "area_count": 1043, + "top_classes": [ + { + "class": "UWTROC", + "count": 1140 + }, + { + "class": "DEPARE", + "count": 401 + }, + { + "class": "DEPCNT", + "count": 378 + }, + { + "class": "COALNE", + "count": 350 + }, + { + "class": "SBDARE", + "count": 203 + }, + { + "class": "SLOTOP", + "count": 137 + }, + { + "class": "LIGHTS", + "count": 132 + }, + { + "class": "SLCONS", + "count": 109 + }, + { + "class": "_texto", + "count": 104 + }, + { + "class": "SLOGRD", + "count": 98 + }, + { + "class": "OBSTRN", + "count": 81 + }, + { + "class": "BUISGL", + "count": 72 + }, + { + "class": "LNDARE", + "count": 70 + }, + { + "class": "ROADPT", + "count": 62 + }, + { + "class": "TOPMAR", + "count": 60 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 881 + }, + { + "scale": 20000, + "count": 1443 + }, + { + "scale": 50000, + "count": 1180 + }, + { + "scale": 100000, + "count": 668 + }, + { + "scale": 200000, + "count": 112 + }, + { + "scale": 1000000, + "count": 39 + } + ] + }, + { + "score": 6076644, + "z": 10, + "x": 914, + "y": 385, + "tile_path": "10/914/385.pbf", + "center_lon": 141.50390625, + "center_lat": 40.580451442943264, + "min_lon": 141.328125, + "min_lat": 40.44694705960049, + "max_lon": 141.6796875, + "max_lat": 40.71395582628604, + "feature_count": 3544, + "detail_feature_count_le_50000": 3231, + "required_groups_present": 5, + "land_count": 647, + "depth_count": 401, + "contour_count": 441, + "navmark_light_count": 132, + "hazard_count": 1062, + "point_count": 1632, + "line_count": 952, + "area_count": 956, + "top_classes": [ + { + "class": "WRECKS", + "count": 481 + }, + { + "class": "DEPCNT", + "count": 441 + }, + { + "class": "DEPARE", + "count": 401 + }, + { + "class": "SLCONS", + "count": 328 + }, + { + "class": "SBDARE", + "count": 296 + }, + { + "class": "UWTROC", + "count": 176 + }, + { + "class": "COALNE", + "count": 165 + }, + { + "class": "LNDARE", + "count": 154 + }, + { + "class": "_texto", + "count": 113 + }, + { + "class": "LIGHTS", + "count": 96 + }, + { + "class": "BRTFAC", + "count": 89 + }, + { + "class": "ZEMCNT", + "count": 83 + }, + { + "class": "OBSTRN", + "count": 76 + }, + { + "class": "ITDARE", + "count": 68 + }, + { + "class": "TNKCON", + "count": 57 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 2239 + }, + { + "scale": 50000, + "count": 992 + }, + { + "scale": 100000, + "count": 1 + }, + { + "scale": 200000, + "count": 278 + }, + { + "scale": 1000000, + "count": 33 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 6023900, + "z": 10, + "x": 884, + "y": 377, + "tile_path": "10/884/377.pbf", + "center_lon": 130.95703125, + "center_lat": 42.682301017026845, + "min_lon": 130.78125, + "min_lat": 42.553080288955805, + "max_lon": 131.1328125, + "max_lat": 42.811521745097885, + "feature_count": 3900, + "detail_feature_count_le_50000": 2700, + "required_groups_present": 5, + "land_count": 588, + "depth_count": 244, + "contour_count": 227, + "navmark_light_count": 85, + "hazard_count": 1252, + "point_count": 1616, + "line_count": 1359, + "area_count": 912, + "top_classes": [ + { + "class": "UWTROC", + "count": 953 + }, + { + "class": "COALNE", + "count": 497 + }, + { + "class": "DEPARE", + "count": 244 + }, + { + "class": "DEPCNT", + "count": 227 + }, + { + "class": "SBDARE", + "count": 197 + }, + { + "class": "SLOTOP", + "count": 183 + }, + { + "class": "RIVERS", + "count": 147 + }, + { + "class": "LNDRGN", + "count": 138 + }, + { + "class": "_texto", + "count": 123 + }, + { + "class": "SLOGRD", + "count": 114 + }, + { + "class": "WEDKLP", + "count": 111 + }, + { + "class": "RIVBNK", + "count": 107 + }, + { + "class": "ROADPT", + "count": 76 + }, + { + "class": "LNDELV", + "count": 75 + }, + { + "class": "LNDARE", + "count": 57 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 380 + }, + { + "scale": 20000, + "count": 2320 + }, + { + "scale": 100000, + "count": 1051 + }, + { + "scale": 200000, + "count": 125 + }, + { + "scale": 1000000, + "count": 24 + } + ] + }, + { + "score": 5997990, + "z": 10, + "x": 911, + "y": 351, + "tile_path": "10/911/351.pbf", + "center_lon": 140.44921875, + "center_lat": 49.03773445996431, + "min_lon": 140.2734375, + "min_lat": 48.92249926375824, + "max_lon": 140.625, + "max_lat": 49.15296965617039, + "feature_count": 3190, + "detail_feature_count_le_50000": 2448, + "required_groups_present": 5, + "land_count": 425, + "depth_count": 194, + "contour_count": 182, + "navmark_light_count": 171, + "hazard_count": 1106, + "point_count": 1506, + "line_count": 944, + "area_count": 730, + "top_classes": [ + { + "class": "UWTROC", + "count": 871 + }, + { + "class": "COALNE", + "count": 343 + }, + { + "class": "DEPARE", + "count": 194 + }, + { + "class": "DEPCNT", + "count": 182 + }, + { + "class": "SLOTOP", + "count": 148 + }, + { + "class": "_texto", + "count": 146 + }, + { + "class": "SBDARE", + "count": 116 + }, + { + "class": "SLOGRD", + "count": 85 + }, + { + "class": "BUAARE", + "count": 76 + }, + { + "class": "BCNSPP", + "count": 70 + }, + { + "class": "OBSTRN", + "count": 57 + }, + { + "class": "LNDELV", + "count": 55 + }, + { + "class": "RIVERS", + "count": 55 + }, + { + "class": "SEAARE", + "count": 52 + }, + { + "class": "LIGHTS", + "count": 51 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 1220 + }, + { + "scale": 50000, + "count": 1228 + }, + { + "scale": 100000, + "count": 534 + }, + { + "scale": 200000, + "count": 176 + }, + { + "scale": 1000000, + "count": 31 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 5954428, + "z": 10, + "x": 912, + "y": 381, + "tile_path": "10/912/381.pbf", + "center_lon": 140.80078125, + "center_lat": 41.6399444886017, + "min_lon": 140.625, + "min_lat": 41.50857729743934, + "max_lon": 140.9765625, + "max_lat": 41.77131167976407, + "feature_count": 2228, + "detail_feature_count_le_50000": 2022, + "required_groups_present": 5, + "land_count": 408, + "depth_count": 160, + "contour_count": 190, + "navmark_light_count": 78, + "hazard_count": 622, + "point_count": 907, + "line_count": 732, + "area_count": 581, + "top_classes": [ + { + "class": "UWTROC", + "count": 326 + }, + { + "class": "SBDARE", + "count": 216 + }, + { + "class": "SLCONS", + "count": 204 + }, + { + "class": "ZEMCNT", + "count": 198 + }, + { + "class": "ITDARE", + "count": 195 + }, + { + "class": "DEPCNT", + "count": 190 + }, + { + "class": "DEPARE", + "count": 160 + }, + { + "class": "COALNE", + "count": 112 + }, + { + "class": "LNDARE", + "count": 92 + }, + { + "class": "_texto", + "count": 79 + }, + { + "class": "TOWERS", + "count": 46 + }, + { + "class": "OBSTRN", + "count": 40 + }, + { + "class": "LIGHTS", + "count": 38 + }, + { + "class": "BUISGL", + "count": 35 + }, + { + "class": "BUAARE", + "count": 32 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 903 + }, + { + "scale": 50000, + "count": 1119 + }, + { + "scale": 200000, + "count": 189 + }, + { + "scale": 1000000, + "count": 17 + } + ] + }, + { + "score": 5951203, + "z": 10, + "x": 856, + "y": 384, + "tile_path": "10/856/384.pbf", + "center_lon": 121.11328125, + "center_lat": 40.84692694795308, + "min_lon": 120.9375, + "min_lat": 40.71395582628604, + "max_lon": 121.2890625, + "max_lat": 40.97989806962013, + "feature_count": 2303, + "detail_feature_count_le_50000": 1989, + "required_groups_present": 5, + "land_count": 454, + "depth_count": 294, + "contour_count": 299, + "navmark_light_count": 354, + "hazard_count": 348, + "point_count": 746, + "line_count": 711, + "area_count": 840, + "top_classes": [ + { + "class": "SLCONS", + "count": 347 + }, + { + "class": "DEPCNT", + "count": 299 + }, + { + "class": "DEPARE", + "count": 294 + }, + { + "class": "SBDARE", + "count": 239 + }, + { + "class": "LIGHTS", + "count": 134 + }, + { + "class": "TOPMAR", + "count": 102 + }, + { + "class": "ITDARE", + "count": 92 + }, + { + "class": "ZEMCNT", + "count": 73 + }, + { + "class": "BOYLAT", + "count": 67 + }, + { + "class": "UWTROC", + "count": 63 + }, + { + "class": "$LINES", + "count": 60 + }, + { + "class": "COALNE", + "count": 58 + }, + { + "class": "_texto", + "count": 50 + }, + { + "class": "LNDARE", + "count": 49 + }, + { + "class": "LAKSHR", + "count": 41 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 1042 + }, + { + "scale": 50000, + "count": 947 + }, + { + "scale": 100000, + "count": 206 + }, + { + "scale": 200000, + "count": 93 + }, + { + "scale": 1000000, + "count": 14 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 5926940, + "z": 10, + "x": 887, + "y": 376, + "tile_path": "10/887/376.pbf", + "center_lon": 132.01171875, + "center_lat": 42.94020475963375, + "min_lon": 131.8359375, + "min_lat": 42.811521745097885, + "max_lon": 132.1875, + "max_lat": 43.06888777416962, + "feature_count": 2340, + "detail_feature_count_le_50000": 1746, + "required_groups_present": 5, + "land_count": 501, + "depth_count": 134, + "contour_count": 209, + "navmark_light_count": 133, + "hazard_count": 767, + "point_count": 1089, + "line_count": 714, + "area_count": 534, + "top_classes": [ + { + "class": "UWTROC", + "count": 544 + }, + { + "class": "COALNE", + "count": 303 + }, + { + "class": "DEPCNT", + "count": 209 + }, + { + "class": "LNDARE", + "count": 160 + }, + { + "class": "DEPARE", + "count": 134 + }, + { + "class": "SBDARE", + "count": 128 + }, + { + "class": "_texto", + "count": 102 + }, + { + "class": "OBSTRN", + "count": 59 + }, + { + "class": "LIGHTS", + "count": 49 + }, + { + "class": "SLOTOP", + "count": 40 + }, + { + "class": "SLCONS", + "count": 38 + }, + { + "class": "RESARE", + "count": 35 + }, + { + "class": "BCNSPP", + "count": 31 + }, + { + "class": "SLOGRD", + "count": 30 + }, + { + "class": "SEAARE", + "count": 28 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 1 + }, + { + "scale": 20000, + "count": 718 + }, + { + "scale": 50000, + "count": 1027 + }, + { + "scale": 100000, + "count": 474 + }, + { + "scale": 200000, + "count": 78 + }, + { + "scale": 1000000, + "count": 38 + }, + { + "scale": 3000000, + "count": 2 + }, + { + "scale": 20000000, + "count": 2 + } + ] + }, + { + "score": 5925129, + "z": 10, + "x": 892, + "y": 376, + "tile_path": "10/892/376.pbf", + "center_lon": 133.76953125, + "center_lat": 42.94020475963375, + "min_lon": 133.59375, + "min_lat": 42.811521745097885, + "max_lon": 133.9453125, + "max_lat": 43.06888777416962, + "feature_count": 2329, + "detail_feature_count_le_50000": 1728, + "required_groups_present": 5, + "land_count": 393, + "depth_count": 73, + "contour_count": 67, + "navmark_light_count": 31, + "hazard_count": 734, + "point_count": 865, + "line_count": 936, + "area_count": 522, + "top_classes": [ + { + "class": "UWTROC", + "count": 566 + }, + { + "class": "COALNE", + "count": 326 + }, + { + "class": "RIVERS", + "count": 207 + }, + { + "class": "RIVBNK", + "count": 120 + }, + { + "class": "SBDARE", + "count": 119 + }, + { + "class": "SLOTOP", + "count": 93 + }, + { + "class": "LNDRGN", + "count": 88 + }, + { + "class": "ZEMCNT", + "count": 81 + }, + { + "class": "DEPARE", + "count": 73 + }, + { + "class": "SLOGRD", + "count": 72 + }, + { + "class": "ITDARE", + "count": 69 + }, + { + "class": "DEPCNT", + "count": 67 + }, + { + "class": "LNDELV", + "count": 60 + }, + { + "class": "LNDARE", + "count": 55 + }, + { + "class": "_texto", + "count": 54 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 1728 + }, + { + "scale": 100000, + "count": 466 + }, + { + "scale": 200000, + "count": 114 + }, + { + "scale": 1000000, + "count": 21 + } + ] + }, + { + "score": 5913497, + "z": 10, + "x": 885, + "y": 376, + "tile_path": "10/885/376.pbf", + "center_lon": 131.30859375, + "center_lat": 42.94020475963375, + "min_lon": 131.1328125, + "min_lat": 42.811521745097885, + "max_lon": 131.484375, + "max_lat": 43.06888777416962, + "feature_count": 2397, + "detail_feature_count_le_50000": 1611, + "required_groups_present": 5, + "land_count": 357, + "depth_count": 88, + "contour_count": 91, + "navmark_light_count": 50, + "hazard_count": 678, + "point_count": 887, + "line_count": 1039, + "area_count": 471, + "top_classes": [ + { + "class": "UWTROC", + "count": 559 + }, + { + "class": "COALNE", + "count": 278 + }, + { + "class": "RIVERS", + "count": 240 + }, + { + "class": "SLOTOP", + "count": 119 + }, + { + "class": "DEPCNT", + "count": 91 + }, + { + "class": "DEPARE", + "count": 88 + }, + { + "class": "RIVBNK", + "count": 84 + }, + { + "class": "SLOGRD", + "count": 77 + }, + { + "class": "SBDARE", + "count": 74 + }, + { + "class": "ROADPT", + "count": 73 + }, + { + "class": "LAKSHR", + "count": 64 + }, + { + "class": "LNDELV", + "count": 60 + }, + { + "class": "VEGARE", + "count": 60 + }, + { + "class": "_texto", + "count": 59 + }, + { + "class": "LNDARE", + "count": 50 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 1 + }, + { + "scale": 50000, + "count": 1610 + }, + { + "scale": 100000, + "count": 643 + }, + { + "scale": 200000, + "count": 110 + }, + { + "scale": 1000000, + "count": 33 + } + ] + }, + { + "score": 5913112, + "z": 10, + "x": 914, + "y": 377, + "tile_path": "10/914/377.pbf", + "center_lon": 141.50390625, + "center_lat": 42.682301017026845, + "min_lon": 141.328125, + "min_lat": 42.553080288955805, + "max_lon": 141.6796875, + "max_lat": 42.811521745097885, + "feature_count": 1712, + "detail_feature_count_le_50000": 1614, + "required_groups_present": 5, + "land_count": 430, + "depth_count": 162, + "contour_count": 181, + "navmark_light_count": 101, + "hazard_count": 232, + "point_count": 713, + "line_count": 485, + "area_count": 510, + "top_classes": [ + { + "class": "SLCONS", + "count": 277 + }, + { + "class": "SBDARE", + "count": 188 + }, + { + "class": "DEPCNT", + "count": 181 + }, + { + "class": "DEPARE", + "count": 162 + }, + { + "class": "_texto", + "count": 108 + }, + { + "class": "LNDARE", + "count": 95 + }, + { + "class": "BRTFAC", + "count": 79 + }, + { + "class": "PRDINS", + "count": 59 + }, + { + "class": "COALNE", + "count": 58 + }, + { + "class": "LIGHTS", + "count": 57 + }, + { + "class": "ITDARE", + "count": 41 + }, + { + "class": "TNKCON", + "count": 35 + }, + { + "class": "BUAARE", + "count": 33 + }, + { + "class": "ZEMCNT", + "count": 32 + }, + { + "class": "CHIMNY", + "count": 24 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 971 + }, + { + "scale": 50000, + "count": 643 + }, + { + "scale": 200000, + "count": 84 + }, + { + "scale": 1000000, + "count": 14 + } + ] + }, + { + "score": 5909693, + "z": 10, + "x": 912, + "y": 384, + "tile_path": "10/912/384.pbf", + "center_lon": 140.80078125, + "center_lat": 40.84692694795308, + "min_lon": 140.625, + "min_lat": 40.71395582628604, + "max_lon": 140.9765625, + "max_lat": 40.97989806962013, + "feature_count": 1893, + "detail_feature_count_le_50000": 1578, + "required_groups_present": 5, + "land_count": 490, + "depth_count": 154, + "contour_count": 166, + "navmark_light_count": 115, + "hazard_count": 282, + "point_count": 656, + "line_count": 590, + "area_count": 643, + "top_classes": [ + { + "class": "SLCONS", + "count": 400 + }, + { + "class": "SBDARE", + "count": 229 + }, + { + "class": "DEPCNT", + "count": 166 + }, + { + "class": "DEPARE", + "count": 154 + }, + { + "class": "RIVBNK", + "count": 92 + }, + { + "class": "_texto", + "count": 92 + }, + { + "class": "ITDARE", + "count": 65 + }, + { + "class": "LIGHTS", + "count": 63 + }, + { + "class": "ZEMCNT", + "count": 63 + }, + { + "class": "BUISGL", + "count": 58 + }, + { + "class": "LNDARE", + "count": 57 + }, + { + "class": "BRIDGE", + "count": 56 + }, + { + "class": "BUAARE", + "count": 40 + }, + { + "class": "COALNE", + "count": 33 + }, + { + "class": "TOWERS", + "count": 26 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 646 + }, + { + "scale": 50000, + "count": 932 + }, + { + "scale": 100000, + "count": 98 + }, + { + "scale": 200000, + "count": 197 + }, + { + "scale": 1000000, + "count": 15 + }, + { + "scale": 3000000, + "count": 3 + }, + { + "scale": 20000000, + "count": 2 + } + ] + }, + { + "score": 5907373, + "z": 10, + "x": 896, + "y": 373, + "tile_path": "10/896/373.pbf", + "center_lon": 135.17578125, + "center_lat": 43.70745881892233, + "min_lon": 135.0, + "min_lat": 43.580390855607845, + "max_lon": 135.3515625, + "max_lat": 43.83452678223683, + "feature_count": 2073, + "detail_feature_count_le_50000": 1553, + "required_groups_present": 5, + "land_count": 322, + "depth_count": 98, + "contour_count": 81, + "navmark_light_count": 46, + "hazard_count": 473, + "point_count": 653, + "line_count": 874, + "area_count": 542, + "top_classes": [ + { + "class": "UWTROC", + "count": 334 + }, + { + "class": "COALNE", + "count": 254 + }, + { + "class": "RIVERS", + "count": 222 + }, + { + "class": "LNDRGN", + "count": 174 + }, + { + "class": "RIVBNK", + "count": 171 + }, + { + "class": "SBDARE", + "count": 100 + }, + { + "class": "DEPARE", + "count": 98 + }, + { + "class": "DEPCNT", + "count": 81 + }, + { + "class": "LNDELV", + "count": 65 + }, + { + "class": "LNDARE", + "count": 64 + }, + { + "class": "SLOTOP", + "count": 63 + }, + { + "class": "SLOGRD", + "count": 52 + }, + { + "class": "VEGARE", + "count": 46 + }, + { + "class": "LAKSHR", + "count": 42 + }, + { + "class": "_texto", + "count": 38 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 1553 + }, + { + "scale": 100000, + "count": 430 + }, + { + "scale": 200000, + "count": 65 + }, + { + "scale": 1000000, + "count": 24 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 5906071, + "z": 10, + "x": 859, + "y": 385, + "tile_path": "10/859/385.pbf", + "center_lon": 122.16796875, + "center_lat": 40.580451442943264, + "min_lon": 121.9921875, + "min_lat": 40.44694705960049, + "max_lon": 122.34375, + "max_lat": 40.71395582628604, + "feature_count": 2171, + "detail_feature_count_le_50000": 1539, + "required_groups_present": 5, + "land_count": 471, + "depth_count": 224, + "contour_count": 226, + "navmark_light_count": 417, + "hazard_count": 112, + "point_count": 625, + "line_count": 791, + "area_count": 747, + "top_classes": [ + { + "class": "SLCONS", + "count": 342 + }, + { + "class": "DEPCNT", + "count": 226 + }, + { + "class": "DEPARE", + "count": 224 + }, + { + "class": "LIGHTS", + "count": 146 + }, + { + "class": "TOPMAR", + "count": 133 + }, + { + "class": "ZEMCNT", + "count": 127 + }, + { + "class": "ITDARE", + "count": 103 + }, + { + "class": "SBDARE", + "count": 77 + }, + { + "class": "BOYLAT", + "count": 75 + }, + { + "class": "COALNE", + "count": 67 + }, + { + "class": "LNDARE", + "count": 62 + }, + { + "class": "_texto", + "count": 56 + }, + { + "class": "BCNSPP", + "count": 42 + }, + { + "class": "LAKSHR", + "count": 40 + }, + { + "class": "LAKARE", + "count": 38 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 936 + }, + { + "scale": 50000, + "count": 603 + }, + { + "scale": 100000, + "count": 554 + }, + { + "scale": 200000, + "count": 71 + }, + { + "scale": 1000000, + "count": 6 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 5905467, + "z": 10, + "x": 922, + "y": 376, + "tile_path": "10/922/376.pbf", + "center_lon": 144.31640625, + "center_lat": 42.94020475963375, + "min_lon": 144.140625, + "min_lat": 42.811521745097885, + "max_lon": 144.4921875, + "max_lat": 43.06888777416962, + "feature_count": 2067, + "detail_feature_count_le_50000": 1534, + "required_groups_present": 5, + "land_count": 316, + "depth_count": 181, + "contour_count": 188, + "navmark_light_count": 84, + "hazard_count": 570, + "point_count": 930, + "line_count": 494, + "area_count": 636, + "top_classes": [ + { + "class": "SBDARE", + "count": 293 + }, + { + "class": "SLCONS", + "count": 228 + }, + { + "class": "DEPCNT", + "count": 188 + }, + { + "class": "DEPARE", + "count": 181 + }, + { + "class": "UWTROC", + "count": 174 + }, + { + "class": "_texto", + "count": 77 + }, + { + "class": "ITDARE", + "count": 74 + }, + { + "class": "WRECKS", + "count": 68 + }, + { + "class": "ZEMCNT", + "count": 60 + }, + { + "class": "LIGHTS", + "count": 57 + }, + { + "class": "LNDARE", + "count": 51 + }, + { + "class": "BRTFAC", + "count": 49 + }, + { + "class": "BUISGL", + "count": 49 + }, + { + "class": "PRDINS", + "count": 47 + }, + { + "class": "RIVBNK", + "count": 39 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 1534 + }, + { + "scale": 100000, + "count": 445 + }, + { + "scale": 200000, + "count": 84 + }, + { + "scale": 1000000, + "count": 3 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 5899347, + "z": 10, + "x": 888, + "y": 376, + "tile_path": "10/888/376.pbf", + "center_lon": 132.36328125, + "center_lat": 42.94020475963375, + "min_lon": 132.1875, + "min_lat": 42.811521745097885, + "max_lon": 132.5390625, + "max_lat": 43.06888777416962, + "feature_count": 2747, + "detail_feature_count_le_50000": 1466, + "required_groups_present": 5, + "land_count": 466, + "depth_count": 125, + "contour_count": 153, + "navmark_light_count": 126, + "hazard_count": 973, + "point_count": 1295, + "line_count": 940, + "area_count": 504, + "top_classes": [ + { + "class": "UWTROC", + "count": 793 + }, + { + "class": "COALNE", + "count": 393 + }, + { + "class": "DEPCNT", + "count": 153 + }, + { + "class": "SLOTOP", + "count": 143 + }, + { + "class": "DEPARE", + "count": 125 + }, + { + "class": "RIVERS", + "count": 125 + }, + { + "class": "SLOGRD", + "count": 116 + }, + { + "class": "_texto", + "count": 116 + }, + { + "class": "SBDARE", + "count": 81 + }, + { + "class": "LNDELV", + "count": 73 + }, + { + "class": "OBSTRN", + "count": 61 + }, + { + "class": "LIGHTS", + "count": 52 + }, + { + "class": "LNDARE", + "count": 49 + }, + { + "class": "SEAARE", + "count": 43 + }, + { + "class": "BCNSPP", + "count": 41 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 374 + }, + { + "scale": 50000, + "count": 1092 + }, + { + "scale": 100000, + "count": 1056 + }, + { + "scale": 200000, + "count": 169 + }, + { + "scale": 1000000, + "count": 54 + }, + { + "scale": 3000000, + "count": 2 + } + ] + }, + { + "score": 5898662, + "z": 10, + "x": 926, + "y": 374, + "tile_path": "10/926/374.pbf", + "center_lon": 145.72265625, + "center_lat": 43.452784267800396, + "min_lon": 145.546875, + "min_lat": 43.32517767999295, + "max_lon": 145.8984375, + "max_lat": 43.580390855607845, + "feature_count": 2562, + "detail_feature_count_le_50000": 1461, + "required_groups_present": 5, + "land_count": 402, + "depth_count": 270, + "contour_count": 313, + "navmark_light_count": 65, + "hazard_count": 684, + "point_count": 837, + "line_count": 862, + "area_count": 852, + "top_classes": [ + { + "class": "UWTROC", + "count": 353 + }, + { + "class": "DEPCNT", + "count": 313 + }, + { + "class": "DEPARE", + "count": 270 + }, + { + "class": "ZEMCNT", + "count": 261 + }, + { + "class": "SBDARE", + "count": 228 + }, + { + "class": "ITDARE", + "count": 218 + }, + { + "class": "COALNE", + "count": 168 + }, + { + "class": "LNDARE", + "count": 129 + }, + { + "class": "_texto", + "count": 111 + }, + { + "class": "SLCONS", + "count": 105 + }, + { + "class": "OBSTRN", + "count": 77 + }, + { + "class": "LIGHTS", + "count": 60 + }, + { + "class": "TOWERS", + "count": 31 + }, + { + "class": "BUAARE", + "count": 30 + }, + { + "class": "$LINES", + "count": 24 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 522 + }, + { + "scale": 50000, + "count": 939 + }, + { + "scale": 100000, + "count": 954 + }, + { + "scale": 200000, + "count": 133 + }, + { + "scale": 1000000, + "count": 13 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 5894691, + "z": 10, + "x": 888, + "y": 375, + "tile_path": "10/888/375.pbf", + "center_lon": 132.36328125, + "center_lat": 43.19703272708128, + "min_lon": 132.1875, + "min_lat": 43.06888777416962, + "max_lon": 132.5390625, + "max_lat": 43.32517767999295, + "feature_count": 2091, + "detail_feature_count_le_50000": 1426, + "required_groups_present": 5, + "land_count": 281, + "depth_count": 61, + "contour_count": 66, + "navmark_light_count": 49, + "hazard_count": 695, + "point_count": 885, + "line_count": 880, + "area_count": 321, + "top_classes": [ + { + "class": "UWTROC", + "count": 565 + }, + { + "class": "COALNE", + "count": 243 + }, + { + "class": "RIVERS", + "count": 209 + }, + { + "class": "RIVBNK", + "count": 113 + }, + { + "class": "SBDARE", + "count": 95 + }, + { + "class": "SLOTOP", + "count": 86 + }, + { + "class": "LNDELV", + "count": 78 + }, + { + "class": "DEPCNT", + "count": 66 + }, + { + "class": "SLOGRD", + "count": 64 + }, + { + "class": "_texto", + "count": 62 + }, + { + "class": "DEPARE", + "count": 61 + }, + { + "class": "ROADPT", + "count": 53 + }, + { + "class": "RAILWY", + "count": 30 + }, + { + "class": "ZEMCNT", + "count": 27 + }, + { + "class": "LNDRGN", + "count": 26 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 89 + }, + { + "scale": 50000, + "count": 1337 + }, + { + "scale": 100000, + "count": 538 + }, + { + "scale": 200000, + "count": 101 + }, + { + "scale": 1000000, + "count": 26 + } + ] + }, + { + "score": 5886280, + "z": 10, + "x": 889, + "y": 377, + "tile_path": "10/889/377.pbf", + "center_lon": 132.71484375, + "center_lat": 42.682301017026845, + "min_lon": 132.5390625, + "min_lat": 42.553080288955805, + "max_lon": 132.890625, + "max_lat": 42.811521745097885, + "feature_count": 1680, + "detail_feature_count_le_50000": 1346, + "required_groups_present": 5, + "land_count": 252, + "depth_count": 171, + "contour_count": 169, + "navmark_light_count": 33, + "hazard_count": 543, + "point_count": 653, + "line_count": 610, + "area_count": 411, + "top_classes": [ + { + "class": "UWTROC", + "count": 390 + }, + { + "class": "DEPARE", + "count": 171 + }, + { + "class": "DEPCNT", + "count": 169 + }, + { + "class": "SLCONS", + "count": 137 + }, + { + "class": "COALNE", + "count": 102 + }, + { + "class": "BRTFAC", + "count": 95 + }, + { + "class": "SBDARE", + "count": 88 + }, + { + "class": "_texto", + "count": 46 + }, + { + "class": "OBSTRN", + "count": 37 + }, + { + "class": "SLOGRD", + "count": 35 + }, + { + "class": "SLOTOP", + "count": 34 + }, + { + "class": "ROADPT", + "count": 33 + }, + { + "class": "BUAARE", + "count": 27 + }, + { + "class": "CBLSUB", + "count": 25 + }, + { + "class": "SEAARE", + "count": 22 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 396 + }, + { + "scale": 20000, + "count": 425 + }, + { + "scale": 50000, + "count": 525 + }, + { + "scale": 100000, + "count": 284 + }, + { + "scale": 200000, + "count": 32 + }, + { + "scale": 1000000, + "count": 18 + } + ] + }, + { + "score": 5884667, + "z": 10, + "x": 911, + "y": 350, + "tile_path": "10/911/350.pbf", + "center_lon": 140.44921875, + "center_lat": 49.26767122158997, + "min_lon": 140.2734375, + "min_lat": 49.15296965617039, + "max_lon": 140.625, + "max_lat": 49.38237278700955, + "feature_count": 1867, + "detail_feature_count_le_50000": 1328, + "required_groups_present": 5, + "land_count": 231, + "depth_count": 75, + "contour_count": 70, + "navmark_light_count": 48, + "hazard_count": 509, + "point_count": 638, + "line_count": 813, + "area_count": 410, + "top_classes": [ + { + "class": "UWTROC", + "count": 367 + }, + { + "class": "RIVBNK", + "count": 258 + }, + { + "class": "COALNE", + "count": 193 + }, + { + "class": "SBDARE", + "count": 119 + }, + { + "class": "SLOTOP", + "count": 119 + }, + { + "class": "VEGARE", + "count": 92 + }, + { + "class": "DEPARE", + "count": 75 + }, + { + "class": "DEPCNT", + "count": 70 + }, + { + "class": "RIVERS", + "count": 65 + }, + { + "class": "LNDRGN", + "count": 61 + }, + { + "class": "_texto", + "count": 53 + }, + { + "class": "LNDARE", + "count": 37 + }, + { + "class": "ZEMCNT", + "count": 37 + }, + { + "class": "LAKSHR", + "count": 33 + }, + { + "class": "ITDARE", + "count": 30 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 706 + }, + { + "scale": 50000, + "count": 622 + }, + { + "scale": 100000, + "count": 366 + }, + { + "scale": 200000, + "count": 149 + }, + { + "scale": 1000000, + "count": 24 + } + ] + }, + { + "score": 5883660, + "z": 10, + "x": 914, + "y": 372, + "tile_path": "10/914/372.pbf", + "center_lon": 141.50390625, + "center_lat": 43.961055905241, + "min_lon": 141.328125, + "min_lat": 43.83452678223683, + "max_lon": 141.6796875, + "max_lat": 44.087585028245165, + "feature_count": 1560, + "detail_feature_count_le_50000": 1321, + "required_groups_present": 5, + "land_count": 362, + "depth_count": 230, + "contour_count": 253, + "navmark_light_count": 54, + "hazard_count": 280, + "point_count": 479, + "line_count": 559, + "area_count": 517, + "top_classes": [ + { + "class": "DEPCNT", + "count": 253 + }, + { + "class": "DEPARE", + "count": 230 + }, + { + "class": "SLCONS", + "count": 191 + }, + { + "class": "SBDARE", + "count": 188 + }, + { + "class": "COALNE", + "count": 107 + }, + { + "class": "LNDARE", + "count": 64 + }, + { + "class": "UWTROC", + "count": 60 + }, + { + "class": "_texto", + "count": 54 + }, + { + "class": "ZEMCNT", + "count": 52 + }, + { + "class": "ITDARE", + "count": 44 + }, + { + "class": "LIGHTS", + "count": 43 + }, + { + "class": "TOWERS", + "count": 29 + }, + { + "class": "BUAARE", + "count": 23 + }, + { + "class": "BRTFAC", + "count": 22 + }, + { + "class": "BUISGL", + "count": 21 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 616 + }, + { + "scale": 20000, + "count": 705 + }, + { + "scale": 100000, + "count": 107 + }, + { + "scale": 200000, + "count": 123 + }, + { + "scale": 1000000, + "count": 8 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 5881827, + "z": 10, + "x": 910, + "y": 351, + "tile_path": "10/910/351.pbf", + "center_lon": 140.09765625, + "center_lat": 49.03773445996431, + "min_lon": 139.921875, + "min_lat": 48.92249926375824, + "max_lon": 140.2734375, + "max_lat": 49.15296965617039, + "feature_count": 1627, + "detail_feature_count_le_50000": 1302, + "required_groups_present": 5, + "land_count": 280, + "depth_count": 42, + "contour_count": 40, + "navmark_light_count": 37, + "hazard_count": 207, + "point_count": 415, + "line_count": 737, + "area_count": 471, + "top_classes": [ + { + "class": "COALNE", + "count": 209 + }, + { + "class": "RIVBNK", + "count": 138 + }, + { + "class": "BUAARE", + "count": 111 + }, + { + "class": "UWTROC", + "count": 98 + }, + { + "class": "SLOTOP", + "count": 78 + }, + { + "class": "RAILWY", + "count": 76 + }, + { + "class": "VEGARE", + "count": 70 + }, + { + "class": "_texto", + "count": 60 + }, + { + "class": "ROADPT", + "count": 56 + }, + { + "class": "LNDELV", + "count": 55 + }, + { + "class": "RIVERS", + "count": 55 + }, + { + "class": "LNDARE", + "count": 54 + }, + { + "class": "SBDARE", + "count": 51 + }, + { + "class": "WEDKLP", + "count": 51 + }, + { + "class": "DEPARE", + "count": 42 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 730 + }, + { + "scale": 50000, + "count": 572 + }, + { + "scale": 100000, + "count": 244 + }, + { + "scale": 200000, + "count": 78 + }, + { + "scale": 1000000, + "count": 3 + } + ] + }, + { + "score": 5875328, + "z": 10, + "x": 912, + "y": 380, + "tile_path": "10/912/380.pbf", + "center_lon": 140.80078125, + "center_lat": 41.90214300610273, + "min_lon": 140.625, + "min_lat": 41.77131167976407, + "max_lon": 140.9765625, + "max_lat": 42.03297433244139, + "feature_count": 1528, + "detail_feature_count_le_50000": 1238, + "required_groups_present": 5, + "land_count": 268, + "depth_count": 119, + "contour_count": 125, + "navmark_light_count": 160, + "hazard_count": 334, + "point_count": 751, + "line_count": 402, + "area_count": 372, + "top_classes": [ + { + "class": "SLCONS", + "count": 220 + }, + { + "class": "SBDARE", + "count": 166 + }, + { + "class": "DEPCNT", + "count": 125 + }, + { + "class": "DEPARE", + "count": 119 + }, + { + "class": "WRECKS", + "count": 99 + }, + { + "class": "LIGHTS", + "count": 91 + }, + { + "class": "_texto", + "count": 77 + }, + { + "class": "BUAARE", + "count": 43 + }, + { + "class": "BRIDGE", + "count": 41 + }, + { + "class": "BUISGL", + "count": 41 + }, + { + "class": "RIVBNK", + "count": 34 + }, + { + "class": "UWTROC", + "count": 32 + }, + { + "class": "COALNE", + "count": 29 + }, + { + "class": "BOYSPP", + "count": 25 + }, + { + "class": "OBSTRN", + "count": 23 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 922 + }, + { + "scale": 50000, + "count": 316 + }, + { + "scale": 100000, + "count": 126 + }, + { + "scale": 200000, + "count": 150 + }, + { + "scale": 1000000, + "count": 13 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 5866952, + "z": 10, + "x": 915, + "y": 377, + "tile_path": "10/915/377.pbf", + "center_lon": 141.85546875, + "center_lat": 42.682301017026845, + "min_lon": 141.6796875, + "min_lat": 42.553080288955805, + "max_lon": 142.03125, + "max_lat": 42.811521745097885, + "feature_count": 1252, + "detail_feature_count_le_50000": 1157, + "required_groups_present": 5, + "land_count": 219, + "depth_count": 158, + "contour_count": 168, + "navmark_light_count": 154, + "hazard_count": 207, + "point_count": 501, + "line_count": 379, + "area_count": 366, + "top_classes": [ + { + "class": "DEPCNT", + "count": 168 + }, + { + "class": "DEPARE", + "count": 158 + }, + { + "class": "SBDARE", + "count": 139 + }, + { + "class": "SLCONS", + "count": 135 + }, + { + "class": "LIGHTS", + "count": 80 + }, + { + "class": "WRECKS", + "count": 45 + }, + { + "class": "LNDARE", + "count": 43 + }, + { + "class": "COALNE", + "count": 41 + }, + { + "class": "ZEMCNT", + "count": 37 + }, + { + "class": "ITDARE", + "count": 32 + }, + { + "class": "RIVBNK", + "count": 27 + }, + { + "class": "_texto", + "count": 27 + }, + { + "class": "BRTFAC", + "count": 25 + }, + { + "class": "BOYSPP", + "count": 23 + }, + { + "class": "_extgn", + "count": 18 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 781 + }, + { + "scale": 50000, + "count": 376 + }, + { + "scale": 200000, + "count": 88 + }, + { + "scale": 1000000, + "count": 7 + } + ] + }, + { + "score": 5866237, + "z": 10, + "x": 886, + "y": 376, + "tile_path": "10/886/376.pbf", + "center_lon": 131.66015625, + "center_lat": 42.94020475963375, + "min_lon": 131.484375, + "min_lat": 42.811521745097885, + "max_lon": 131.8359375, + "max_lat": 43.06888777416962, + "feature_count": 2537, + "detail_feature_count_le_50000": 1137, + "required_groups_present": 5, + "land_count": 521, + "depth_count": 145, + "contour_count": 228, + "navmark_light_count": 69, + "hazard_count": 798, + "point_count": 1064, + "line_count": 906, + "area_count": 558, + "top_classes": [ + { + "class": "UWTROC", + "count": 561 + }, + { + "class": "COALNE", + "count": 356 + }, + { + "class": "DEPCNT", + "count": 228 + }, + { + "class": "SBDARE", + "count": 179 + }, + { + "class": "LNDARE", + "count": 146 + }, + { + "class": "DEPARE", + "count": 145 + }, + { + "class": "_texto", + "count": 142 + }, + { + "class": "SLOTOP", + "count": 104 + }, + { + "class": "SLOGRD", + "count": 85 + }, + { + "class": "RIVERS", + "count": 54 + }, + { + "class": "ZEMCNT", + "count": 45 + }, + { + "class": "ITDARE", + "count": 43 + }, + { + "class": "LNDELV", + "count": 43 + }, + { + "class": "OBSTRN", + "count": 43 + }, + { + "class": "SEAARE", + "count": 27 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 7 + }, + { + "scale": 50000, + "count": 1130 + }, + { + "scale": 100000, + "count": 1107 + }, + { + "scale": 200000, + "count": 179 + }, + { + "scale": 1000000, + "count": 106 + }, + { + "scale": 3000000, + "count": 8 + } + ] + }, + { + "score": 5859715, + "z": 10, + "x": 859, + "y": 386, + "tile_path": "10/859/386.pbf", + "center_lon": 122.16796875, + "center_lat": 40.312910186973724, + "min_lon": 121.9921875, + "min_lat": 40.17887331434696, + "max_lon": 122.34375, + "max_lat": 40.44694705960049, + "feature_count": 1715, + "detail_feature_count_le_50000": 1080, + "required_groups_present": 5, + "land_count": 293, + "depth_count": 243, + "contour_count": 268, + "navmark_light_count": 283, + "hazard_count": 160, + "point_count": 584, + "line_count": 628, + "area_count": 495, + "top_classes": [ + { + "class": "DEPCNT", + "count": 268 + }, + { + "class": "SLCONS", + "count": 247 + }, + { + "class": "DEPARE", + "count": 243 + }, + { + "class": "LIGHTS", + "count": 120 + }, + { + "class": "SBDARE", + "count": 109 + }, + { + "class": "_texto", + "count": 75 + }, + { + "class": "TOPMAR", + "count": 67 + }, + { + "class": "ITDARE", + "count": 45 + }, + { + "class": "ZEMCNT", + "count": 45 + }, + { + "class": "BOYLAT", + "count": 41 + }, + { + "class": "$LINES", + "count": 36 + }, + { + "class": "BCNSPP", + "count": 35 + }, + { + "class": "BRTFAC", + "count": 29 + }, + { + "class": "BUAARE", + "count": 29 + }, + { + "class": "COALNE", + "count": 29 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 418 + }, + { + "scale": 50000, + "count": 662 + }, + { + "scale": 100000, + "count": 498 + }, + { + "scale": 200000, + "count": 114 + }, + { + "scale": 1000000, + "count": 23 + } + ] + }, + { + "score": 5857080, + "z": 10, + "x": 910, + "y": 377, + "tile_path": "10/910/377.pbf", + "center_lon": 140.09765625, + "center_lat": 42.682301017026845, + "min_lon": 139.921875, + "min_lat": 42.553080288955805, + "max_lon": 140.2734375, + "max_lat": 42.811521745097885, + "feature_count": 1280, + "detail_feature_count_le_50000": 1058, + "required_groups_present": 5, + "land_count": 317, + "depth_count": 75, + "contour_count": 86, + "navmark_light_count": 29, + "hazard_count": 214, + "point_count": 342, + "line_count": 452, + "area_count": 480, + "top_classes": [ + { + "class": "COALNE", + "count": 157 + }, + { + "class": "UWTROC", + "count": 141 + }, + { + "class": "BUISGL", + "count": 118 + }, + { + "class": "DEPCNT", + "count": 86 + }, + { + "class": "LNDARE", + "count": 83 + }, + { + "class": "BUAARE", + "count": 82 + }, + { + "class": "SLCONS", + "count": 77 + }, + { + "class": "DEPARE", + "count": 75 + }, + { + "class": "ZEMCNT", + "count": 75 + }, + { + "class": "ITDARE", + "count": 51 + }, + { + "class": "SBDARE", + "count": 51 + }, + { + "class": "ROADPT", + "count": 46 + }, + { + "class": "_texto", + "count": 40 + }, + { + "class": "RIVERS", + "count": 27 + }, + { + "class": "LNDELV", + "count": 20 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 442 + }, + { + "scale": 20000, + "count": 334 + }, + { + "scale": 50000, + "count": 282 + }, + { + "scale": 100000, + "count": 52 + }, + { + "scale": 200000, + "count": 165 + }, + { + "scale": 1000000, + "count": 5 + } + ] + }, + { + "score": 5855856, + "z": 10, + "x": 886, + "y": 375, + "tile_path": "10/886/375.pbf", + "center_lon": 131.66015625, + "center_lat": 43.19703272708128, + "min_lon": 131.484375, + "min_lat": 43.06888777416962, + "max_lon": 131.8359375, + "max_lat": 43.32517767999295, + "feature_count": 1656, + "detail_feature_count_le_50000": 1042, + "required_groups_present": 5, + "land_count": 227, + "depth_count": 27, + "contour_count": 27, + "navmark_light_count": 19, + "hazard_count": 244, + "point_count": 375, + "line_count": 904, + "area_count": 372, + "top_classes": [ + { + "class": "RIVERS", + "count": 308 + }, + { + "class": "COALNE", + "count": 170 + }, + { + "class": "UWTROC", + "count": 132 + }, + { + "class": "RIVBNK", + "count": 118 + }, + { + "class": "LAKSHR", + "count": 78 + }, + { + "class": "LNDELV", + "count": 62 + }, + { + "class": "LAKARE", + "count": 57 + }, + { + "class": "LNDRGN", + "count": 55 + }, + { + "class": "LNDARE", + "count": 53 + }, + { + "class": "ZEMCNT", + "count": 53 + }, + { + "class": "OBSTRN", + "count": 51 + }, + { + "class": "_texto", + "count": 46 + }, + { + "class": "SLOTOP", + "count": 45 + }, + { + "class": "SBDARE", + "count": 41 + }, + { + "class": "ITDARE", + "count": 40 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 1 + }, + { + "scale": 20000, + "count": 4 + }, + { + "scale": 50000, + "count": 1037 + }, + { + "scale": 100000, + "count": 514 + }, + { + "scale": 200000, + "count": 89 + }, + { + "scale": 1000000, + "count": 11 + } + ] + }, + { + "score": 5848607, + "z": 10, + "x": 910, + "y": 353, + "tile_path": "10/910/353.pbf", + "center_lon": 140.09765625, + "center_lat": 48.57465613686708, + "min_lon": 139.921875, + "min_lat": 48.45835188280865, + "max_lon": 140.2734375, + "max_lat": 48.6909603909255, + "feature_count": 1607, + "detail_feature_count_le_50000": 970, + "required_groups_present": 5, + "land_count": 253, + "depth_count": 31, + "contour_count": 29, + "navmark_light_count": 12, + "hazard_count": 482, + "point_count": 569, + "line_count": 770, + "area_count": 262, + "top_classes": [ + { + "class": "UWTROC", + "count": 371 + }, + { + "class": "RIVERS", + "count": 255 + }, + { + "class": "RIVBNK", + "count": 245 + }, + { + "class": "COALNE", + "count": 195 + }, + { + "class": "SBDARE", + "count": 82 + }, + { + "class": "SLOTOP", + "count": 60 + }, + { + "class": "LNDRGN", + "count": 54 + }, + { + "class": "LNDARE", + "count": 52 + }, + { + "class": "_texto", + "count": 33 + }, + { + "class": "DEPARE", + "count": 31 + }, + { + "class": "DEPCNT", + "count": 29 + }, + { + "class": "SLOGRD", + "count": 29 + }, + { + "class": "WEDKLP", + "count": 23 + }, + { + "class": "CTNARE", + "count": 20 + }, + { + "class": "LNDELV", + "count": 18 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 39 + }, + { + "scale": 20000, + "count": 683 + }, + { + "scale": 50000, + "count": 248 + }, + { + "scale": 100000, + "count": 524 + }, + { + "scale": 200000, + "count": 103 + }, + { + "scale": 1000000, + "count": 10 + } + ] + }, + { + "score": 5843249, + "z": 10, + "x": 914, + "y": 366, + "tile_path": "10/914/366.pbf", + "center_lon": 141.50390625, + "center_lat": 45.45999583298721, + "min_lon": 141.328125, + "min_lat": 45.33670190996811, + "max_lon": 141.6796875, + "max_lat": 45.58328975600631, + "feature_count": 949, + "detail_feature_count_le_50000": 923, + "required_groups_present": 5, + "land_count": 333, + "depth_count": 56, + "contour_count": 63, + "navmark_light_count": 18, + "hazard_count": 140, + "point_count": 304, + "line_count": 211, + "area_count": 432, + "top_classes": [ + { + "class": "SLCONS", + "count": 185 + }, + { + "class": "LNDARE", + "count": 116 + }, + { + "class": "SBDARE", + "count": 70 + }, + { + "class": "UWTROC", + "count": 66 + }, + { + "class": "DEPCNT", + "count": 63 + }, + { + "class": "DEPARE", + "count": 56 + }, + { + "class": "_texto", + "count": 50 + }, + { + "class": "BUAARE", + "count": 49 + }, + { + "class": "BUISGL", + "count": 39 + }, + { + "class": "COALNE", + "count": 32 + }, + { + "class": "ITDARE", + "count": 25 + }, + { + "class": "ZEMCNT", + "count": 25 + }, + { + "class": "TNKCON", + "count": 20 + }, + { + "class": "LIGHTS", + "count": 17 + }, + { + "class": "TOWERS", + "count": 13 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 307 + }, + { + "scale": 50000, + "count": 616 + }, + { + "scale": 100000, + "count": 1 + }, + { + "scale": 200000, + "count": 22 + }, + { + "scale": 1000000, + "count": 2 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 5841185, + "z": 10, + "x": 915, + "y": 366, + "tile_path": "10/915/366.pbf", + "center_lon": 141.85546875, + "center_lat": 45.45999583298721, + "min_lon": 141.6796875, + "min_lat": 45.33670190996811, + "max_lon": 142.03125, + "max_lat": 45.58328975600631, + "feature_count": 985, + "detail_feature_count_le_50000": 902, + "required_groups_present": 5, + "land_count": 282, + "depth_count": 60, + "contour_count": 63, + "navmark_light_count": 39, + "hazard_count": 199, + "point_count": 340, + "line_count": 226, + "area_count": 415, + "top_classes": [ + { + "class": "SLCONS", + "count": 164 + }, + { + "class": "SBDARE", + "count": 148 + }, + { + "class": "LNDARE", + "count": 88 + }, + { + "class": "DEPCNT", + "count": 63 + }, + { + "class": "DEPARE", + "count": 60 + }, + { + "class": "BUISGL", + "count": 58 + }, + { + "class": "UWTROC", + "count": 31 + }, + { + "class": "COALNE", + "count": 30 + }, + { + "class": "_texto", + "count": 30 + }, + { + "class": "LIGHTS", + "count": 27 + }, + { + "class": "RIVBNK", + "count": 25 + }, + { + "class": "TOWERS", + "count": 20 + }, + { + "class": "BRIDGE", + "count": 18 + }, + { + "class": "BUAARE", + "count": 17 + }, + { + "class": "ITDARE", + "count": 17 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 432 + }, + { + "scale": 50000, + "count": 470 + }, + { + "scale": 200000, + "count": 75 + }, + { + "scale": 1000000, + "count": 8 + } + ] + }, + { + "score": 5839618, + "z": 10, + "x": 911, + "y": 381, + "tile_path": "10/911/381.pbf", + "center_lon": 140.44921875, + "center_lat": 41.6399444886017, + "min_lon": 140.2734375, + "min_lat": 41.50857729743934, + "max_lon": 140.625, + "max_lat": 41.77131167976407, + "feature_count": 1018, + "detail_feature_count_le_50000": 886, + "required_groups_present": 5, + "land_count": 212, + "depth_count": 64, + "contour_count": 72, + "navmark_light_count": 84, + "hazard_count": 235, + "point_count": 498, + "line_count": 315, + "area_count": 201, + "top_classes": [ + { + "class": "SBDARE", + "count": 102 + }, + { + "class": "UWTROC", + "count": 102 + }, + { + "class": "COALNE", + "count": 85 + }, + { + "class": "SLCONS", + "count": 75 + }, + { + "class": "DEPCNT", + "count": 72 + }, + { + "class": "DEPARE", + "count": 64 + }, + { + "class": "_texto", + "count": 53 + }, + { + "class": "LNDARE", + "count": 52 + }, + { + "class": "ITDARE", + "count": 46 + }, + { + "class": "ZEMCNT", + "count": 46 + }, + { + "class": "LIGHTS", + "count": 38 + }, + { + "class": "BUISGL", + "count": 28 + }, + { + "class": "BUIREL", + "count": 23 + }, + { + "class": "$LINES", + "count": 21 + }, + { + "class": "BUAARE", + "count": 21 + } + ], + "native_scales": [ + { + "scale": 50000, + "count": 886 + }, + { + "scale": 200000, + "count": 123 + }, + { + "scale": 1000000, + "count": 9 + } + ] + }, + { + "score": 5838565, + "z": 10, + "x": 889, + "y": 376, + "tile_path": "10/889/376.pbf", + "center_lon": 132.71484375, + "center_lat": 42.94020475963375, + "min_lon": 132.5390625, + "min_lat": 42.811521745097885, + "max_lon": 132.890625, + "max_lat": 43.06888777416962, + "feature_count": 1465, + "detail_feature_count_le_50000": 871, + "required_groups_present": 5, + "land_count": 221, + "depth_count": 38, + "contour_count": 43, + "navmark_light_count": 12, + "hazard_count": 343, + "point_count": 480, + "line_count": 675, + "area_count": 308, + "top_classes": [ + { + "class": "UWTROC", + "count": 264 + }, + { + "class": "RIVERS", + "count": 245 + }, + { + "class": "COALNE", + "count": 175 + }, + { + "class": "BUAARE", + "count": 75 + }, + { + "class": "_texto", + "count": 64 + }, + { + "class": "RIVBNK", + "count": 56 + }, + { + "class": "LNDELV", + "count": 55 + }, + { + "class": "SLOTOP", + "count": 55 + }, + { + "class": "ROADPT", + "count": 51 + }, + { + "class": "SLOGRD", + "count": 48 + }, + { + "class": "DEPCNT", + "count": 43 + }, + { + "class": "DEPARE", + "count": 38 + }, + { + "class": "SBDARE", + "count": 36 + }, + { + "class": "SLCONS", + "count": 26 + }, + { + "class": "LAKSHR", + "count": 22 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 10 + }, + { + "scale": 20000, + "count": 4 + }, + { + "scale": 50000, + "count": 857 + }, + { + "scale": 100000, + "count": 494 + }, + { + "scale": 200000, + "count": 86 + }, + { + "scale": 1000000, + "count": 14 + } + ] + }, + { + "score": 5834997, + "z": 10, + "x": 912, + "y": 378, + "tile_path": "10/912/378.pbf", + "center_lon": 140.80078125, + "center_lat": 42.42332224056294, + "min_lon": 140.625, + "min_lat": 42.29356419217008, + "max_lon": 140.9765625, + "max_lat": 42.553080288955805, + "feature_count": 1297, + "detail_feature_count_le_50000": 837, + "required_groups_present": 5, + "land_count": 450, + "depth_count": 98, + "contour_count": 117, + "navmark_light_count": 113, + "hazard_count": 194, + "point_count": 454, + "line_count": 477, + "area_count": 362, + "top_classes": [ + { + "class": "SLCONS", + "count": 239 + }, + { + "class": "DEPCNT", + "count": 117 + }, + { + "class": "LNDARE", + "count": 108 + }, + { + "class": "COALNE", + "count": 103 + }, + { + "class": "DEPARE", + "count": 98 + }, + { + "class": "UWTROC", + "count": 84 + }, + { + "class": "LIGHTS", + "count": 78 + }, + { + "class": "_texto", + "count": 63 + }, + { + "class": "SBDARE", + "count": 61 + }, + { + "class": "_extgn", + "count": 34 + }, + { + "class": "ZEMCNT", + "count": 33 + }, + { + "class": "ITDARE", + "count": 32 + }, + { + "class": "WRECKS", + "count": 26 + }, + { + "class": "TOWERS", + "count": 25 + }, + { + "class": "BUAARE", + "count": 22 + } + ], + "native_scales": [ + { + "scale": 50000, + "count": 837 + }, + { + "scale": 100000, + "count": 330 + }, + { + "scale": 200000, + "count": 115 + }, + { + "scale": 1000000, + "count": 15 + } + ] + }, + { + "score": 5834080, + "z": 10, + "x": 915, + "y": 361, + "tile_path": "10/915/361.pbf", + "center_lon": 141.85546875, + "center_lat": 46.679459874952244, + "min_lon": 141.6796875, + "min_lat": 46.55886030311718, + "max_lon": 142.03125, + "max_lat": 46.8000594467873, + "feature_count": 880, + "detail_feature_count_le_50000": 832, + "required_groups_present": 5, + "land_count": 92, + "depth_count": 35, + "contour_count": 55, + "navmark_light_count": 30, + "hazard_count": 451, + "point_count": 543, + "line_count": 195, + "area_count": 132, + "top_classes": [ + { + "class": "UWTROC", + "count": 318 + }, + { + "class": "SBDARE", + "count": 113 + }, + { + "class": "DEPCNT", + "count": 55 + }, + { + "class": "_texto", + "count": 42 + }, + { + "class": "DEPARE", + "count": 35 + }, + { + "class": "COALNE", + "count": 34 + }, + { + "class": "LNDARE", + "count": 29 + }, + { + "class": "SLCONS", + "count": 29 + }, + { + "class": "$LINES", + "count": 28 + }, + { + "class": "ZEMCNT", + "count": 23 + }, + { + "class": "ITDARE", + "count": 20 + }, + { + "class": "BRTFAC", + "count": 16 + }, + { + "class": "LIGHTS", + "count": 15 + }, + { + "class": "RIVERS", + "count": 13 + }, + { + "class": "OBSTRN", + "count": 12 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 459 + }, + { + "scale": 20000, + "count": 198 + }, + { + "scale": 50000, + "count": 175 + }, + { + "scale": 200000, + "count": 42 + }, + { + "scale": 1000000, + "count": 6 + } + ] + }, + { + "score": 5828506, + "z": 10, + "x": 926, + "y": 375, + "tile_path": "10/926/375.pbf", + "center_lon": 145.72265625, + "center_lat": 43.19703272708128, + "min_lon": 145.546875, + "min_lat": 43.06888777416962, + "max_lon": 145.8984375, + "max_lat": 43.32517767999295, + "feature_count": 1406, + "detail_feature_count_le_50000": 771, + "required_groups_present": 5, + "land_count": 299, + "depth_count": 213, + "contour_count": 228, + "navmark_light_count": 56, + "hazard_count": 306, + "point_count": 437, + "line_count": 488, + "area_count": 477, + "top_classes": [ + { + "class": "DEPCNT", + "count": 228 + }, + { + "class": "DEPARE", + "count": 213 + }, + { + "class": "COALNE", + "count": 134 + }, + { + "class": "SBDARE", + "count": 130 + }, + { + "class": "UWTROC", + "count": 107 + }, + { + "class": "LNDARE", + "count": 104 + }, + { + "class": "ZEMCNT", + "count": 64 + }, + { + "class": "_texto", + "count": 63 + }, + { + "class": "SLCONS", + "count": 61 + }, + { + "class": "ITDARE", + "count": 57 + }, + { + "class": "LIGHTS", + "count": 51 + }, + { + "class": "WRECKS", + "count": 40 + }, + { + "class": "OBSTRN", + "count": 25 + }, + { + "class": "TOWERS", + "count": 13 + }, + { + "class": "_extgn", + "count": 10 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 445 + }, + { + "scale": 50000, + "count": 326 + }, + { + "scale": 100000, + "count": 504 + }, + { + "scale": 200000, + "count": 109 + }, + { + "scale": 1000000, + "count": 20 + }, + { + "scale": 3000000, + "count": 2 + } + ] + }, + { + "score": 5828459, + "z": 10, + "x": 931, + "y": 368, + "tile_path": "10/931/368.pbf", + "center_lon": 147.48046875, + "center_lat": 44.96466310811451, + "min_lon": 147.3046875, + "min_lat": 44.84029065139799, + "max_lon": 147.65625, + "max_lat": 45.089035564831015, + "feature_count": 1359, + "detail_feature_count_le_50000": 771, + "required_groups_present": 5, + "land_count": 203, + "depth_count": 95, + "contour_count": 91, + "navmark_light_count": 23, + "hazard_count": 394, + "point_count": 479, + "line_count": 604, + "area_count": 271, + "top_classes": [ + { + "class": "UWTROC", + "count": 306 + }, + { + "class": "COALNE", + "count": 179 + }, + { + "class": "RIVERS", + "count": 177 + }, + { + "class": "DEPARE", + "count": 95 + }, + { + "class": "SLOTOP", + "count": 94 + }, + { + "class": "DEPCNT", + "count": 91 + }, + { + "class": "SLOGRD", + "count": 65 + }, + { + "class": "SBDARE", + "count": 57 + }, + { + "class": "LNDELV", + "count": 30 + }, + { + "class": "RIVBNK", + "count": 30 + }, + { + "class": "_texto", + "count": 30 + }, + { + "class": "ROADPT", + "count": 24 + }, + { + "class": "LNDARE", + "count": 21 + }, + { + "class": "LNDRGN", + "count": 19 + }, + { + "class": "CTNARE", + "count": 15 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 231 + }, + { + "scale": 50000, + "count": 540 + }, + { + "scale": 100000, + "count": 489 + }, + { + "scale": 200000, + "count": 91 + }, + { + "scale": 1000000, + "count": 6 + }, + { + "scale": 3000000, + "count": 2 + } + ] + }, + { + "score": 5828120, + "z": 10, + "x": 916, + "y": 359, + "tile_path": "10/916/359.pbf", + "center_lon": 142.20703125, + "center_lat": 47.15970557368874, + "min_lon": 142.03125, + "min_lat": 47.04018214480666, + "max_lon": 142.3828125, + "max_lat": 47.27922900257082, + "feature_count": 820, + "detail_feature_count_le_50000": 773, + "required_groups_present": 5, + "land_count": 108, + "depth_count": 15, + "contour_count": 30, + "navmark_light_count": 99, + "hazard_count": 144, + "point_count": 300, + "line_count": 312, + "area_count": 206, + "top_classes": [ + { + "class": "RIVERS", + "count": 123 + }, + { + "class": "UWTROC", + "count": 95 + }, + { + "class": "BUAARE", + "count": 82 + }, + { + "class": "SLCONS", + "count": 54 + }, + { + "class": "LIGHTS", + "count": 52 + }, + { + "class": "COALNE", + "count": 44 + }, + { + "class": "DEPCNT", + "count": 30 + }, + { + "class": "SLOTOP", + "count": 24 + }, + { + "class": "LNDELV", + "count": 23 + }, + { + "class": "SBDARE", + "count": 23 + }, + { + "class": "SLOGRD", + "count": 23 + }, + { + "class": "WATTUR", + "count": 22 + }, + { + "class": "BRTFAC", + "count": 18 + }, + { + "class": "DEPARE", + "count": 15 + }, + { + "class": "BCNSPP", + "count": 14 + } + ], + "native_scales": [ + { + "scale": 7500, + "count": 195 + }, + { + "scale": 20000, + "count": 127 + }, + { + "scale": 50000, + "count": 451 + }, + { + "scale": 200000, + "count": 43 + }, + { + "scale": 1000000, + "count": 3 + }, + { + "scale": 3000000, + "count": 1 + } + ] + }, + { + "score": 5828023, + "z": 10, + "x": 932, + "y": 368, + "tile_path": "10/932/368.pbf", + "center_lon": 147.83203125, + "center_lat": 44.96466310811451, + "min_lon": 147.65625, + "min_lat": 44.84029065139799, + "max_lon": 148.0078125, + "max_lat": 45.089035564831015, + "feature_count": 1223, + "detail_feature_count_le_50000": 768, + "required_groups_present": 5, + "land_count": 193, + "depth_count": 81, + "contour_count": 55, + "navmark_light_count": 12, + "hazard_count": 303, + "point_count": 373, + "line_count": 542, + "area_count": 301, + "top_classes": [ + { + "class": "COALNE", + "count": 153 + }, + { + "class": "UWTROC", + "count": 146 + }, + { + "class": "RIVERS", + "count": 134 + }, + { + "class": "SBDARE", + "count": 122 + }, + { + "class": "DEPARE", + "count": 81 + }, + { + "class": "SLOTOP", + "count": 77 + }, + { + "class": "RIVBNK", + "count": 70 + }, + { + "class": "DEPCNT", + "count": 55 + }, + { + "class": "LAKSHR", + "count": 47 + }, + { + "class": "SLOGRD", + "count": 45 + }, + { + "class": "_texto", + "count": 42 + }, + { + "class": "LNDARE", + "count": 40 + }, + { + "class": "CTNARE", + "count": 34 + }, + { + "class": "LNDELV", + "count": 34 + }, + { + "class": "LAKARE", + "count": 31 + } + ], + "native_scales": [ + { + "scale": 20000, + "count": 414 + }, + { + "scale": 50000, + "count": 354 + }, + { + "scale": 100000, + "count": 331 + }, + { + "scale": 200000, + "count": 114 + }, + { + "scale": 1000000, + "count": 2 + }, + { + "scale": 3000000, + "count": 4 + }, + { + "scale": 20000000, + "count": 4 + } + ] + }, + { + "score": 5823820, + "z": 10, + "x": 898, + "y": 370, + "tile_path": "10/898/370.pbf", + "center_lon": 135.87890625, + "center_lat": 44.465016214702985, + "min_lon": 135.703125, + "min_lat": 44.33956524809713, + "max_lon": 136.0546875, + "max_lat": 44.590467181308846, + "feature_count": 1320, + "detail_feature_count_le_50000": 725, + "required_groups_present": 5, + "land_count": 99, + "depth_count": 13, + "contour_count": 17, + "navmark_light_count": 33, + "hazard_count": 346, + "point_count": 541, + "line_count": 556, + "area_count": 221, + "top_classes": [ + { + "class": "UWTROC", + "count": 307 + }, + { + "class": "RIVERS", + "count": 219 + }, + { + "class": "RIVBNK", + "count": 170 + }, + { + "class": "_texto", + "count": 94 + }, + { + "class": "COALNE", + "count": 83 + }, + { + "class": "BUAARE", + "count": 74 + }, + { + "class": "LNDELV", + "count": 54 + }, + { + "class": "SLOTOP", + "count": 27 + }, + { + "class": "VEGARE", + "count": 23 + }, + { + "class": "SBDARE", + "count": 22 + }, + { + "class": "LIGHTS", + "count": 20 + }, + { + "class": "LNDRGN", + "count": 20 + }, + { + "class": "ROADPT", + "count": 20 + }, + { + "class": "SLOGRD", + "count": 18 + }, + { + "class": "DEPCNT", + "count": 17 + } + ], + "native_scales": [ + { + "scale": 50000, + "count": 725 + }, + { + "scale": 100000, + "count": 534 + }, + { + "scale": 200000, + "count": 49 + }, + { + "scale": 1000000, + "count": 12 + } + ] + } + ] +} \ No newline at end of file diff --git a/cm95_pbf_aoi_candidates_v1.txt b/cm95_pbf_aoi_candidates_v1.txt new file mode 100644 index 0000000..33a8fe4 --- /dev/null +++ b/cm95_pbf_aoi_candidates_v1.txt @@ -0,0 +1,38 @@ +CM95 → NavSea PBF 第一测试 AOI 候选 v1 +====================================================================================== +Dataset ID: 1 +扫描范围: lon 120.0..160.0, lat 40.0..50.0 + +#01 z10/887/375 center=(132.01172,43.19703) features=4475 detail=3674 groups=5/5 + land=818 depth=366 contour=390 nav=191 hazard=856 +#02 z10/890/377 center=(133.06641,42.68230) features=4323 detail=3504 groups=5/5 + land=529 depth=401 contour=378 nav=283 hazard=1493 +#03 z10/914/385 center=(141.50391,40.58045) features=3544 detail=3231 groups=5/5 + land=647 depth=401 contour=441 nav=132 hazard=1062 +#04 z10/884/377 center=(130.95703,42.68230) features=3900 detail=2700 groups=5/5 + land=588 depth=244 contour=227 nav=85 hazard=1252 +#05 z10/911/351 center=(140.44922,49.03773) features=3190 detail=2448 groups=5/5 + land=425 depth=194 contour=182 nav=171 hazard=1106 +#06 z10/912/381 center=(140.80078,41.63994) features=2228 detail=2022 groups=5/5 + land=408 depth=160 contour=190 nav=78 hazard=622 +#07 z10/856/384 center=(121.11328,40.84693) features=2303 detail=1989 groups=5/5 + land=454 depth=294 contour=299 nav=354 hazard=348 +#08 z10/887/376 center=(132.01172,42.94020) features=2340 detail=1746 groups=5/5 + land=501 depth=134 contour=209 nav=133 hazard=767 +#09 z10/892/376 center=(133.76953,42.94020) features=2329 detail=1728 groups=5/5 + land=393 depth=73 contour=67 nav=31 hazard=734 +#10 z10/885/376 center=(131.30859,42.94020) features=2397 detail=1611 groups=5/5 + land=357 depth=88 contour=91 nav=50 hazard=678 +#11 z10/914/377 center=(141.50391,42.68230) features=1712 detail=1614 groups=5/5 + land=430 depth=162 contour=181 nav=101 hazard=232 +#12 z10/912/384 center=(140.80078,40.84693) features=1893 detail=1578 groups=5/5 + land=490 depth=154 contour=166 nav=115 hazard=282 +#13 z10/896/373 center=(135.17578,43.70746) features=2073 detail=1553 groups=5/5 + land=322 depth=98 contour=81 nav=46 hazard=473 +#14 z10/859/385 center=(122.16797,40.58045) features=2171 detail=1539 groups=5/5 + land=471 depth=224 contour=226 nav=417 hazard=112 +#15 z10/922/376 center=(144.31641,42.94020) features=2067 detail=1534 groups=5/5 + land=316 depth=181 contour=188 nav=84 hazard=570 + +下一步:把 JSON 或 CSV 上传给 ChatGPT。 +ChatGPT 会选一个最适合的 tile,并告诉你需要提供的现有 NavSea PBF z10/z11/z12 路径。 \ No newline at end of file diff --git a/cm95_select_pbf_test_aoi_v1.py b/cm95_select_pbf_test_aoi_v1.py new file mode 100644 index 0000000..85e95ff --- /dev/null +++ b/cm95_select_pbf_test_aoi_v1.py @@ -0,0 +1,415 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 / CM93 MySQL → PBF 测试 AOI 自动候选选择器 v1 + +目标: +从已导入 MySQL 的 CM93 Dataset 中,自动寻找适合做 +CM95→NavSea PBF 第一轮对照测试的 z10 XYZ tile。 + +优先选择同时包含: +- 陆地/岸线 +- 水深区 +- 等深线 +- 灯标/航标 +- 危险物 +- 较细比例尺数据 + +脚本只读数据库,不修改任何内容。 + +执行: + python .\cm95_select_pbf_test_aoi_v1.py ` + --host 127.0.0.1 ` + --port 3306 ` + --user root ` + --database cm93_chart ` + --dataset-id 1 + +输出: +- cm95_pbf_aoi_candidates_v1.csv +- cm95_pbf_aoi_candidates_v1.json +- cm95_pbf_aoi_candidates_v1.txt +""" + +from __future__ import annotations + +import argparse +import csv +import getpass +import json +import math +from collections import Counter, defaultdict +from datetime import datetime +from pathlib import Path + +import pymysql +from pymysql.cursors import SSDictCursor + + +Z = 10 + +LAND = {"LNDARE", "COALNE", "SLCONS"} +DEPTH = {"DEPARE"} +CONTOUR = {"DEPCNT"} + +LIGHT_NAV_EXACT = { + "LIGHTS", "LITFLT", "LITVES", "LNDMRK", + "FOGSIG", "RTPBCN", "TOPMAR", "DAYMAR", +} +LIGHT_NAV_PREFIX = ("BOY", "BCN") + +HAZARD = { + "OBSTRN", "UWTROC", "WRECKS", "SBDARE", + "CTNARE", "MORFAC", +} + +# native_scale 数值越小,通常越详细。 +DETAIL_SCALE_LIMIT = 50000 + + +def args(): + p = argparse.ArgumentParser() + p.add_argument("--host", default="127.0.0.1") + p.add_argument("--port", type=int, default=3306) + p.add_argument("--user", default="root") + p.add_argument("--password", default=None) + p.add_argument("--database", default="cm93_chart") + p.add_argument("--dataset-id", type=int, default=1) + p.add_argument("--min-lon", type=float, default=120.0) + p.add_argument("--max-lon", type=float, default=160.0) + p.add_argument("--min-lat", type=float, default=40.0) + p.add_argument("--max-lat", type=float, default=50.0) + p.add_argument("--top", type=int, default=40) + p.add_argument("--output-dir", default=".") + return p.parse_args() + + +def lonlat_to_tile(lon, lat, z): + lat = max(min(lat, 85.05112878), -85.05112878) + n = 2 ** z + x = int((lon + 180.0) / 360.0 * n) + lat_rad = math.radians(lat) + y = int( + (1.0 - math.asinh(math.tan(lat_rad)) / math.pi) + / 2.0 * n + ) + x = max(0, min(n - 1, x)) + y = max(0, min(n - 1, y)) + return x, y + + +def tile_bounds(z, x, y): + n = 2 ** z + min_lon = x / n * 360.0 - 180.0 + max_lon = (x + 1) / n * 360.0 - 180.0 + + def lat(ty): + return math.degrees( + math.atan(math.sinh(math.pi * (1 - 2 * ty / n))) + ) + + max_lat = lat(y) + min_lat = lat(y + 1) + return min_lon, min_lat, max_lon, max_lat + + +def is_navmark(cls): + return cls in LIGHT_NAV_EXACT or cls.startswith(LIGHT_NAV_PREFIX) + + +def classify(cls): + flags = set() + if cls in LAND: + flags.add("land") + if cls in DEPTH: + flags.add("depth") + if cls in CONTOUR: + flags.add("contour") + if is_navmark(cls): + flags.add("nav") + if cls in HAZARD: + flags.add("hazard") + return flags + + +def main(): + a = args() + if a.password is None: + a.password = getpass.getpass("MySQL password: ") + + outdir = Path(a.output_dir).resolve() + outdir.mkdir(parents=True, exist_ok=True) + + conn = pymysql.connect( + host=a.host, + port=a.port, + user=a.user, + password=a.password, + database=a.database, + charset="utf8mb4", + cursorclass=SSDictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + ) + + tiles = {} + + try: + with conn.cursor() as cur: + try: + cur.execute("SET SESSION TRANSACTION READ ONLY") + except Exception: + pass + try: + cur.execute("START TRANSACTION READ ONLY") + except Exception: + cur.execute("START TRANSACTION") + + cur.execute( + """ + SELECT + object_class, + geometry_type, + native_scale, + bbox_min_lon, + bbox_min_lat, + bbox_max_lon, + bbox_max_lat + FROM chart_feature + WHERE dataset_id=%s + AND bbox_min_lon IS NOT NULL + AND bbox_min_lat IS NOT NULL + AND bbox_max_lon IS NOT NULL + AND bbox_max_lat IS NOT NULL + AND bbox_max_lon >= %s + AND bbox_min_lon <= %s + AND bbox_max_lat >= %s + AND bbox_min_lat <= %s + """, + ( + a.dataset_id, + a.min_lon, + a.max_lon, + a.min_lat, + a.max_lat, + ), + ) + + scanned = 0 + + for row in cur: + scanned += 1 + + lon = ( + float(row["bbox_min_lon"]) + + float(row["bbox_max_lon"]) + ) / 2.0 + lat = ( + float(row["bbox_min_lat"]) + + float(row["bbox_max_lat"]) + ) / 2.0 + + if not ( + a.min_lon <= lon <= a.max_lon + and a.min_lat <= lat <= a.max_lat + ): + continue + + x, y = lonlat_to_tile(lon, lat, Z) + key = (x, y) + + if key not in tiles: + tiles[key] = { + "feature_count": 0, + "detail_feature_count": 0, + "classes": Counter(), + "geometry": Counter(), + "flags": Counter(), + "native_scales": Counter(), + } + + t = tiles[key] + cls = str(row["object_class"] or "") + geom = str(row["geometry_type"] or "") + scale = int(row["native_scale"] or 999999999) + + t["feature_count"] += 1 + t["classes"][cls] += 1 + t["geometry"][geom] += 1 + t["native_scales"][scale] += 1 + + if scale <= DETAIL_SCALE_LIMIT: + t["detail_feature_count"] += 1 + + for flag in classify(cls): + t["flags"][flag] += 1 + + conn.rollback() + + finally: + conn.close() + + rows = [] + + for (x, y), t in tiles.items(): + flags = t["flags"] + + required_present = sum( + 1 + for name in ("land", "depth", "contour", "nav", "hazard") + if flags[name] > 0 + ) + + hard_gate_present = ( + int(flags["nav"] > 0) + + int(flags["hazard"] > 0) + + int(flags["depth"] > 0) + ) + + # 先奖励类别闭环,再奖励细尺度和总要素。 + score = ( + required_present * 1_000_000 + + hard_gate_present * 250_000 + + min(t["detail_feature_count"], 10000) * 100 + + min(t["feature_count"], 100000) + ) + + min_lon, min_lat, max_lon, max_lat = tile_bounds(Z, x, y) + + rows.append({ + "score": score, + "z": Z, + "x": x, + "y": y, + "tile_path": f"{Z}/{x}/{y}.pbf", + "center_lon": (min_lon + max_lon) / 2, + "center_lat": (min_lat + max_lat) / 2, + "min_lon": min_lon, + "min_lat": min_lat, + "max_lon": max_lon, + "max_lat": max_lat, + "feature_count": t["feature_count"], + "detail_feature_count_le_50000": t["detail_feature_count"], + "required_groups_present": required_present, + "land_count": flags["land"], + "depth_count": flags["depth"], + "contour_count": flags["contour"], + "navmark_light_count": flags["nav"], + "hazard_count": flags["hazard"], + "point_count": t["geometry"]["POINT"], + "line_count": t["geometry"]["LINE"], + "area_count": t["geometry"]["AREA"], + "top_classes": [ + {"class": k, "count": v} + for k, v in t["classes"].most_common(15) + ], + "native_scales": [ + {"scale": k, "count": v} + for k, v in sorted(t["native_scales"].items()) + ], + }) + + rows.sort( + key=lambda r: ( + r["score"], + r["detail_feature_count_le_50000"], + r["feature_count"], + ), + reverse=True, + ) + + top = rows[: a.top] + + csv_path = outdir / "cm95_pbf_aoi_candidates_v1.csv" + json_path = outdir / "cm95_pbf_aoi_candidates_v1.json" + txt_path = outdir / "cm95_pbf_aoi_candidates_v1.txt" + + csv_fields = [ + "rank", "score", "z", "x", "y", "tile_path", + "center_lon", "center_lat", + "min_lon", "min_lat", "max_lon", "max_lat", + "feature_count", "detail_feature_count_le_50000", + "required_groups_present", + "land_count", "depth_count", "contour_count", + "navmark_light_count", "hazard_count", + "point_count", "line_count", "area_count", + "top_classes", "native_scales", + ] + + with csv_path.open("w", encoding="utf-8-sig", newline="") as f: + w = csv.DictWriter(f, fieldnames=csv_fields) + w.writeheader() + for i, row in enumerate(top, 1): + r = dict(row) + r["rank"] = i + r["top_classes"] = json.dumps( + r["top_classes"], ensure_ascii=False + ) + r["native_scales"] = json.dumps( + r["native_scales"], ensure_ascii=False + ) + w.writerow(r) + + json_path.write_text( + json.dumps( + { + "version": "v1", + "generated_at": datetime.now().isoformat(timespec="seconds"), + "dataset_id": a.dataset_id, + "search_bbox": [ + a.min_lon, a.min_lat, a.max_lon, a.max_lat + ], + "z": Z, + "candidate_count": len(rows), + "top": top, + }, + ensure_ascii=False, + indent=2, + ), + encoding="utf-8", + ) + + lines = [ + "CM95 → NavSea PBF 第一测试 AOI 候选 v1", + "=" * 86, + f"Dataset ID: {a.dataset_id}", + f"扫描范围: lon {a.min_lon}..{a.max_lon}, lat {a.min_lat}..{a.max_lat}", + "", + ] + + for i, r in enumerate(top[:15], 1): + lines += [ + ( + f"#{i:02d} z{r['z']}/{r['x']}/{r['y']} " + f"center=({r['center_lon']:.5f},{r['center_lat']:.5f}) " + f"features={r['feature_count']} " + f"detail={r['detail_feature_count_le_50000']} " + f"groups={r['required_groups_present']}/5" + ), + ( + f" land={r['land_count']} depth={r['depth_count']} " + f"contour={r['contour_count']} " + f"nav={r['navmark_light_count']} " + f"hazard={r['hazard_count']}" + ), + ] + + lines += [ + "", + "下一步:把 JSON 或 CSV 上传给 ChatGPT。", + "ChatGPT 会选一个最适合的 tile,并告诉你需要提供的现有 NavSea PBF z10/z11/z12 路径。", + ] + + txt_path.write_text("\n".join(lines), encoding="utf-8") + + print("\n".join(lines)) + print("") + print("输出:") + print(csv_path) + print(json_path) + print(txt_path) + + +if __name__ == "__main__": + main() diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_Cell清单_v1.csv b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_Cell清单_v1.csv new file mode 100644 index 0000000..968527b --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_Cell清单_v1.csv @@ -0,0 +1,8 @@ +cell_id,source_relative_path,source_file_name,scale_code,native_scale,cell_name,feature_count,attribute_count,bbox_min_lon,bbox_min_lat,bbox_max_lon,bbox_max_lat +693,03900420\F\03910424.F,03910424.F,F,20000,03910424,2279,3432,141.3333299246928,40.333332355444654,141.66666320214676,40.66666571671767 +351,03900420\E\03910424.E,03910424.E,E,50000,03910424,1026,1207,141.33333333333331,40.333333333333314,141.66666666666666,40.66666666666665 +113,03900420\D\03900423.D,03900423.D,D,100000,03900423,125,202,141.0,40.0,142.0,41.0 +40,03900420\C\03900420.C,03900420.C,C,200000,03900420,6725,9241,139.99999664723882,39.99999899417164,143.99999647960075,43.999998910352616 +12,03900420\B\03900420.B,03900420.B,B,1000000,03900420,2047,3738,139.99999664723882,39.99999899417164,149.99999639578172,49.999998826533584 +4,03900420\A\03900420.A,03900420.A,A,3000000,03900420,414,280,140.0,40.0,160.0,60.0 +784,03900360\Z\03900360.Z,03900360.Z,Z,20000000,03900360,195,102,120.0,40.0,160.0,80.0 diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_Feature样本_v1.jsonl b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_Feature样本_v1.jsonl new file mode 100644 index 0000000..b1a0143 --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_Feature样本_v1.jsonl @@ -0,0 +1,600 @@ +{"feature_id": 604514, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 14, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.48240163792386, "bbox_min_lat": 40.526190070337684, "bbox_max_lon": 141.50641424823823, "bbox_max_lat": 40.54307822725843, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:14:area"} +{"feature_id": 604519, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 19, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.50556991582724, "bbox_min_lat": 40.55430583427656, "bbox_max_lon": 141.52833637288447, "bbox_max_lat": 40.558930511994106, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:19:area"} +{"feature_id": 604550, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 50, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.52219207437574, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.52462843115197, "bbox_max_lat": 40.52362749764253, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:50:area"} +{"feature_id": 512947, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 17, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.5240011656172, "bbox_min_lat": 40.54009534689111, "bbox_max_lon": 141.53088298455424, "bbox_max_lat": 40.54618996679383, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:17:area"} +{"feature_id": 512948, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 18, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.48626560412873, "bbox_min_lat": 40.53205814052522, "bbox_max_lon": 141.50629561371784, "bbox_max_lat": 40.54309443682702, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:18:area"} +{"feature_id": 513001, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 71, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.5644019696208, "bbox_min_lat": 40.54113741878584, "bbox_max_lon": 141.56583631769195, "bbox_max_lat": 40.542530211517395, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:71:area"} +{"feature_id": 513042, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 112, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.4848973784864, "bbox_min_lat": 40.560496674008796, "bbox_max_lon": 141.48612318658974, "bbox_max_lat": 40.561665470596104, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:112:area"} +{"feature_id": 513113, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 183, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.50382365214844, "bbox_min_lat": 40.53037533959098, "bbox_max_lon": 141.5042356457433, "bbox_max_lat": 40.53107185144783, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:183:area"} +{"feature_id": 513120, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 190, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.48924111342524, "bbox_min_lat": 40.52480806859645, "bbox_max_lon": 141.52280078921723, "bbox_max_lat": 40.524813153073175, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:190:area"} +{"feature_id": 513147, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 217, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.47966862026965, "bbox_min_lat": 40.53205305659812, "bbox_max_lon": 141.48926145878795, "bbox_max_lat": 40.53205814052522, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:217:area"} +{"feature_id": 355899, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 227, "object_class_id": 194, "object_class": "$AREAS", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.48360203301593, "bbox_min_lat": 40.54546919941691, "bbox_max_lon": 141.52089508130248, "bbox_max_lat": 40.56594792583181, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "II25"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:227:area"} +{"feature_id": 606645, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2145, "object_class_id": 191, "object_class": "$COMPS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5797389231571, "bbox_min_lat": 40.57465202664078, "bbox_max_lon": 141.5797389231571, "bbox_max_lat": 40.57465202664078, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$ANNCH": "00.00 E", "$CYEAR": 2012, "$VARIA": "08.25 W"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2145:point"} +{"feature_id": 606646, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2146, "object_class_id": 191, "object_class": "$COMPS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.56779619724773, "bbox_min_lat": 40.530232024536936, "bbox_max_lon": 141.56779619724773, "bbox_max_lat": 40.530232024536936, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$ANNCH": "00.00 E", "$CYEAR": 2012, "$VARIA": "08.25 W"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2146:point"} +{"feature_id": 606647, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2147, "object_class_id": 191, "object_class": "$COMPS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.48432936071757, "bbox_min_lat": 40.541060209705, "bbox_max_lon": 141.48432936071757, "bbox_max_lat": 40.541060209705, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$ANNCH": "00.00 E", "$CYEAR": 2012, "$VARIA": "08.25 W"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2147:point"} +{"feature_id": 606648, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2148, "object_class_id": 191, "object_class": "$COMPS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.51307735340913, "bbox_min_lat": 40.57465202664078, "bbox_max_lon": 141.51307735340913, "bbox_max_lat": 40.57465202664078, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$ANNCH": "00.00 E", "$CYEAR": 2012, "$VARIA": "08.25 W"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2148:point"} +{"feature_id": 513873, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 943, "object_class_id": 191, "object_class": "$COMPS", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.52882301657974, "bbox_min_lat": 40.54675416127495, "bbox_max_lon": 141.52882301657974, "bbox_max_lat": 40.54675416127495, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$ANNCH": "01.00 W", "$CYEAR": 2002, "$VARIA": "08.25 W"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:943:point"} +{"feature_id": 605626, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1126, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.55866621726165, "bbox_min_lat": 40.562812961762916, "bbox_max_lon": 141.5593884775168, "bbox_max_lat": 40.56311785665859, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IH40"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1126:line"} +{"feature_id": 605627, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1127, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.55866621726165, "bbox_min_lat": 40.56294508305488, "bbox_max_lon": 141.55873233967938, "bbox_max_lat": 40.56311785665859, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IH40"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1127:line"} +{"feature_id": 605628, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1128, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.55866621726165, "bbox_min_lat": 40.56311785665859, "bbox_max_lon": 141.55889510255378, "bbox_max_lat": 40.56316867233952, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IH40"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1128:line"} +{"feature_id": 605629, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1129, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.56042609084113, "bbox_min_lat": 40.56204563679645, "bbox_max_lon": 141.56066514881292, "bbox_max_lat": 40.562055800098534, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IH41"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1129:line"} +{"feature_id": 605630, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1130, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.56065497613326, "bbox_min_lat": 40.562055800098534, "bbox_max_lon": 141.56066514881292, "bbox_max_lat": 40.56223365763497, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IH41"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1130:line"} +{"feature_id": 605631, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1131, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.5600598743737, "bbox_min_lat": 40.562055800098534, "bbox_max_lon": 141.56066514881292, "bbox_max_lat": 40.56248265739202, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IH41"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1131:line"} +{"feature_id": 513535, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 605, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 130, "coverage_id": 1759, "bbox_min_lon": 141.514311686626, "bbox_min_lat": 40.543114769181905, "bbox_max_lon": 141.51596474734632, "bbox_max_lat": 40.54461426334148, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IK1"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:605:line"} +{"feature_id": 513536, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 606, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 130, "coverage_id": 1759, "bbox_min_lon": 141.5171142603395, "bbox_min_lat": 40.54540211970138, "bbox_max_lon": 141.51750082223097, "bbox_max_lat": 40.545676596514554, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IK1"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:606:line"} +{"feature_id": 513537, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 607, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 130, "coverage_id": 1759, "bbox_min_lon": 141.51596474734632, "bbox_min_lat": 40.54461426334148, "bbox_max_lon": 141.5171142603395, "bbox_max_lat": 40.54540211970138, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IK1"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:607:line"} +{"feature_id": 513538, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 608, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 130, "coverage_id": 1759, "bbox_min_lon": 141.56166551833616, "bbox_min_lat": 40.564191017875025, "bbox_max_lon": 141.56253019625137, "bbox_max_lat": 40.56450098793721, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IH40"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:608:line"} +{"feature_id": 513539, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 609, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 130, "coverage_id": 1759, "bbox_min_lon": 141.56166551833616, "bbox_min_lat": 40.56331191464415, "bbox_max_lon": 141.56478344517163, "bbox_max_lat": 40.564191017875025, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IH40"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:609:line"} +{"feature_id": 513540, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 610, "object_class_id": 193, "object_class": "$LINES", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 130, "coverage_id": 1759, "bbox_min_lon": 141.56166551833616, "bbox_min_lat": 40.56353042114975, "bbox_max_lon": 141.56207242559037, "bbox_max_lat": 40.564191017875025, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"$SCODE": "IH40"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:610:line"} +{"feature_id": 604950, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 450, "object_class_id": 4, "object_class": "ACHARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5441192853618, "bbox_min_lat": 40.558930511994106, "bbox_max_lon": 141.55827456909512, "bbox_max_lat": 40.56973373383364, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATACH": [5]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:450:area"} +{"feature_id": 513194, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 264, "object_class_id": 4, "object_class": "ACHARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.54422445615202, "bbox_min_lat": 40.55892130718866, "bbox_max_lon": 141.55849672809387, "bbox_max_lat": 40.56979058361586, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATACH": [5]}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:264:area"} +{"feature_id": 606117, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1617, "object_class_id": 1, "object_class": "AIRARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.46890757836783, "bbox_min_lat": 40.55140889540878, "bbox_max_lon": 141.46890757836783, "bbox_max_lat": 40.55140889540878, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Hachinohe Airfield"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1617:point"} +{"feature_id": 359255, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 3583, "object_class_id": 1, "object_class": "AIRARE", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 1, "coverage_id": 1255, "bbox_min_lon": 141.3656803156843, "bbox_min_lat": 40.70594661568029, "bbox_max_lon": 141.3656803156843, "bbox_max_lat": 40.70594661568029, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:3583:point"} +{"feature_id": 359256, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 3584, "object_class_id": 1, "object_class": "AIRARE", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 1, "coverage_id": 1255, "bbox_min_lon": 141.46889233639226, "bbox_min_lat": 40.551963132302625, "bbox_max_lon": 141.46889233639226, "bbox_max_lat": 40.551963132302625, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:3584:point"} +{"feature_id": 606473, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1973, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.54682521814877, "bbox_min_lat": 40.5377458524923, "bbox_max_lon": 141.54682521814877, "bbox_max_lat": 40.5377458524923, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATLAM": 2, "COLMAR": 3, "INFORM": "Metal", "SORIND": "GB,UKHO,graph,LL M-6623", "VERLEN": 10, "_cm93_relation20_raw": 2256}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1973:point"} +{"feature_id": 606474, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1974, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.5279752427569, "bbox_min_lat": 40.55872215426594, "bbox_max_lon": 141.5279752427569, "bbox_max_lat": 40.55872215426594, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATLAM": 2, "COLMAR": 3, "INFORM": "Concrete", "SORIND": "GB,UKHO,graph,LL M-6624.8", "VERLEN": 16, "_cm93_relation20_raw": 2251}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1974:point"} +{"feature_id": 606475, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1975, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.53323451813606, "bbox_min_lat": 40.53630720776126, "bbox_max_lon": 141.53323451813606, "bbox_max_lat": 40.53630720776126, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATLAM": 2, "COLMAR": 3, "SORIND": "GB,UKHO,graph,LL M-6623.6", "VERLEN": 9, "_cm93_relation20_raw": 2273}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1975:point"} +{"feature_id": 606476, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1976, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.52043728713608, "bbox_min_lat": 40.53762384848427, "bbox_max_lon": 141.52043728713608, "bbox_max_lat": 40.53762384848427, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATLAM": 2, "COLMAR": 3, "SORIND": "GB,UKHO,graph,LL M-6624.7", "VERLEN": 9, "_cm93_relation20_raw": 2272}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1976:point"} +{"feature_id": 606477, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1977, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.55245070999536, "bbox_min_lat": 40.53446183378157, "bbox_max_lon": 141.55245070999536, "bbox_max_lat": 40.53446183378157, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATLAM": 2, "COLMAR": 3, "SORIND": "GB,UKHO,graph,LL M-6624", "VERLEN": 10, "_cm93_relation20_raw": 2254}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1977:point"} +{"feature_id": 513782, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 852, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 161, "coverage_id": 1759, "bbox_min_lon": 141.54681340355705, "bbox_min_lat": 40.537767147215504, "bbox_max_lon": 141.54681340355705, "bbox_max_lat": 40.537767147215504, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BCNSHP": 3, "CATLAM": 2, "COLMAR": 3, "INFORM": "Metal|Framework tower", "SORIND": "GB,MDHS,graph,LL F-6623", "VERLEN": 10, "_cm93_relation20_raw": 1004}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:852:point"} +{"feature_id": 513783, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 853, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 161, "coverage_id": 1759, "bbox_min_lon": 141.53316675151854, "bbox_min_lat": 40.53632341943859, "bbox_max_lon": 141.53316675151854, "bbox_max_lat": 40.53632341943859, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BCNSHP": 3, "CATLAM": 2, "COLMAR": 3, "SORIND": "GB,MDHS,graph,LL F-6623.6", "VERLEN": 9, "_cm93_relation20_raw": 1013}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:853:point"} +{"feature_id": 513784, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 854, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 161, "coverage_id": 1759, "bbox_min_lon": 141.5280092020713, "bbox_min_lat": 40.558667212294104, "bbox_max_lon": 141.5280092020713, "bbox_max_lat": 40.558667212294104, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATLAM": 2, "COLMAR": 3, "INFORM": "Concrete", "SORIND": "GB,MDHS,graph,LL F-6624.8", "VERLEN": 16, "_cm93_relation20_raw": 1018}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:854:point"} +{"feature_id": 513785, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 855, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 161, "coverage_id": 1759, "bbox_min_lon": 141.52035425935122, "bbox_min_lat": 40.53766039376199, "bbox_max_lon": 141.52035425935122, "bbox_max_lat": 40.53766039376199, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BCNSHP": 3, "CATLAM": 2, "COLMAR": 3, "SORIND": "GB,MDHS,graph,LL F-6624.7", "VERLEN": 9, "_cm93_relation20_raw": 1008}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:855:point"} +{"feature_id": 513786, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 856, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 161, "coverage_id": 1759, "bbox_min_lon": 141.5524745007314, "bbox_min_lat": 40.53454921840199, "bbox_max_lon": 141.5524745007314, "bbox_max_lat": 40.53454921840199, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BCNSHP": 3, "CATLAM": 2, "COLMAR": 3, "SORIND": "GB,MDHS,graph,LL F-6624", "VERLEN": 10, "_cm93_relation20_raw": 1007}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:856:point"} +{"feature_id": 360094, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 4422, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 161, "coverage_id": 1255, "bbox_min_lon": 141.54707956201432, "bbox_min_lat": 40.53735089780069, "bbox_max_lon": 141.54707956201432, "bbox_max_lat": 40.53735089780069, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATLAM": 2, "COLMAR": 3, "INFORM": "Metal", "SORIND": "GB,UKHO,graph,LL M-6623", "VERLEN": 10, "_cm93_relation20_raw": 6632}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:4422:point"} +{"feature_id": 360111, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 4439, "object_class_id": 7, "object_class": "BCNLAT", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 161, "coverage_id": 1255, "bbox_min_lon": 141.52785319505807, "bbox_min_lat": 40.55864373294613, "bbox_max_lon": 141.52785319505807, "bbox_max_lat": 40.55864373294613, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATLAM": 2, "COLMAR": 3, "INFORM": "Concrete", "SORIND": "GB,UKHO,graph,LL M-6624.8", "VERLEN": 16, "_cm93_relation20_raw": 6602}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:4439:point"} +{"feature_id": 606478, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1978, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.53411954126562, "bbox_min_lat": 40.53822878284375, "bbox_max_lon": 141.53411954126562, "bbox_max_lat": 40.53822878284375, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLMAR": 5, "SORIND": "GB,UKHO,graph,LL M-6623.2", "VERLEN": 9, "_cm93_relation20_raw": 2255}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1978:point"} +{"feature_id": 606479, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1979, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5108444502259, "bbox_min_lat": 40.531909745248655, "bbox_max_lon": 141.5108444502259, "bbox_max_lat": 40.531909745248655, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSPM": 6}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1979:point"} +{"feature_id": 606480, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1980, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.51061556493377, "bbox_min_lat": 40.53027778111349, "bbox_max_lon": 141.51061556493377, "bbox_max_lat": 40.53027778111349, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSPM": 6}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1980:point"} +{"feature_id": 606481, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1981, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.57670746462134, "bbox_min_lat": 40.53993171998525, "bbox_max_lon": 141.57670746462134, "bbox_max_lat": 40.53993171998525, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1981:point"} +{"feature_id": 513787, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 857, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.51056813988717, "bbox_min_lat": 40.53031941496734, "bbox_max_lon": 141.51056813988717, "bbox_max_lat": 40.53031941496734, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSPM": 6}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:857:point"} +{"feature_id": 513788, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 858, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.510807197899, "bbox_min_lat": 40.53193104223212, "bbox_max_lon": 141.510807197899, "bbox_max_lat": 40.53193104223212, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSPM": 6}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:858:point"} +{"feature_id": 513789, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 859, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.57687367696272, "bbox_min_lat": 40.54005976366212, "bbox_max_lon": 141.57687367696272, "bbox_max_lat": 40.54005976366212, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:859:point"} +{"feature_id": 360210, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 4538, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 161, "coverage_id": 1255, "bbox_min_lon": 141.53426198404347, "bbox_min_lat": 40.53797541747083, "bbox_max_lon": 141.53426198404347, "bbox_max_lat": 40.53797541747083, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLMAR": 5, "SORIND": "GB,UKHO,graph,LL M-6623.2", "VERLEN": 9, "_cm93_relation20_raw": 6663}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:4538:point"} +{"feature_id": 360211, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 4539, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 161, "coverage_id": 1255, "bbox_min_lon": 141.47084549113066, "bbox_min_lat": 40.54653075073066, "bbox_max_lon": 141.47084549113066, "bbox_max_lat": 40.54653075073066, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Metal", "SORIND": "GB,UKHO,graph,LL M-6625", "VERLEN": 43, "_cm93_relation20_raw": 6720}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:4539:point"} +{"feature_id": 360212, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 4540, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 161, "coverage_id": 1255, "bbox_min_lon": 141.3592715266989, "bbox_min_lat": 40.68775404209214, "bbox_max_lon": 141.3592715266989, "bbox_max_lat": 40.68775404209214, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Metal", "SORIND": "GB,UKHO,graph,LL M-6626", "_cm93_relation20_raw": 6620}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:4540:point"} +{"feature_id": 329077, "cell_id": 12, "source_relative_path": "03900420\\B\\03900420.B", "source_record_index": 1254, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "B", "native_scale": 1000000, "raw_geotype": 161, "coverage_id": 1184, "bbox_min_lon": 141.47157794882685, "bbox_min_lat": 40.54722276035132, "bbox_max_lon": 141.47157794882685, "bbox_max_lat": 40.54722276035132, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSPM": 27, "INFORM": "Metal", "SORIND": "GB,UKHO,graph,LL M-6625", "VERLEN": 43, "_cm93_relation20_raw": 2039}, "suggested_source_id": "cm95:1:03900420/B/03900420.B:1254:point"} +{"feature_id": 329081, "cell_id": 12, "source_relative_path": "03900420\\B\\03900420.B", "source_record_index": 1258, "object_class_id": 9, "object_class": "BCNSPP", "geometry_type": "POINT", "scale_code": "B", "native_scale": 1000000, "raw_geotype": 161, "coverage_id": 1184, "bbox_min_lon": 141.35805082775352, "bbox_min_lat": 40.68748385272822, "bbox_max_lon": 141.35805082775352, "bbox_max_lat": 40.68748385272822, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Metal", "SORIND": "GB,UKHO,graph,LL M-6626", "_cm93_relation20_raw": 2041}, "suggested_source_id": "cm95:1:03900420/B/03900420.B:1258:point"} +{"feature_id": 606482, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1982, "object_class_id": 20, "object_class": "BOYSPP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.51602234416788, "bbox_min_lat": 40.54453705850963, "bbox_max_lon": 141.51602234416788, "bbox_max_lat": 40.54453705850963, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BOYSHP": 1, "CATSPM": 27, "COLMAR": 4, "STATUS": [8], "_cm93_relation20_raw": 2248}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1982:point"} +{"feature_id": 606483, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1983, "object_class_id": 20, "object_class": "BOYSPP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.5144252334628, "bbox_min_lat": 40.54336796282291, "bbox_max_lon": 141.5144252334628, "bbox_max_lat": 40.54336796282291, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BOYSHP": 1, "CATSPM": 27, "COLMAR": 4, "STATUS": [8], "_cm93_relation20_raw": 2249}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1983:point"} +{"feature_id": 606484, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1984, "object_class_id": 20, "object_class": "BOYSPP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.51764488657207, "bbox_min_lat": 40.545787460007524, "bbox_max_lon": 141.51764488657207, "bbox_max_lat": 40.545787460007524, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BOYSHP": 1, "CATSPM": 27, "COLMAR": 4, "STATUS": [8], "_cm93_relation20_raw": 2246}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1984:point"} +{"feature_id": 606485, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1985, "object_class_id": 20, "object_class": "BOYSPP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.55372738129145, "bbox_min_lat": 40.53761368147356, "bbox_max_lon": 141.55372738129145, "bbox_max_lat": 40.53761368147356, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BOYSHP": 4, "COLMAR": 4, "STATUS": [8], "_cm93_relation20_raw": 2247}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1985:point"} +{"feature_id": 606486, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1986, "object_class_id": 20, "object_class": "BOYSPP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.54760851448182, "bbox_min_lat": 40.55077866754792, "bbox_max_lon": 141.54760851448182, "bbox_max_lat": 40.55077866754792, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BOYSHP": 4, "COLMAR": 4, "STATUS": [8], "_cm93_relation20_raw": 2250}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1986:point"} +{"feature_id": 606487, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1987, "object_class_id": 20, "object_class": "BOYSPP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.54756782376322, "bbox_min_lat": 40.54819670438723, "bbox_max_lon": 141.54756782376322, "bbox_max_lat": 40.54819670438723, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BOYSHP": 4, "COLMAR": 4, "STATUS": [8], "_cm93_relation20_raw": 2245}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1987:point"} +{"feature_id": 513790, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 860, "object_class_id": 20, "object_class": "BOYSPP", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 161, "coverage_id": 1759, "bbox_min_lon": 141.5684761285037, "bbox_min_lat": 40.56065929040829, "bbox_max_lon": 141.5684761285037, "bbox_max_lat": 40.56065929040829, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BOYSHP": 1, "CATSPM": 10, "COLMAR": 4, "INFORM": "Private mark|Wave recorder", "_cm93_relation20_raw": 999}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:860:point"} +{"feature_id": 513791, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 861, "object_class_id": 20, "object_class": "BOYSPP", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 161, "coverage_id": 1759, "bbox_min_lon": 141.51750082223097, "bbox_min_lat": 40.5455495240557, "bbox_max_lon": 141.51750082223097, "bbox_max_lat": 40.5455495240557, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BOYSHP": 1, "CATSPM": 13, "COLMAR": 4, "_cm93_relation20_raw": 1000}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:861:point"} +{"feature_id": 605092, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 592, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.52348400469134, "bbox_min_lat": 40.52173601209488, "bbox_max_lon": 141.52437920050053, "bbox_max_lat": 40.52204617870608, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:592:line"} +{"feature_id": 356988, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1316, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.52370274123894, "bbox_min_lat": 40.52167354722334, "bbox_max_lon": 141.5250455351216, "bbox_max_lat": 40.522110813885774, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1316:line"} +{"feature_id": 356990, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1318, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.47835292965644, "bbox_min_lat": 40.52104887561479, "bbox_max_lon": 141.4791463987689, "bbox_max_lat": 40.521486146352, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1318:line"} +{"feature_id": 356995, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1323, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.402668183543, "bbox_min_lat": 40.59603029763058, "bbox_max_lon": 141.4032175083132, "bbox_max_lat": 40.59665426997741, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1323:line"} +{"feature_id": 604954, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 454, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.51496438548423, "bbox_min_lat": 40.52731879151409, "bbox_max_lon": 141.5275683355709, "bbox_max_lat": 40.53483802984688, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Vertical Datum: Nearly highest high water", "OBJNAM": "Hachinohe Bridge", "VERCLR": 31}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:454:area"} +{"feature_id": 604955, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 455, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.50174498827877, "bbox_min_lat": 40.53866087547059, "bbox_max_lon": 141.5089777635101, "bbox_max_lat": 40.54449639465438, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Hattaro Bridge"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:455:area"} +{"feature_id": 604959, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 459, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.482833976809, "bbox_min_lat": 40.52831022010887, "bbox_max_lon": 141.48914103819214, "bbox_max_lat": 40.529779541153175, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "The Numadate Bridge"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:459:area"} +{"feature_id": 604972, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 472, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.4898785574668, "bbox_min_lat": 40.53319596934804, "bbox_max_lon": 141.49215215136863, "bbox_max_lat": 40.53527014434237, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "The Shin-O-Hashi Bridge"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:472:area"} +{"feature_id": 604977, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 477, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5257881166321, "bbox_min_lat": 40.533745021918726, "bbox_max_lon": 141.5267596075387, "bbox_max_lat": 40.53444149879896, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Vertical Datum: Nearly highest high water|Vertical clearance 4.5m - 5.5m", "VERCLR": 4.5}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:477:area"} +{"feature_id": 604979, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 479, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.52516249683362, "bbox_min_lat": 40.53330272992247, "bbox_max_lon": 141.52600174290475, "bbox_max_lat": 40.53390261951076, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Vertical Datum: Nearly highest high water|Vertical clearance 4.5m - 5.5m", "OBJNAM": "Seagull Bridge", "VERCLR": 5.300000190734863}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:479:area"} +{"feature_id": 604983, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 483, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.5234992637108, "bbox_min_lat": 40.52097838597756, "bbox_max_lon": 141.52466912187057, "bbox_max_lat": 40.521497030284365, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:483:area"} +{"feature_id": 604984, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 484, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.52300588874778, "bbox_min_lat": 40.52218854978475, "bbox_max_lon": 141.52404858841192, "bbox_max_lat": 40.52259023798374, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:484:area"} +{"feature_id": 604985, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 485, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.52215138365713, "bbox_min_lat": 40.52317496966713, "bbox_max_lon": 141.5231330472434, "bbox_max_lat": 40.52363766677541, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Minato Bridge"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:485:area"} +{"feature_id": 604991, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 491, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.4613289320284, "bbox_min_lat": 40.58684966151635, "bbox_max_lon": 141.46190877476846, "bbox_max_lat": 40.586946177037234, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Ichikawa Bridge"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:491:area"} +{"feature_id": 604996, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 496, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.46794117380105, "bbox_min_lat": 40.5893793380977, "bbox_max_lon": 141.46821583615161, "bbox_max_lat": 40.589475849967826, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:496:area"} +{"feature_id": 604997, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 497, "object_class_id": 11, "object_class": "BRIDGE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.46707140969096, "bbox_min_lat": 40.5916193934965, "bbox_max_lon": 141.46731555400257, "bbox_max_lat": 40.59173114032683, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:497:area"} +{"feature_id": 606118, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1618, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55108757092222, "bbox_min_lat": 40.53333831674283, "bbox_max_lon": 141.55108757092222, "bbox_max_lat": 40.53333831674283, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "1"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1618:point"} +{"feature_id": 606119, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1619, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5020349096488, "bbox_min_lat": 40.53115223412844, "bbox_max_lon": 141.5020349096488, "bbox_max_lat": 40.53115223412844, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "1"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1619:point"} +{"feature_id": 606120, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1620, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.48699460278593, "bbox_min_lat": 40.557111171404564, "bbox_max_lon": 141.48699460278593, "bbox_max_lat": 40.557111171404564, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "1"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1620:point"} +{"feature_id": 606121, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1621, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.54962270505257, "bbox_min_lat": 40.53038963039137, "bbox_max_lon": 141.54962270505257, "bbox_max_lat": 40.53038963039137, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "2"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1621:point"} +{"feature_id": 606122, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1622, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.48800678441114, "bbox_min_lat": 40.556755428638965, "bbox_max_lon": 141.48800678441114, "bbox_max_lat": 40.556755428638965, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "2"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1622:point"} +{"feature_id": 606123, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1623, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.49382047083125, "bbox_min_lat": 40.53163521200654, "bbox_max_lon": 141.49382047083125, "bbox_max_lat": 40.53163521200654, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "2"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1623:point"} +{"feature_id": 606124, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1624, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52261424058122, "bbox_min_lat": 40.53258590565955, "bbox_max_lon": 141.52261424058122, "bbox_max_lat": 40.53258590565955, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "2"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1624:point"} +{"feature_id": 606125, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1625, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.4971113326981, "bbox_min_lat": 40.55358415245652, "bbox_max_lon": 141.4971113326981, "bbox_max_lat": 40.55358415245652, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "3"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1625:point"} +{"feature_id": 606126, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1626, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.54800016264838, "bbox_min_lat": 40.529616849751626, "bbox_max_lon": 141.54800016264838, "bbox_max_lat": 40.529616849751626, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "3"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1626:point"} +{"feature_id": 606127, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1627, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52164274967464, "bbox_min_lat": 40.53336881971666, "bbox_max_lon": 141.52164274967464, "bbox_max_lat": 40.53336881971666, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "3"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1627:point"} +{"feature_id": 606128, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1628, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52041185543695, "bbox_min_lat": 40.53429915374781, "bbox_max_lon": 141.52041185543695, "bbox_max_lat": 40.53429915374781, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "4"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1628:point"} +{"feature_id": 606129, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1629, "object_class_id": 10, "object_class": "BRTFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5460012310971, "bbox_min_lat": 40.52946941032777, "bbox_max_lon": 141.5460012310971, "bbox_max_lat": 40.52946941032777, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "4"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1629:point"} +{"feature_id": 606176, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1676, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5023960397764, "bbox_min_lat": 40.538406703674674, "bbox_max_lon": 141.5023960397764, "bbox_max_lat": 40.538406703674674, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Tate"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1676:point"} +{"feature_id": 606177, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1677, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5323088042879, "bbox_min_lat": 40.52455288241755, "bbox_max_lon": 141.5323088042879, "bbox_max_lat": 40.52455288241755, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Osawa"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1677:point"} +{"feature_id": 606178, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1678, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55584329865871, "bbox_min_lat": 40.532311375187646, "bbox_max_lon": 141.55584329865871, "bbox_max_lat": 40.532311375187646, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Hinode"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1678:point"} +{"feature_id": 606179, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1679, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.51138360224738, "bbox_min_lat": 40.53952505236351, "bbox_max_lon": 141.51138360224738, "bbox_max_lat": 40.53952505236351, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Toyosu"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1679:point"} +{"feature_id": 606180, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1680, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.49386116154983, "bbox_min_lat": 40.54159903142414, "bbox_max_lon": 141.49386116154983, "bbox_max_lat": 40.54159903142414, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Hattaro"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1680:point"} +{"feature_id": 606181, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1681, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.49041262314842, "bbox_min_lat": 40.546936182273, "bbox_max_lon": 141.49041262314842, "bbox_max_lat": 40.546936182273, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Hasunuma"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1681:point"} +{"feature_id": 606182, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1682, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50835214371162, "bbox_min_lat": 40.53415680839427, "bbox_max_lon": 141.50835214371162, "bbox_max_lat": 40.53415680839427, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Kawaragi"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1682:point"} +{"feature_id": 606183, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1683, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.4815623918527, "bbox_min_lat": 40.56097339975906, "bbox_max_lon": 141.4815623918527, "bbox_max_lat": 40.56097339975906, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Kitanuma"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1683:point"} +{"feature_id": 606184, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1684, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.49126712823906, "bbox_min_lat": 40.529042342579885, "bbox_max_lon": 141.49126712823906, "bbox_max_lat": 40.529042342579885, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Numadate"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1684:point"} +{"feature_id": 606185, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1685, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55269485430696, "bbox_min_lat": 40.525503676544034, "bbox_max_lon": 141.55269485430696, "bbox_max_lat": 40.525503676544034, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Sunamori"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1685:point"} +{"feature_id": 606186, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1686, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5229906297283, "bbox_min_lat": 40.52654597546327, "bbox_max_lon": 141.5229906297283, "bbox_max_lat": 40.52654597546327, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Tatehana"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1686:point"} +{"feature_id": 606187, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1687, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.525121806115, "bbox_min_lat": 40.52382579545554, "bbox_max_lon": 141.525121806115, "bbox_max_lat": 40.52382579545554, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Uenoyama"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1687:point"} +{"feature_id": 356932, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1260, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.48195405870538, "bbox_min_lat": 40.50205608050168, "bbox_max_lon": 141.52370274123894, "bbox_max_lat": 40.53104292280326, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Hachinohe"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1260:area"} +{"feature_id": 356939, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1267, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 4, "coverage_id": 1255, "bbox_min_lon": 141.5200405761044, "bbox_min_lat": 40.52354752712211, "bbox_max_lon": 141.56233858340812, "bbox_max_lat": 40.536476560482114, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1267:area"} +{"feature_id": 356940, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1268, "object_class_id": 14, "object_class": "BUAARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.35310688205578, "bbox_min_lat": 40.67017978633022, "bbox_max_lon": 141.37538505329078, "bbox_max_lat": 40.68794097735286, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Misawa"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1268:area"} +{"feature_id": 606163, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1663, "object_class_id": 12, "object_class": "BUIREL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55765403563643, "bbox_min_lat": 40.538671042322356, "bbox_max_lon": 141.55765403563643, "bbox_max_lat": 40.538671042322356, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATREB": 6}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1663:point"} +{"feature_id": 606164, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1664, "object_class_id": 12, "object_class": "BUIREL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.54299011792065, "bbox_min_lat": 40.521868214432516, "bbox_max_lon": 141.54299011792065, "bbox_max_lat": 40.521868214432516, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATREB": 6}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1664:point"} +{"feature_id": 606165, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1665, "object_class_id": 12, "object_class": "BUIREL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5470744488002, "bbox_min_lat": 40.52239193651546, "bbox_max_lon": 141.5470744488002, "bbox_max_lat": 40.52239193651546, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATREB": 7}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1665:point"} +{"feature_id": 606166, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1666, "object_class_id": 12, "object_class": "BUIREL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55871199432005, "bbox_min_lat": 40.534716020543605, "bbox_max_lon": 141.55871199432005, "bbox_max_lat": 40.534716020543605, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATREB": 7}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1666:point"} +{"feature_id": 513612, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 682, "object_class_id": 12, "object_class": "BUIREL", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.5575354097058, "bbox_min_lat": 40.5387584211606, "bbox_max_lon": 141.5575354097058, "bbox_max_lat": 40.5387584211606, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATREB": 4}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:682:point"} +{"feature_id": 606167, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1667, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50884551867463, "bbox_min_lat": 40.532540150658996, "bbox_max_lon": 141.50884551867463, "bbox_max_lat": 40.532540150658996, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [17], "OBJNAM": "Tohoku Electric Power Thermal Power Plants", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1667:point"} +{"feature_id": 606168, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1668, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.47135919416354, "bbox_min_lat": 40.54817129086928, "bbox_max_lon": 141.47135919416354, "bbox_max_lat": 40.54817129086928, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Japan Maritime Self Defense Force Air Base", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1668:point"} +{"feature_id": 606169, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1669, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5349587873368, "bbox_min_lat": 40.56216759631946, "bbox_max_lon": 141.5349587873368, "bbox_max_lat": 40.56216759631946, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CONVIS": 2, "INFORM": "Light support|Not in use"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1669:point"} +{"feature_id": 606170, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1670, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.48396823059, "bbox_min_lat": 40.55183073816308, "bbox_max_lon": 141.48396823059, "bbox_max_lat": 40.55183073816308, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [5]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1670:point"} +{"feature_id": 606171, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1671, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52620519649776, "bbox_min_lat": 40.52337326881893, "bbox_max_lon": 141.52620519649776, "bbox_max_lat": 40.52337326881893, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [6]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1671:point"} +{"feature_id": 606172, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1672, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.46028623236427, "bbox_min_lat": 40.58774369469495, "bbox_max_lon": 141.46028623236427, "bbox_max_lat": 40.58774369469495, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [6]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1672:point"} +{"feature_id": 606173, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1673, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5438293639918, "bbox_min_lat": 40.52141567458002, "bbox_max_lon": 141.5438293639918, "bbox_max_lat": 40.52141567458002, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [6]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1673:point"} +{"feature_id": 606174, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1674, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55499896624775, "bbox_min_lat": 40.52998798893422, "bbox_max_lon": 141.55499896624775, "bbox_max_lat": 40.52998798893422, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [6]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1674:point"} +{"feature_id": 606175, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1675, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.51179050943338, "bbox_min_lat": 40.52511725916765, "bbox_max_lon": 141.51179050943338, "bbox_max_lat": 40.52511725916765, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [6]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1675:point"} +{"feature_id": 513613, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 683, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.54623864706045, "bbox_min_lat": 40.52743160734014, "bbox_max_lon": 141.54623864706045, "bbox_max_lat": 40.52743160734014, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [2]}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:683:point"} +{"feature_id": 513614, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 684, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.54700668450278, "bbox_min_lat": 40.527446860172084, "bbox_max_lon": 141.54700668450278, "bbox_max_lat": 40.527446860172084, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [3]}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:684:point"} +{"feature_id": 359260, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 3588, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 129, "coverage_id": 1255, "bbox_min_lon": 141.59181901274104, "bbox_min_lat": 40.50055642020571, "bbox_max_lon": 141.59181901274104, "bbox_max_lat": 40.50055642020571, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"BUISHP": 4, "CONVIS": 2}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:3588:point"} +{"feature_id": 604957, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 457, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.4970096059016, "bbox_min_lat": 40.533658597275405, "bbox_max_lon": 141.49857111222792, "bbox_max_lat": 40.535371817936316, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [13], "OBJNAM": "Tohoku Electric Power Electric Substation"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:457:area"} +{"feature_id": 604958, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 458, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.55372738129145, "bbox_min_lat": 40.530831941615936, "bbox_max_lon": 141.55581278061976, "bbox_max_lat": 40.534751606613355, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "No.1 Fish Market"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:458:area"} +{"feature_id": 604961, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 461, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.51506102594092, "bbox_min_lat": 40.52768994342353, "bbox_max_lon": 141.51729392912415, "bbox_max_lat": 40.528884733556836, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "No.2 Fish Market"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:461:area"} +{"feature_id": 604964, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 464, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.53618968157446, "bbox_min_lat": 40.5271408412395, "bbox_max_lon": 141.53678478333399, "bbox_max_lat": 40.529855802611685, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "No.3 Fish Market"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:464:area"} +{"feature_id": 604967, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 467, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.56627538164003, "bbox_min_lat": 40.53100479808267, "bbox_max_lon": 141.5673028222847, "bbox_max_lat": 40.531767394819084, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [19]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:467:area"} +{"feature_id": 604968, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 468, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.56943399867143, "bbox_min_lat": 40.53479736010381, "bbox_max_lon": 141.57069541094805, "bbox_max_lat": 40.53575817618616, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [19]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:468:area"} +{"feature_id": 604969, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 469, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.4846599728062, "bbox_min_lat": 40.55606934796726, "bbox_max_lon": 141.48570267247035, "bbox_max_lat": 40.55687739780013, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Port Management Office"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:469:area"} +{"feature_id": 604971, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 471, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.55004487125805, "bbox_min_lat": 40.52108516601581, "bbox_max_lon": 141.55107231190274, "bbox_max_lat": 40.52168516497249, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [19]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:471:area"} +{"feature_id": 604974, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 474, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.55127576549575, "bbox_min_lat": 40.52684086684987, "bbox_max_lon": 141.55255243679184, "bbox_max_lat": 40.52762384802846, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [19], "INFORM": "Fisheries High School"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:474:area"} +{"feature_id": 604978, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 478, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.48570267247035, "bbox_min_lat": 40.545787460007524, "bbox_max_lon": 141.4868064082124, "bbox_max_lat": 40.54645839752919, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [19]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:478:area"} +{"feature_id": 604980, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 480, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.53568613393176, "bbox_min_lat": 40.52661207192136, "bbox_max_lon": 141.53639313516746, "bbox_max_lat": 40.527084913912766, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Fishery Hall"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:480:area"} +{"feature_id": 604981, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 481, "object_class_id": 13, "object_class": "BUISGL", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.46143065882492, "bbox_min_lat": 40.58446212797802, "bbox_max_lon": 141.46238689071203, "bbox_max_lat": 40.584893922271476, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATBUI": [19]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:481:area"} +{"feature_id": 605093, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 593, "object_class_id": 21, "object_class": "CBLOHD", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.48957337707728, "bbox_min_lat": 40.53383653024312, "bbox_max_lon": 141.49799126948784, "bbox_max_lat": 40.535102382575076, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCBL": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:593:line"} +{"feature_id": 605094, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 594, "object_class_id": 21, "object_class": "CBLOHD", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.49748772184518, "bbox_min_lat": 40.53474143916679, "bbox_max_lon": 141.49922725006533, "bbox_max_lat": 40.54026213561014, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCBL": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:594:line"} +{"feature_id": 605095, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 595, "object_class_id": 21, "object_class": "CBLOHD", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.49142989111343, "bbox_min_lat": 40.53482786241341, "bbox_max_lon": 141.49712150537775, "bbox_max_lat": 40.53634279298588, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCBL": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:595:line"} +{"feature_id": 605096, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 596, "object_class_id": 21, "object_class": "CBLOHD", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.49642976316153, "bbox_min_lat": 40.535193889045665, "bbox_max_lon": 141.49718254145566, "bbox_max_lat": 40.53960130273064, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCBL": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:596:line"} +{"feature_id": 513239, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 309, "object_class_id": 21, "object_class": "CBLOHD", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 130, "coverage_id": 1759, "bbox_min_lon": 141.55523638371943, "bbox_min_lat": 40.5385550841112, "bbox_max_lon": 141.55672159519733, "bbox_max_lat": 40.538595751570455, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCBL": 1, "QUAVEM": 1, "VERCLR": 12}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:309:line"} +{"feature_id": 605097, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 597, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.55528888761776, "bbox_min_lat": 40.53959113602004, "bbox_max_lon": 141.55550760023024, "bbox_max_lat": 40.5453909937673, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"STATUS": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:597:line"} +{"feature_id": 605098, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 598, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.51061556493377, "bbox_min_lat": 40.53039979849827, "bbox_max_lon": 141.51085970924538, "bbox_max_lat": 40.531833486127546, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCBL": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:598:line"} +{"feature_id": 605099, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 599, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.55552285924972, "bbox_min_lat": 40.54564513906312, "bbox_max_lon": 141.56850828482325, "bbox_max_lat": 40.560744721391565, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"STATUS": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:599:line"} +{"feature_id": 605100, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 600, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.55511595206372, "bbox_min_lat": 40.53803052764702, "bbox_max_lon": 141.55866621726165, "bbox_max_lat": 40.544882700282585, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:600:line"} +{"feature_id": 605101, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 601, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.55882389379622, "bbox_min_lat": 40.54509110107785, "bbox_max_lon": 141.56853371652238, "bbox_max_lat": 40.560734557890434, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:601:line"} +{"feature_id": 513240, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 310, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 130, "coverage_id": 1759, "bbox_min_lon": 141.51056813988717, "bbox_min_lat": 40.530395675806176, "bbox_max_lon": 141.51087840666852, "bbox_max_lat": 40.53183953131183, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCBL": 1}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:310:line"} +{"feature_id": 513241, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 311, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 130, "coverage_id": 1759, "bbox_min_lon": 141.55523638371943, "bbox_min_lat": 40.53998351382215, "bbox_max_lon": 141.5684303514376, "bbox_max_lat": 40.56062371810466, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"STATUS": [4]}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:311:line"} +{"feature_id": 513242, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 312, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 2, "coverage_id": 1759, "bbox_min_lon": 141.55518552031265, "bbox_min_lat": 40.53802640489446, "bbox_max_lon": 141.55679280396683, "bbox_max_lat": 40.53998351382215, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:312:line"} +{"feature_id": 513243, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 313, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 2, "coverage_id": 1759, "bbox_min_lon": 141.55523638371943, "bbox_min_lat": 40.53998351382215, "bbox_max_lon": 141.56826250219524, "bbox_max_lat": 40.5603696296718, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:313:line"} +{"feature_id": 357026, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1354, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.55592979442275, "bbox_min_lat": 40.53903708754933, "bbox_max_lon": 141.56905255282143, "bbox_max_lat": 40.55801940598371, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1354:line"} +{"feature_id": 357028, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1356, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.440754700942, "bbox_min_lat": 40.48555797336778, "bbox_max_lon": 141.89883052318518, "bbox_max_lat": 41.33307476146743, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1356:line"} +{"feature_id": 357031, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1359, "object_class_id": 22, "object_class": "CBLSUB", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.55397663968432, "bbox_min_lat": 40.53753825431301, "bbox_max_lon": 141.56679421765514, "bbox_max_lat": 40.559705075420034, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1359:line"} +{"feature_id": 606204, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1704, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5084538705081, "bbox_min_lat": 40.52984563442224, "bbox_max_lon": 141.5084538705081, "bbox_max_lat": 40.52984563442224, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CONVIS": 2, "HEIGHT": 30}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1704:point"} +{"feature_id": 606205, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1705, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50834197103194, "bbox_min_lat": 40.529937148071795, "bbox_max_lon": 141.50834197103194, "bbox_max_lat": 40.529937148071795, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CONVIS": 2, "HEIGHT": 30}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1705:point"} +{"feature_id": 606206, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1706, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.48877482172475, "bbox_min_lat": 40.55533243867397, "bbox_max_lon": 141.48877482172475, "bbox_max_lat": 40.55533243867397, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CONVIS": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1706:point"} +{"feature_id": 606207, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1707, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.511627746559, "bbox_min_lat": 40.52949483094124, "bbox_max_lon": 141.511627746559, "bbox_max_lat": 40.52949483094124, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"HEIGHT": 27}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1707:point"} +{"feature_id": 606208, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1708, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.4817607591059, "bbox_min_lat": 40.568676863401265, "bbox_max_lon": 141.4817607591059, "bbox_max_lat": 40.568676863401265, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"HEIGHT": 81}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1708:point"} +{"feature_id": 606209, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1709, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.4907890122955, "bbox_min_lat": 40.55222716628113, "bbox_max_lon": 141.4907890122955, "bbox_max_lat": 40.55222716628113, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CONVIS": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1709:point"} +{"feature_id": 606210, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1710, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.4907178035379, "bbox_min_lat": 40.552328814138484, "bbox_max_lon": 141.4907178035379, "bbox_max_lat": 40.552328814138484, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CONVIS": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1710:point"} +{"feature_id": 606211, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1711, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.49086530739285, "bbox_min_lat": 40.55339610732457, "bbox_max_lon": 141.49086530739285, "bbox_max_lat": 40.55339610732457, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"HEIGHT": 40}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1711:point"} +{"feature_id": 606212, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1712, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55584329865871, "bbox_min_lat": 40.53195550067965, "bbox_max_lon": 141.55584329865871, "bbox_max_lat": 40.53195550067965, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CONVIS": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1712:point"} +{"feature_id": 606213, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1713, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.47853093331693, "bbox_min_lat": 40.567955336499885, "bbox_max_lon": 141.47853093331693, "bbox_max_lat": 40.567955336499885, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"HEIGHT": 71}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1713:point"} +{"feature_id": 606214, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1714, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.4800364899052, "bbox_min_lat": 40.56812301598066, "bbox_max_lon": 141.4800364899052, "bbox_max_lat": 40.56812301598066, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"HEIGHT": 82}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1714:point"} +{"feature_id": 606215, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1715, "object_class_id": 33, "object_class": "CHIMNY", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.507701092214, "bbox_min_lat": 40.53496003892795, "bbox_max_lon": 141.507701092214, "bbox_max_lat": 40.53496003892795, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"HEIGHT": 123}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1715:point"} +{"feature_id": 605102, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 602, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.55769472635504, "bbox_min_lat": 40.539565719236776, "bbox_max_lon": 141.55789817994807, "bbox_max_lat": 40.53977921991639, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCOA": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:602:line"} +{"feature_id": 605103, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 603, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.55833560517303, "bbox_min_lat": 40.5392149666431, "bbox_max_lon": 141.55843733196951, "bbox_max_lat": 40.53943355180842, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCOA": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:603:line"} +{"feature_id": 605104, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 604, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.58220071163242, "bbox_min_lat": 40.53133525773399, "bbox_max_lon": 141.58275003633358, "bbox_max_lat": 40.53198092035005, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCOA": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:604:line"} +{"feature_id": 605105, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 605, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.58185484052436, "bbox_min_lat": 40.53245372446163, "bbox_max_lon": 141.58341634685064, "bbox_max_lat": 40.53425339991716, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCOA": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:605:line"} +{"feature_id": 605106, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 606, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.58073584576283, "bbox_min_lat": 40.53929121736317, "bbox_max_lon": 141.58107154419127, "bbox_max_lat": 40.5394793021016, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCOA": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:606:line"} +{"feature_id": 605107, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 607, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.5812597387648, "bbox_min_lat": 40.53814236398398, "bbox_max_lon": 141.58260761881846, "bbox_max_lat": 40.53865070861728, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCOA": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:607:line"} +{"feature_id": 605108, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 608, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.57895562682404, "bbox_min_lat": 40.541436368720355, "bbox_max_lon": 141.57974909583675, "bbox_max_lat": 40.54199552010982, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCOA": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:608:line"} +{"feature_id": 605109, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 609, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.58141741529937, "bbox_min_lat": 40.53762384848427, "bbox_max_lon": 141.5826330505176, "bbox_max_lat": 40.53796444245105, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCOA": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:609:line"} +{"feature_id": 605110, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 610, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.58137163824097, "bbox_min_lat": 40.539697886404404, "bbox_max_lon": 141.58144793333835, "bbox_max_lat": 40.53978938659846, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:610:line"} +{"feature_id": 605111, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 611, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.5812597387648, "bbox_min_lat": 40.53426356743778, "bbox_max_lon": 141.58143267431888, "bbox_max_lat": 40.53439574506549, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:611:line"} +{"feature_id": 605112, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 612, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.5634321176778, "bbox_min_lat": 40.54065863220875, "bbox_max_lon": 141.56352367179463, "bbox_max_lat": 40.540729798016514, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:612:line"} +{"feature_id": 605113, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 613, "object_class_id": 35, "object_class": "COALNE", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.5603599684234, "bbox_min_lat": 40.53870662629144, "bbox_max_lon": 141.56043626352078, "bbox_max_lat": 40.53875237708104, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:613:line"} +{"feature_id": 356834, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1162, "object_class_id": 36, "object_class": "CONZNE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.65029158272228, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 142.48599766642022, "bbox_max_lat": 41.33307476146743, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Jeppesen adopts \"International Boundaries and National Limits\" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.", "NATION": "JP", "SORIND": "CM,PAD,graph,B3900420"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1162:area"} +{"feature_id": 328186, "cell_id": 12, "source_relative_path": "03900420\\B\\03900420.B", "source_record_index": 363, "object_class_id": 36, "object_class": "CONZNE", "geometry_type": "AREA", "scale_code": "B", "native_scale": 1000000, "raw_geotype": 132, "coverage_id": 1184, "bbox_min_lon": 139.9999979009354, "bbox_min_lat": 40.65462374281519, "bbox_max_lon": 141.82085695438715, "bbox_max_lat": 42.413189699068205, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Jeppesen adopts \"International Boundaries and National Limits\" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.", "NATION": "JP"}, "suggested_source_id": "cm95:1:03900420/B/03900420.B:363:area"} +{"feature_id": 606221, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1721, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.504298330871, "bbox_min_lat": 40.552633756784694, "bbox_max_lon": 141.504298330871, "bbox_max_lat": 40.552633756784694, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCRN": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1721:point"} +{"feature_id": 606222, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1722, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50241129879586, "bbox_min_lat": 40.552633756784694, "bbox_max_lon": 141.50241129879586, "bbox_max_lat": 40.552633756784694, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCRN": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1722:point"} +{"feature_id": 606223, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1723, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.4969485698237, "bbox_min_lat": 40.557309370125466, "bbox_max_lon": 141.4969485698237, "bbox_max_lat": 40.557309370125466, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCRN": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1723:point"} +{"feature_id": 606224, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1724, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55016185707404, "bbox_min_lat": 40.53230120737078, "bbox_max_lon": 141.55016185707404, "bbox_max_lat": 40.53230120737078, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCRN": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1724:point"} +{"feature_id": 606225, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1725, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50749763862098, "bbox_min_lat": 40.53064383260135, "bbox_max_lon": 141.50749763862098, "bbox_max_lat": 40.53064383260135, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCRN": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1725:point"} +{"feature_id": 606226, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1726, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.50274699722434, "bbox_min_lat": 40.53117257010931, "bbox_max_lon": 141.50274699722434, "bbox_max_lat": 40.53117257010931, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1726:point"} +{"feature_id": 606227, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1727, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.50241129879586, "bbox_min_lat": 40.53120307406901, "bbox_max_lon": 141.50241129879586, "bbox_max_lat": 40.53120307406901, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1727:point"} +{"feature_id": 513642, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 712, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.50327432735523, "bbox_min_lat": 40.55255339838609, "bbox_max_lon": 141.50327432735523, "bbox_max_lat": 40.55255339838609, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCRN": 4}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:712:point"} +{"feature_id": 513643, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 713, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.4910365916845, "bbox_min_lat": 40.55806246256592, "bbox_max_lon": 141.4910365916845, "bbox_max_lat": 40.55806246256592, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCRN": 4}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:713:point"} +{"feature_id": 513644, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 714, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.5070178740941, "bbox_min_lat": 40.53227674902543, "bbox_max_lon": 141.5070178740941, "bbox_max_lat": 40.53227674902543, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCRN": 4}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:714:point"} +{"feature_id": 513645, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 715, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.55027211521792, "bbox_min_lat": 40.53240893056331, "bbox_max_lon": 141.55027211521792, "bbox_max_lat": 40.53240893056331, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCRN": 4}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:715:point"} +{"feature_id": 513646, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 716, "object_class_id": 39, "object_class": "CRANES", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.49833040421643, "bbox_min_lat": 40.55698507976717, "bbox_max_lon": 141.49833040421643, "bbox_max_lat": 40.55698507976717, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCRN": 4}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:716:point"} +{"feature_id": 606201, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1701, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55814741059947, "bbox_min_lat": 40.537379839801666, "bbox_max_lon": 141.55814741059947, "bbox_max_lat": 40.537379839801666, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Slipway"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1701:point"} +{"feature_id": 606202, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1702, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5603599684234, "bbox_min_lat": 40.562269229085544, "bbox_max_lon": 141.5603599684234, "bbox_max_lat": 40.562269229085544, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Ebb stream|Orientation: 133 Deg|Current velocity: 0.3kn"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1702:point"} +{"feature_id": 606203, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1703, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55902734738925, "bbox_min_lat": 40.56296540938435, "bbox_max_lon": 141.55902734738925, "bbox_max_lat": 40.56296540938435, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Flood stream|Orientation: 299 Deg|Current velocity: 0.3kn"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1703:point"} +{"feature_id": 513615, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 685, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.49002949623028, "bbox_min_lat": 40.55958194940096, "bbox_max_lon": 141.49002949623028, "bbox_max_lat": 40.55958194940096, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "FOUL"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:685:point"} +{"feature_id": 513616, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 686, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.51584267517003, "bbox_min_lat": 40.54395347344211, "bbox_max_lon": 141.51584267517003, "bbox_max_lat": 40.54395347344211, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Marked by buoys"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:686:point"} +{"feature_id": 513617, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 687, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.52292286139348, "bbox_min_lat": 40.534788153657274, "bbox_max_lon": 141.52292286139348, "bbox_max_lat": 40.534788153657274, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "(liable to shoal)"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:687:point"} +{"feature_id": 513618, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 688, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.53515551072357, "bbox_min_lat": 40.56668090077736, "bbox_max_lon": 141.53515551072357, "bbox_max_lat": 40.56668090077736, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "WORKS IN PROGRESS (1998)"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:688:point"} +{"feature_id": 513619, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 689, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.5528152855568, "bbox_min_lat": 40.548711015211666, "bbox_max_lon": 141.5528152855568, "bbox_max_lat": 40.548711015211666, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Works in progress|Source date: 2000"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:689:point"} +{"feature_id": 513620, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 690, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.52889422534923, "bbox_min_lat": 40.54540211970138, "bbox_max_lon": 141.52889422534923, "bbox_max_lat": 40.54540211970138, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Works in progress|Source date: 2002"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:690:point"} +{"feature_id": 513621, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 691, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.5449924935944, "bbox_min_lat": 40.54999183410007, "bbox_max_lon": 141.5449924935944, "bbox_max_lat": 40.54999183410007, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Works in progress|Source date: 2005"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:691:point"} +{"feature_id": 513622, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 692, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.55518552031265, "bbox_min_lat": 40.54620521535582, "bbox_max_lon": 141.55518552031265, "bbox_max_lat": 40.54620521535582, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Works in progress|Source date: 2005"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:692:point"} +{"feature_id": 513623, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 693, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.56564812308685, "bbox_min_lat": 40.562691962071, "bbox_max_lon": 141.56564812308685, "bbox_max_lat": 40.562691962071, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Ebb stream|Orientation: 130 Deg|Current velocity: 0.2kn"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:693:point"} +{"feature_id": 604946, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 446, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.45999631099423, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.59638651340472, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Caution|Undiscovered shoals may exist around charted shoals. Mariners are advised to exercise caution. |Caution|Depths are very changeable at the entrance to river mouths. Mariners are advised to exercise caution."}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:446:area"} +{"feature_id": 604947, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 447, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.46794117380105, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.59638651340472, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Unassessed. Surveys before the earthquake (11th Mar. 2011)"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:447:area"} +{"feature_id": 604948, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 448, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.46794117380105, "bbox_min_lat": 40.526190070337684, "bbox_max_lon": 141.5663771084365, "bbox_max_lat": 40.59233558585386, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Section 3"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:448:area"} +{"feature_id": 604949, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 449, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5223802689493, "bbox_min_lat": 40.5271408412395, "bbox_max_lon": 141.54366660111737, "bbox_max_lat": 40.53812203011843, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Section 2"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:449:area"} +{"feature_id": 604951, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 451, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.54241027518057, "bbox_min_lat": 40.52946941032777, "bbox_max_lon": 141.55844750464917, "bbox_max_lat": 40.53889471267114, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Section 1"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:451:area"} +{"feature_id": 604965, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 465, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5131943392251, "bbox_min_lat": 40.55059061453722, "bbox_max_lon": 141.5141658301317, "bbox_max_lat": 40.551896809679086, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Caisson Temporary Storage Area"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:465:area"} +{"feature_id": 604970, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 470, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.52520827389202, "bbox_min_lat": 40.541156791275355, "bbox_max_lon": 141.52667313976167, "bbox_max_lat": 40.54224967828935, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Caisson Temporary Storage Area"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:470:area"} +{"feature_id": 604976, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 476, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.55397152560306, "bbox_min_lat": 40.53499562486809, "bbox_max_lon": 141.5549277574902, "bbox_max_lat": 40.53549382604538, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Caisson Temporary Storage Area"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:476:area"} +{"feature_id": 604986, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 486, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5003564175065, "bbox_min_lat": 40.54661596521501, "bbox_max_lon": 141.5018314560558, "bbox_max_lat": 40.54858298867289, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Unassessed. Surveys before the earthquake (11th Mar. 2011)"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:486:area"} +{"feature_id": 513193, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 263, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.48062993865776, "bbox_min_lat": 40.524813153073175, "bbox_max_lon": 141.5780028445932, "bbox_max_lat": 40.572168478876776, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "CABLES|1. Submarine and overhead cables may conduct high voltages; contact with or proximity to these poses an extreme danger and mariners may risk prosecution if damage is caused.|2. Anchoring or trawling in the vicinity of submarine cables should be avoided. Seabed mobility may leave a cable spanning undulations and cause fishing gear to become irrecoverably snagged, putting a vessel in severe danger. If a cable is snagged, care must be taken not to sever it.|3. Sufficient clearance must be allowed under overhead cables.|4. Some cables, particularly those installed since this edition was published, may not be charted.|5. For further information, see The Mariner's Handbook."}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:263:area"} +{"feature_id": 513207, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 277, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.51666157601915, "bbox_min_lat": 40.539780180491206, "bbox_max_lon": 141.5175465992971, "bbox_max_lat": 40.54040542851488, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Dredged to 7.5m|Source date: 1994"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:277:area"} +{"feature_id": 356914, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1242, "object_class_id": 29, "object_class": "CTNARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.30000548760523, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 143.08335783594634, "bbox_max_lat": 41.33307476146743, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "CAUTION|As undiscovered shoals may exist around charted shoals, mariners are warned to excercise cautions.|NOTE|The straight baselines and the limits of the territorial sea shown on this chart are based on the provisions of the Law No.30 of 1977 on the Territorial Sea and the Contiguous Zone and the Enforcement Order No.210 of 1977 of the Law No.30 of 1977 on the Territorial Sea and the Contiguous Zone.|NOTE|Of all the base points of the straight baselines given in the Enforcement Order, only major points are shown on this chart due to its small scale."}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1242:area"} +{"feature_id": 606488, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1988, "object_class_id": 38, "object_class": "CTRPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.57150413898023, "bbox_min_lat": 40.53792377460575, "bbox_max_lon": 141.57150413898023, "bbox_max_lat": 40.53792377460575, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCTR": 1, "OBJNAM": "Monomiiwa"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1988:point"} +{"feature_id": 606489, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1989, "object_class_id": 38, "object_class": "CTRPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52191741202518, "bbox_min_lat": 40.52766960638582, "bbox_max_lon": 141.52191741202518, "bbox_max_lat": 40.52766960638582, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCTR": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1989:point"} +{"feature_id": 606490, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1990, "object_class_id": 38, "object_class": "CTRPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.56324392310424, "bbox_min_lat": 40.52365800503656, "bbox_max_lon": 141.56324392310424, "bbox_max_lat": 40.52365800503656, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCTR": 1}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1990:point"} +{"feature_id": 606491, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1991, "object_class_id": 38, "object_class": "CTRPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5553753553948, "bbox_min_lat": 40.53513796843959, "bbox_max_lon": 141.5553753553948, "bbox_max_lat": 40.53513796843959, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCTR": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1991:point"} +{"feature_id": 606492, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1992, "object_class_id": 38, "object_class": "CTRPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52139351902318, "bbox_min_lat": 40.52867628234413, "bbox_max_lon": 141.52139351902318, "bbox_max_lat": 40.52867628234413, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCTR": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1992:point"} +{"feature_id": 513792, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 862, "object_class_id": 38, "object_class": "CTRPNT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.5219157659393, "bbox_min_lat": 40.5277061577843, "bbox_max_lon": 141.5219157659393, "bbox_max_lat": 40.5277061577843, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATCTR": 1}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:862:point"} +{"feature_id": 604502, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.48576370854826, "bbox_min_lat": 40.52299700839042, "bbox_max_lon": 141.59638651340472, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 10, "DRVAL2": 20}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2:area"} +{"feature_id": 604503, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 3, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.51688702193815, "bbox_min_lat": 40.534319488773654, "bbox_max_lon": 141.59638651340472, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 20, "DRVAL2": 50}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:3:area"} +{"feature_id": 604507, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 7, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.47257482938176, "bbox_min_lat": 40.55943869885535, "bbox_max_lon": 141.50387616466548, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 5, "DRVAL2": 10}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:7:area"} +{"feature_id": 604508, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 8, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.4939934063853, "bbox_min_lat": 40.5271408412395, "bbox_max_lon": 141.549668482111, "bbox_max_lat": 40.538406703674674, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 5, "DRVAL2": 10}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:8:area"} +{"feature_id": 604509, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 9, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5479849036289, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.59638651340472, "bbox_max_lat": 40.5487151380486, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 5, "DRVAL2": 10}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:9:area"} +{"feature_id": 604511, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 11, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.51570190475888, "bbox_min_lat": 40.53258590565955, "bbox_max_lon": 141.5315814576929, "bbox_max_lat": 40.54706833489824, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 5, "DRVAL2": 10}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:11:area"} +{"feature_id": 604512, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 12, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.51287389981613, "bbox_min_lat": 40.54557906137898, "bbox_max_lon": 141.52104764791508, "bbox_max_lat": 40.552369473238194, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 5, "DRVAL2": 10}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:12:area"} +{"feature_id": 604513, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 13, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.46794117380105, "bbox_min_lat": 40.5815207726836, "bbox_max_lon": 141.48037218833363, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 0, "DRVAL2": 5}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:13:area"} +{"feature_id": 604516, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 16, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5007328066536, "bbox_min_lat": 40.54609751530363, "bbox_max_lon": 141.51451170123983, "bbox_max_lat": 40.55281163935367, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 5, "DRVAL2": 10}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:16:area"} +{"feature_id": 604517, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 17, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.4772847800598, "bbox_min_lat": 40.56972357169742, "bbox_max_lon": 141.48750323676845, "bbox_max_lat": 40.57913812927698, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 0, "DRVAL2": 5}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:17:area"} +{"feature_id": 604518, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 18, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.58144793333835, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.59405188342498, "bbox_max_lat": 40.53718158209264, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 2, "DRVAL2": 5}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:18:area"} +{"feature_id": 604521, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 21, "object_class_id": 44, "object_class": "DEPARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.48479221764165, "bbox_min_lat": 40.55707559721309, "bbox_max_lon": 141.49351529044174, "bbox_max_lat": 40.56221333108327, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 5, "DRVAL2": 10}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:21:area"} +{"feature_id": 605210, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 710, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.52458265409354, "bbox_min_lat": 40.53508204778686, "bbox_max_lon": 141.5254269865045, "bbox_max_lat": 40.53578867805837, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:710:line"} +{"feature_id": 605211, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 711, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.53477059276324, "bbox_min_lat": 40.53615469944172, "bbox_max_lon": 141.53681530137294, "bbox_max_lat": 40.53760351446132, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:711:line"} +{"feature_id": 605212, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 712, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.5195980410649, "bbox_min_lat": 40.53461942968764, "bbox_max_lon": 141.52048306419448, "bbox_max_lat": 40.535371817936316, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:712:line"} +{"feature_id": 605213, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 713, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.51949631426845, "bbox_min_lat": 40.52729337007523, "bbox_max_lon": 141.52280243515474, "bbox_max_lat": 40.52946941032777, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:713:line"} +{"feature_id": 605214, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 714, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.54307658569766, "bbox_min_lat": 40.52757300537249, "bbox_max_lon": 141.54339193876683, "bbox_max_lat": 40.528330556952184, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:714:line"} +{"feature_id": 605215, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 715, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.55552285924972, "bbox_min_lat": 40.535422654675436, "bbox_max_lon": 141.55603149323224, "bbox_max_lat": 40.5360326925361, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:715:line"} +{"feature_id": 605216, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 716, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.59525734596352, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.59589313844168, "bbox_max_lat": 40.52121736963704, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:716:line"} +{"feature_id": 605217, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 717, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.50291993277838, "bbox_min_lat": 40.53093870595688, "bbox_max_lon": 141.50567164262378, "bbox_max_lat": 40.531381013557265, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:717:line"} +{"feature_id": 605218, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 718, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.55608744297032, "bbox_min_lat": 40.53584459812132, "bbox_max_lon": 141.55759299955852, "bbox_max_lat": 40.53620045197403, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:718:line"} +{"feature_id": 605219, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 719, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.47612509457966, "bbox_min_lat": 40.58484820300763, "bbox_max_lon": 141.47816980318936, "bbox_max_lat": 40.58632644337369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:719:line"} +{"feature_id": 605220, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 720, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.55607218395082, "bbox_min_lat": 40.53633262578077, "bbox_max_lon": 141.55801516576403, "bbox_max_lat": 40.53697315668907, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:720:line"} +{"feature_id": 605221, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 721, "object_class_id": 45, "object_class": "DEPCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.54961253237295, "bbox_min_lat": 40.53841687056501, "bbox_max_lon": 141.55126050647627, "bbox_max_lat": 40.53875237708104, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALDCO": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:721:line"} +{"feature_id": 512940, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 10, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.4920691188421, "bbox_min_lat": 40.55270078700058, "bbox_max_lon": 141.5073993496449, "bbox_max_lat": 40.562580166733625, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 13, "INFORM": "(1981-2000)"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:10:area"} +{"feature_id": 512943, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 13, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.52371124419855, "bbox_min_lat": 40.55013922835277, "bbox_max_lon": 141.53126954644574, "bbox_max_lat": 40.560735516709556, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 14, "INFORM": "(1995-2000)"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:13:area"} +{"feature_id": 512944, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 14, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.51267897126843, "bbox_min_lat": 40.55118114399031, "bbox_max_lon": 141.52546603173238, "bbox_max_lat": 40.55552143762379, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 13, "INFORM": "(1981-2000)"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:14:area"} +{"feature_id": 512945, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 15, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.48609775488637, "bbox_min_lat": 40.559378675568496, "bbox_max_lon": 141.49588387435043, "bbox_max_lat": 40.564739816350254, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 12, "INFORM": "Source date: 1991"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:15:area"} +{"feature_id": 512949, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 19, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.5190826741818, "bbox_min_lat": 40.5324801051295, "bbox_max_lon": 141.52580173021713, "bbox_max_lat": 40.54025801283995, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 7.5, "INFORM": "1980"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:19:area"} +{"feature_id": 512953, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 23, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.48605197782027, "bbox_min_lat": 40.55707655633874, "bbox_max_lon": 141.490965382915, "bbox_max_lat": 40.560039313267254, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 7.5}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:23:area"} +{"feature_id": 512954, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 24, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.51567482592765, "bbox_min_lat": 40.53742146874959, "bbox_max_lon": 141.52047633152748, "bbox_max_lat": 40.54040542851488, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 7.5, "INFORM": "1994"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:24:area"} +{"feature_id": 512955, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 25, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.48532971744402, "bbox_min_lat": 40.55824541263988, "bbox_max_lon": 141.4933915674183, "bbox_max_lat": 40.56201610559284, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 9.59999942779541, "INFORM": "Source date: 1990"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:25:area"} +{"feature_id": 512957, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 27, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.4975420214114, "bbox_min_lat": 40.55209598337879, "bbox_max_lon": 141.50161618029426, "bbox_max_lat": 40.55544520538552, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 10, "INFORM": "Source date: 1977"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:27:area"} +{"feature_id": 512958, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 28, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.508960856233, "bbox_min_lat": 40.5480553484439, "bbox_max_lon": 141.51253655372946, "bbox_max_lat": 40.55231960888387, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 13, "INFORM": "(1981-2000)"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:28:area"} +{"feature_id": 512962, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 32, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.5074502130517, "bbox_min_lat": 40.54907696596515, "bbox_max_lon": 141.50984587951092, "bbox_max_lat": 40.55211631300102, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 13, "INFORM": "(1981-2000)"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:32:area"} +{"feature_id": 512977, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 47, "object_class_id": 50, "object_class": "DRGARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.50061417118076, "bbox_min_lat": 40.54801976944343, "bbox_max_lon": 141.50392029262133, "bbox_max_lat": 40.549808861472954, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"DRVAL1": 7.5, "INFORM": "Source date: 1990"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:47:area"} +{"feature_id": 356822, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1150, "object_class_id": 56, "object_class": "EXEZNE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.65029158272228, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 143.08335783594634, "bbox_max_lat": 41.33307476146743, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Jeppesen adopts \"International Boundaries and National Limits\" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.", "NATION": "JP", "SORIND": "CM,PAD,graph,B3900420"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1150:area"} +{"feature_id": 328185, "cell_id": 12, "source_relative_path": "03900420\\B\\03900420.B", "source_record_index": 362, "object_class_id": 56, "object_class": "EXEZNE", "geometry_type": "AREA", "scale_code": "B", "native_scale": 1000000, "raw_geotype": 132, "coverage_id": 1184, "bbox_min_lon": 139.9999979009354, "bbox_min_lat": 40.65462374281519, "bbox_max_lon": 141.82085695438715, "bbox_max_lat": 42.413189699068205, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Jeppesen adopts \"International Boundaries and National Limits\" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.", "NATION": "JP"}, "suggested_source_id": "cm95:1:03900420/B/03900420.B:362:area"} +{"feature_id": 604944, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 444, "object_class_id": 57, "object_class": "FAIRWY", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.54393109078828, "bbox_min_lat": 40.536571554692834, "bbox_max_lon": 141.549058121332, "bbox_max_lat": 40.54073996455429, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "East Passage"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:444:area"} +{"feature_id": 604945, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 445, "object_class_id": 57, "object_class": "FAIRWY", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.53155602599378, "bbox_min_lat": 40.53539215263657, "bbox_max_lon": 141.53591501922392, "bbox_max_lat": 40.53888454585329, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "West Passage"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:445:area"} +{"feature_id": 513190, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 260, "object_class_id": 57, "object_class": "FAIRWY", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.54408203861306, "bbox_min_lat": 40.536674187146915, "bbox_max_lon": 141.54907173881796, "bbox_max_lat": 40.540842590333156, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "East Fairway"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:260:area"} +{"feature_id": 513191, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 261, "object_class_id": 57, "object_class": "FAIRWY", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.5315086044576, "bbox_min_lat": 40.53535244417567, "bbox_max_lon": 141.53585233939643, "bbox_max_lat": 40.53892109035575, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "West Fairway"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:261:area"} +{"feature_id": 513192, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 262, "object_class_id": 57, "object_class": "FAIRWY", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.53477403517275, "bbox_min_lat": 40.536252248954824, "bbox_max_lon": 141.53616260617775, "bbox_max_lat": 40.53732996532771, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:262:area"} +{"feature_id": 605632, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1132, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.57221622655575, "bbox_min_lat": 40.553507918007234, "bbox_max_lon": 141.57221622655575, "bbox_max_lat": 40.553507918007234, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1132:point"} +{"feature_id": 605633, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1133, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.57583770051122, "bbox_min_lat": 40.55280147464817, "bbox_max_lon": 141.57583770051122, "bbox_max_lat": 40.55280147464817, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1133:point"} +{"feature_id": 605634, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1134, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.57033428082045, "bbox_min_lat": 40.553782361618545, "bbox_max_lon": 141.57033428082045, "bbox_max_lat": 40.553782361618545, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1134:point"} +{"feature_id": 605635, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1135, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5664330581746, "bbox_min_lat": 40.554194024926325, "bbox_max_lon": 141.5664330581746, "bbox_max_lat": 40.554194024926325, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1135:point"} +{"feature_id": 513544, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 614, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.57238752448492, "bbox_min_lat": 40.5535800295812, "bbox_max_lon": 141.57238752448492, "bbox_max_lat": 40.5535800295812, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:614:point"} +{"feature_id": 513545, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 615, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.5664161605292, "bbox_min_lat": 40.55418481979861, "bbox_max_lon": 141.5664161605292, "bbox_max_lat": 40.55418481979861, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:615:point"} +{"feature_id": 513546, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 616, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.5703987652799, "bbox_min_lat": 40.55391037785596, "bbox_max_lon": 141.5703987652799, "bbox_max_lat": 40.55391037785596, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:616:point"} +{"feature_id": 513547, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 617, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.57605986245426, "bbox_min_lat": 40.55277702236356, "bbox_max_lon": 141.57605986245426, "bbox_max_lat": 40.55277702236356, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:617:point"} +{"feature_id": 359102, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 3430, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 129, "coverage_id": 1255, "bbox_min_lon": 141.52870770025612, "bbox_min_lat": 40.64823662602053, "bbox_max_lon": 141.52870770025612, "bbox_max_lat": 40.64823662602053, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:3430:point"} +{"feature_id": 359111, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 3439, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 129, "coverage_id": 1255, "bbox_min_lon": 141.60573524025224, "bbox_min_lat": 40.5500899470562, "bbox_max_lon": 141.60573524025224, "bbox_max_lat": 40.5500899470562, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:3439:point"} +{"feature_id": 359122, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 3450, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 129, "coverage_id": 1255, "bbox_min_lon": 141.613242678778, "bbox_min_lat": 40.54215954908995, "bbox_max_lon": 141.613242678778, "bbox_max_lat": 40.54215954908995, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:3450:point"} +{"feature_id": 359131, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 3459, "object_class_id": 60, "object_class": "FSHHAV", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 129, "coverage_id": 1255, "bbox_min_lon": 141.44942182509374, "bbox_min_lat": 40.69653943249045, "bbox_max_lon": 141.44942182509374, "bbox_max_lat": 40.69653943249045, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always under water/submerged"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:3459:point"} +{"feature_id": 604943, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 443, "object_class_id": 72, "object_class": "HRBARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.46794117380105, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.5663771084365, "bbox_max_lat": 40.59233558585386, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:443:area"} +{"feature_id": 513187, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 257, "object_class_id": 72, "object_class": "HRBARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.48062993865776, "bbox_min_lat": 40.53205814052522, "bbox_max_lon": 141.5664619375953, "bbox_max_lat": 40.572168478876776, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "No 3 Area"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:257:area"} +{"feature_id": 513188, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 258, "object_class_id": 72, "object_class": "HRBARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.49353398495728, "bbox_min_lat": 40.524813153073175, "bbox_max_lon": 141.5435021957758, "bbox_max_lat": 40.537878983984385, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "No 2 Area"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:258:area"} +{"feature_id": 513189, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 259, "object_class_id": 72, "object_class": "HRBARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.54247475495887, "bbox_min_lat": 40.52951612885991, "bbox_max_lon": 141.5584763827312, "bbox_max_lat": 40.53939892883223, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "No1 Area"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:259:area"} +{"feature_id": 606228, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1728, "object_class_id": 73, "object_class": "HRBFAC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50843861148863, "bbox_min_lat": 40.54650414302457, "bbox_max_lon": 141.50843861148863, "bbox_max_lat": 40.54650414302457, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Tohoku Grain Terminal"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1728:point"} +{"feature_id": 604990, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 490, "object_class_id": 73, "object_class": "HRBFAC", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.49581940238252, "bbox_min_lat": 40.530806521509675, "bbox_max_lon": 141.4959770789171, "bbox_max_lat": 40.5312844178937, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATHAF": [9]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:490:area"} +{"feature_id": 604515, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 15, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5033115809449, "bbox_min_lat": 40.54073996455429, "bbox_max_lon": 141.51403358529626, "bbox_max_lat": 40.54647364603113, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [1]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:15:area"} +{"feature_id": 604520, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 20, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.58185484052436, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.59028799195437, "bbox_max_lat": 40.53412122200863, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:20:area"} +{"feature_id": 604537, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 37, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.5762140896583, "bbox_min_lat": 40.53413138954932, "bbox_max_lon": 141.58281107241146, "bbox_max_lat": 40.542453004138665, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:37:area"} +{"feature_id": 604552, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 52, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5604210045013, "bbox_min_lat": 40.538320285044385, "bbox_max_lon": 141.56481051577038, "bbox_max_lat": 40.54126862239338, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [9]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:52:area"} +{"feature_id": 604558, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 58, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.47721357130226, "bbox_min_lat": 40.56706103884022, "bbox_max_lon": 141.4916892944445, "bbox_max_lat": 40.57847259964477, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:58:area"} +{"feature_id": 604565, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 65, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.56779619724773, "bbox_min_lat": 40.542453004138665, "bbox_max_lon": 141.57153465701919, "bbox_max_lat": 40.544074505699285, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [9]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:65:area"} +{"feature_id": 604574, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 74, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.4936475352772, "bbox_min_lat": 40.53006933423387, "bbox_max_lon": 141.49676037525015, "bbox_max_lat": 40.531813150347276, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [1]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:74:area"} +{"feature_id": 604585, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 85, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.47098280501646, "bbox_min_lat": 40.58631628375762, "bbox_max_lon": 141.47838851580184, "bbox_max_lat": 40.587997679213444, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:85:area"} +{"feature_id": 604605, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 105, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5564485730979, "bbox_min_lat": 40.53888454585329, "bbox_max_lon": 141.55866621726165, "bbox_max_lat": 40.54026213561014, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [9]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:105:area"} +{"feature_id": 604609, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 109, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5787063961726, "bbox_min_lat": 40.540684048577326, "bbox_max_lon": 141.58001358550766, "bbox_max_lat": 40.54231575925809, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [9]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:109:area"} +{"feature_id": 604614, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 114, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.56554803504503, "bbox_min_lat": 40.54272749305622, "bbox_max_lon": 141.56778093822825, "bbox_max_lat": 40.543464541065894, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [9]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:114:area"} +{"feature_id": 604624, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 124, "object_class_id": 78, "object_class": "ITDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.49136885503552, "bbox_min_lat": 40.56525208204149, "bbox_max_lon": 141.49305243351765, "bbox_max_lat": 40.56609050910872, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:124:area"} +{"feature_id": 604931, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 431, "object_class_id": 79, "object_class": "LAKARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.520177883805, "bbox_min_lat": 40.53003374567741, "bbox_max_lon": 141.5202389198829, "bbox_max_lat": 40.53007950238938, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:431:area"} +{"feature_id": 355948, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 276, "object_class_id": 79, "object_class": "LAKARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.3203305041018, "bbox_min_lat": 40.70214652281388, "bbox_max_lon": 141.3434021444493, "bbox_max_lat": 40.720771134201065, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Ane Lake"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:276:area"} +{"feature_id": 356579, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 907, "object_class_id": 79, "object_class": "LAKARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 4, "coverage_id": 1255, "bbox_min_lon": 141.3862494765232, "bbox_min_lat": 40.710930015390346, "bbox_max_lon": 141.39430623981914, "bbox_max_lat": 40.713670726268816, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:907:area"} +{"feature_id": 605467, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 967, "object_class_id": 80, "object_class": "LAKSHR", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.520177883805, "bbox_min_lat": 40.53003374567741, "bbox_max_lon": 141.5202389198829, "bbox_max_lat": 40.53007950238938, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:967:line"} +{"feature_id": 357855, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 2183, "object_class_id": 80, "object_class": "LAKSHR", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.3862494765232, "bbox_min_lat": 40.710930015390346, "bbox_max_lon": 141.39430623981914, "bbox_max_lat": 40.713670726268816, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:2183:line"} +{"feature_id": 357868, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 2196, "object_class_id": 80, "object_class": "LAKSHR", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.3203305041018, "bbox_min_lat": 40.70214652281388, "bbox_max_lon": 141.3434021444493, "bbox_max_lat": 40.720771134201065, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:2196:line"} +{"feature_id": 606493, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1993, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.52561518107802, "bbox_min_lat": 40.53350099910942, "bbox_max_lon": 141.52561518107802, "bbox_max_lat": 40.53350099910942, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [1], "HEIGHT": 5, "LITCHR": 7, "OBJNAM": "C1", "SECTR1": 228, "SECTR2": 48, "SIGGRP": "(1)", "SIGPER": 4, "SORIND": "GB,UKHO,graph,LL M-6624.62", "VALNMR": 6, "_cm93_relation20_raw": 2266}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1993:point"} +{"feature_id": 606494, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1994, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.5254269865045, "bbox_min_lat": 40.53363317824145, "bbox_max_lon": 141.5254269865045, "bbox_max_lat": 40.53363317824145, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [1], "HEIGHT": 5, "LITCHR": 7, "OBJNAM": "C2", "SECTR1": 48, "SECTR2": 228, "SIGGRP": "(1)", "SIGPER": 4, "SORIND": "GB,UKHO,graph,LL M-6624.621", "VALNMR": 6, "_cm93_relation20_raw": 2270}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1994:point"} +{"feature_id": 606495, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1995, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.52535069140714, "bbox_min_lat": 40.53333831674283, "bbox_max_lon": 141.52535069140714, "bbox_max_lat": 40.53333831674283, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [3], "HEIGHT": 5, "LITCHR": 7, "OBJNAM": "R1", "SECTR1": 228, "SECTR2": 48, "SIGGRP": "(1)", "SIGPER": 4, "SORIND": "GB,UKHO,graph,LL M-6624.64", "VALNMR": 4, "_cm93_relation20_raw": 2263}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1995:point"} +{"feature_id": 606496, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1996, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.5251777558531, "bbox_min_lat": 40.5334501609123, "bbox_max_lon": 141.5251777558531, "bbox_max_lat": 40.5334501609123, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [3], "HEIGHT": 5, "LITCHR": 7, "OBJNAM": "R2", "SECTR1": 48, "SECTR2": 228, "SIGGRP": "(1)", "SIGPER": 4, "SORIND": "GB,UKHO,graph,LL M-6624.641", "VALNMR": 4, "_cm93_relation20_raw": 2276}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1996:point"} +{"feature_id": 606497, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1997, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.52588984342862, "bbox_min_lat": 40.53368910010344, "bbox_max_lon": 141.52588984342862, "bbox_max_lat": 40.53368910010344, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [4], "HEIGHT": 4, "LITCHR": 7, "OBJNAM": "L1", "SECTR1": 228, "SECTR2": 48, "SIGGRP": "(1)", "SIGPER": 4, "SORIND": "GB,UKHO,graph,LL M-6624.63", "VALNMR": 4, "_cm93_relation20_raw": 2265}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1997:point"} +{"feature_id": 606498, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1998, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.52570164885506, "bbox_min_lat": 40.53382127886439, "bbox_max_lon": 141.52570164885506, "bbox_max_lat": 40.53382127886439, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [4], "HEIGHT": 4, "LITCHR": 7, "OBJNAM": "L2", "SECTR1": 48, "SECTR2": 228, "SIGGRP": "(1)", "SIGPER": 4, "SORIND": "GB,UKHO,graph,LL M-6624.631", "VALNMR": 4, "_cm93_relation20_raw": 2258}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1998:point"} +{"feature_id": 606499, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1999, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.51452696025927, "bbox_min_lat": 40.55241521469589, "bbox_max_lon": 141.51452696025927, "bbox_max_lat": 40.55241521469589, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [4], "HEIGHT": 14, "INFORM": "2 fl in 3s", "LITCHR": 2, "SIGGRP": "(2)", "SIGPER": 9, "VALNMR": 4, "_cm93_relation20_raw": 2239}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1999:point"} +{"feature_id": 606500, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2000, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.52294485266987, "bbox_min_lat": 40.53044047091052, "bbox_max_lon": 141.52294485266987, "bbox_max_lat": 40.53044047091052, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [1], "HEIGHT": 31, "LITCHR": 1, "OBJNAM": "C1", "SORIND": "GB,UKHO,graph,LL M-6624.5", "VALNMR": 6, "_cm93_relation20_raw": 2267}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2000:point"} +{"feature_id": 606501, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2001, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.5759546863272, "bbox_min_lat": 40.53986563666468, "bbox_max_lon": 141.5759546863272, "bbox_max_lat": 40.53986563666468, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [1], "HEIGHT": 57, "LITCHR": 2, "SIGGRP": "(1)", "SIGPER": 8, "VALNMR": 19, "_cm93_relation20_raw": 2241}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2001:point"} +{"feature_id": 606502, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2002, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.55245070999536, "bbox_min_lat": 40.53446183378157, "bbox_max_lon": 141.55245070999536, "bbox_max_lat": 40.53446183378157, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [3], "HEIGHT": 11, "LITCHR": 2, "SIGGRP": "(2)", "SIGPER": 6, "VALNMR": 3, "_cm93_relation20_raw": 2254}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2002:point"} +{"feature_id": 606503, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2003, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.52043728713608, "bbox_min_lat": 40.53762384848427, "bbox_max_lon": 141.52043728713608, "bbox_max_lat": 40.53762384848427, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [3], "HEIGHT": 12, "LITCHR": 2, "SIGGRP": "(1)", "SIGPER": 3, "VALNMR": 3, "_cm93_relation20_raw": 2272}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2003:point"} +{"feature_id": 606504, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2004, "object_class_id": 86, "object_class": "LIGHTS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.53323451813606, "bbox_min_lat": 40.53630720776126, "bbox_max_lon": 141.53323451813606, "bbox_max_lat": 40.53630720776126, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"COLOUR": [3], "HEIGHT": 12, "LITCHR": 2, "SIGGRP": "(1)", "SIGPER": 5, "VALNMR": 7, "_cm93_relation20_raw": 2273}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2004:point"} +{"feature_id": 604504, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 4, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.45999631099423, "bbox_min_lat": 40.52691713165249, "bbox_max_lon": 141.52820921438885, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:4:area"} +{"feature_id": 604505, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 5, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.51986253073585, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.5886654495502, "bbox_max_lat": 40.54317988900274, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:5:area"} +{"feature_id": 604506, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 6, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.4840089213086, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.5255236269612, "bbox_max_lat": 40.54304772870506, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:6:area"} +{"feature_id": 604510, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 10, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.52075772654507, "bbox_min_lat": 40.53392295465693, "bbox_max_lon": 141.53333624493257, "bbox_max_lat": 40.54631607801049, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:10:area"} +{"feature_id": 604530, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 30, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.53481636982167, "bbox_min_lat": 40.54910141934393, "bbox_max_lon": 141.54553837417302, "bbox_max_lat": 40.56592282453552, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:30:area"} +{"feature_id": 604541, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 41, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.54934804270204, "bbox_min_lat": 40.54460313722178, "bbox_max_lon": 141.5603599684234, "bbox_max_lat": 40.549960378975165, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:41:area"} +{"feature_id": 604546, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 46, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.5338296198956, "bbox_min_lat": 40.535986939889206, "bbox_max_lon": 141.54704393076125, "bbox_max_lat": 40.538432120897646, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:46:area"} +{"feature_id": 604596, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 96, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.4790955170375, "bbox_min_lat": 40.583542650841665, "bbox_max_lon": 141.4825898324974, "bbox_max_lat": 40.587718296190026, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:96:area"} +{"feature_id": 604620, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 120, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.5480866304254, "bbox_min_lat": 40.53846262155252, "bbox_max_lon": 141.55539061441428, "bbox_max_lat": 40.539443718542934, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:120:area"} +{"feature_id": 604668, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 168, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.57110231813405, "bbox_min_lat": 40.54319005516867, "bbox_max_lon": 141.57197208224414, "bbox_max_lat": 40.543866101740925, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:168:area"} +{"feature_id": 604676, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 176, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.57895562682404, "bbox_min_lat": 40.541436368720355, "bbox_max_lon": 141.57974909583675, "bbox_max_lat": 40.54199552010982, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:176:area"} +{"feature_id": 604684, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 184, "object_class_id": 81, "object_class": "LNDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.5099746861158, "bbox_min_lat": 40.54823736599592, "bbox_max_lon": 141.5116124875395, "bbox_max_lat": 40.549452120169185, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:184:area"} +{"feature_id": 606534, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2034, "object_class_id": 95, "object_class": "MONUMT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55748110008238, "bbox_min_lat": 40.53846262155252, "bbox_max_lon": 141.55748110008238, "bbox_max_lat": 40.53846262155252, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CONVIS": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2034:point"} +{"feature_id": 606535, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2035, "object_class_id": 95, "object_class": "MONUMT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55767946733556, "bbox_min_lat": 40.538452454669105, "bbox_max_lon": 141.55767946733556, "bbox_max_lat": 40.538452454669105, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CONVIS": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2035:point"} +{"feature_id": 513828, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 898, "object_class_id": 95, "object_class": "MONUMT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.5574896326397, "bbox_min_lat": 40.53853983380762, "bbox_max_lon": 141.5574896326397, "bbox_max_lat": 40.53853983380762, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:898:point"} +{"feature_id": 513829, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 899, "object_class_id": 95, "object_class": "MONUMT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.55777955405833, "bbox_min_lat": 40.53853983380762, "bbox_max_lon": 141.55777955405833, "bbox_max_lat": 40.53853983380762, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:899:point"} +{"feature_id": 513548, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 618, "object_class_id": 96, "object_class": "MORFAC", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.51970829408515, "bbox_min_lat": 40.536872446343644, "bbox_max_lon": 141.51970829408515, "bbox_max_lat": 40.536872446343644, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATMOR": 1, "INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:618:point"} +{"feature_id": 513549, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 619, "object_class_id": 96, "object_class": "MORFAC", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.51929630049025, "bbox_min_lat": 40.536542014023155, "bbox_max_lon": 141.51929630049025, "bbox_max_lat": 40.536542014023155, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATMOR": 1}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:619:point"} +{"feature_id": 513550, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 620, "object_class_id": 96, "object_class": "MORFAC", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.52032882764783, "bbox_min_lat": 40.537350299432255, "bbox_max_lon": 141.52032882764783, "bbox_max_lat": 40.537350299432255, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATMOR": 1}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:620:point"} +{"feature_id": 513551, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 621, "object_class_id": 96, "object_class": "MORFAC", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.52196154300538, "bbox_min_lat": 40.53369006118854, "bbox_max_lon": 141.52196154300538, "bbox_max_lat": 40.53369006118854, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATMOR": 1}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:621:point"} +{"feature_id": 513552, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 622, "object_class_id": 96, "object_class": "MORFAC", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.52292286139348, "bbox_min_lat": 40.53288173162202, "bbox_max_lon": 141.52292286139348, "bbox_max_lat": 40.53288173162202, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATMOR": 1}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:622:point"} +{"feature_id": 513553, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 623, "object_class_id": 96, "object_class": "MORFAC", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.51968286238176, "bbox_min_lat": 40.535520205305204, "bbox_max_lon": 141.51968286238176, "bbox_max_lat": 40.535520205305204, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATMOR": 1}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:623:point"} +{"feature_id": 513554, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 624, "object_class_id": 96, "object_class": "MORFAC", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.52076116660544, "bbox_min_lat": 40.5347118978173, "bbox_max_lon": 141.52076116660544, "bbox_max_lat": 40.5347118978173, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATMOR": 1}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:624:point"} +{"feature_id": 604857, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 357, "object_class_id": 96, "object_class": "MORFAC", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.511917667929, "bbox_min_lat": 40.54966558933754, "bbox_max_lon": 141.51206517178392, "bbox_max_lat": 40.54977232366654, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATMOR": 1, "INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:357:area"} +{"feature_id": 604858, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 358, "object_class_id": 96, "object_class": "MORFAC", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.50930837559875, "bbox_min_lat": 40.54781041787348, "bbox_max_lon": 141.50945587945367, "bbox_max_lat": 40.54791715515927, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATMOR": 1, "INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:358:area"} +{"feature_id": 604500, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 0, "object_class_id": 210, "object_class": "M_PROD", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.33333119032937, "bbox_min_lat": 40.33333271662867, "bbox_max_lon": 141.66666447076832, "bbox_max_lat": 40.666666080886685, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CPDATE": "20140505"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:0:area"} +{"feature_id": 512930, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 0, "object_class_id": 210, "object_class": "M_PROD", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.3333345989699, "bbox_min_lat": 40.33333369451736, "bbox_max_lon": 141.66666793528825, "bbox_max_lat": 40.66666703083567, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CPDATE": "20060322"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:0:area"} +{"feature_id": 418056, "cell_id": 113, "source_relative_path": "03900420\\D\\03900423.D", "source_record_index": 0, "object_class_id": 210, "object_class": "M_PROD", "geometry_type": "AREA", "scale_code": "D", "native_scale": 100000, "raw_geotype": 132, "coverage_id": 1425, "bbox_min_lon": 141.0000012626516, "bbox_min_lat": 40.00000035819904, "bbox_max_lon": 142.0000012716066, "bbox_max_lat": 41.000000367154016, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CPDATE": "20060322"}, "suggested_source_id": "cm95:1:03900420/D/03900423.D:0:area"} +{"feature_id": 355672, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 0, "object_class_id": 210, "object_class": "M_PROD", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1253, "bbox_min_lon": 139.9999979009354, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 143.99999776911724, "bbox_max_lat": 43.999999304371535, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CPDATE": "20140602"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:0:area"} +{"feature_id": 327823, "cell_id": 12, "source_relative_path": "03900420\\B\\03900420.B", "source_record_index": 0, "object_class_id": 210, "object_class": "M_PROD", "geometry_type": "AREA", "scale_code": "B", "native_scale": 1000000, "raw_geotype": 132, "coverage_id": 1180, "bbox_min_lon": 139.9999979009354, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 149.99999773902806, "bbox_max_lat": 49.999999274282374, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CPDATE": "20141006"}, "suggested_source_id": "cm95:1:03900420/B/03900420.B:0:area"} +{"feature_id": 322990, "cell_id": 4, "source_relative_path": "03900420\\A\\03900420.A", "source_record_index": 0, "object_class_id": 210, "object_class": "M_PROD", "geometry_type": "AREA", "scale_code": "A", "native_scale": 3000000, "raw_geotype": 132, "coverage_id": 1160, "bbox_min_lon": 140.00000125369664, "bbox_min_lat": 40.00000035819904, "bbox_max_lon": 160.00000143279615, "bbox_max_lat": 60.00000053729857, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CPDATE": "20080102"}, "suggested_source_id": "cm95:1:03900420/A/03900420.A:0:area"} +{"feature_id": 644516, "cell_id": 784, "source_relative_path": "03900360\\Z\\03900360.Z", "source_record_index": 0, "object_class_id": 210, "object_class": "M_PROD", "geometry_type": "AREA", "scale_code": "Z", "native_scale": 20000000, "raw_geotype": 132, "coverage_id": 2311, "bbox_min_lon": 120.00000107459711, "bbox_min_lat": 40.00000035819904, "bbox_max_lon": 160.00000143279615, "bbox_max_lat": 80.00000071639808, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CPDATE": "20080102"}, "suggested_source_id": "cm95:1:03900360/Z/03900360.Z:0:area"} +{"feature_id": 604941, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 441, "object_class_id": 97, "object_class": "NATARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.45999631099423, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.59638651340472, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Jeppesen adopts \"International Boundaries and National Limits\" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.", "NATION": "JP"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:441:area"} +{"feature_id": 356830, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1158, "object_class_id": 97, "object_class": "NATARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.30000548760523, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 142.22018551373947, "bbox_max_lat": 41.33307476146743, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Jeppesen adopts \"International Boundaries and National Limits\" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.", "NATION": "JP"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1158:area"} +{"feature_id": 328179, "cell_id": 12, "source_relative_path": "03900420\\B\\03900420.B", "source_record_index": 356, "object_class_id": 97, "object_class": "NATARE", "geometry_type": "AREA", "scale_code": "B", "native_scale": 1000000, "raw_geotype": 132, "coverage_id": 1184, "bbox_min_lon": 139.9999979009354, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 141.7972054708302, "bbox_max_lat": 41.606003535658594, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Jeppesen adopts \"International Boundaries and National Limits\" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.", "NATION": "JP"}, "suggested_source_id": "cm95:1:03900420/B/03900420.B:356:area"} +{"feature_id": 605636, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1136, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5641289462338, "bbox_min_lat": 40.54285965398574, "bbox_max_lon": 141.5641289462338, "bbox_max_lat": 40.54285965398574, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"EXPSOU": 2, "VALSOU": 1.5, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1136:point"} +{"feature_id": 605637, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1137, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.56853371652238, "bbox_min_lat": 40.560744721391565, "bbox_max_lon": 141.56853371652238, "bbox_max_lat": 40.560744721391565, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Wave Meter", "VALSOU": 25, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1137:point"} +{"feature_id": 513555, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 625, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.57370488672046, "bbox_min_lat": 40.54443127602201, "bbox_max_lon": 141.57370488672046, "bbox_max_lat": 40.54443127602201, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 1.2, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:625:point"} +{"feature_id": 513556, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 626, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.56420868867505, "bbox_min_lat": 40.542896196043614, "bbox_max_lon": 141.56420868867505, "bbox_max_lat": 40.542896196043614, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 1.5, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:626:point"} +{"feature_id": 513557, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 627, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.52719030122216, "bbox_min_lat": 40.53315625973812, "bbox_max_lon": 141.52719030122216, "bbox_max_lat": 40.53315625973812, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 4.9, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:627:point"} +{"feature_id": 359184, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 3512, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "POINT", "scale_code": "C", "native_scale": 200000, "raw_geotype": 129, "coverage_id": 1255, "bbox_min_lon": 141.56905255282143, "bbox_min_lat": 40.56070397061267, "bbox_max_lon": 141.56905255282143, "bbox_max_lat": 40.56070397061267, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Wave Meter", "VALSOU": 25, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:3512:point"} +{"feature_id": 604548, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 48, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.54769498225886, "bbox_min_lat": 40.53520405642359, "bbox_max_lon": 141.5508434266106, "bbox_max_lat": 40.538360952649, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:48:area"} +{"feature_id": 604555, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 55, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.553391682863, "bbox_min_lat": 40.53572259065104, "bbox_max_lon": 141.55575174454185, "bbox_max_lat": 40.53822878284375, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:55:area"} +{"feature_id": 604570, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 70, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5710107640172, "bbox_min_lat": 40.54270716058238, "bbox_max_lon": 141.57322840818094, "bbox_max_lat": 40.544074505699285, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:70:area"} +{"feature_id": 604572, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 72, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5454925971146, "bbox_min_lat": 40.53838636988935, "bbox_max_lon": 141.5491598481285, "bbox_max_lat": 40.53993171998525, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:72:area"} +{"feature_id": 604587, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 87, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.53480111080222, "bbox_min_lat": 40.535127801051665, "bbox_max_lon": 141.53659658876046, "bbox_max_lat": 40.53642921416697, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:87:area"} +{"feature_id": 604602, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 102, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.55605692493137, "bbox_min_lat": 40.53851853938367, "bbox_max_lon": 141.55791343896752, "bbox_max_lat": 40.540460384202795, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:102:area"} +{"feature_id": 604611, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 111, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.566392367456, "bbox_min_lat": 40.54250383550453, "bbox_max_lon": 141.56866596135782, "bbox_max_lat": 40.54390676597883, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:111:area"} +{"feature_id": 604627, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 127, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.578869159047, "bbox_min_lat": 40.540770464158435, "bbox_max_lon": 141.58046118341227, "bbox_max_lat": 40.54254958370087, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:127:area"} +{"feature_id": 604628, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 128, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.49703503760074, "bbox_min_lat": 40.55919985151106, "bbox_max_lon": 141.49803704654624, "bbox_max_lat": 40.560399161487446, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:128:area"} +{"feature_id": 604632, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 132, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.48980734870923, "bbox_min_lat": 40.56300606202476, "bbox_max_lon": 141.4910382429469, "bbox_max_lat": 40.563747968375345, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:132:area"} +{"feature_id": 604638, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 138, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.57782645938286, "bbox_min_lat": 40.54214293197139, "bbox_max_lon": 141.57859449669644, "bbox_max_lat": 40.543444208815785, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:138:area"} +{"feature_id": 604647, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 147, "object_class_id": 99, "object_class": "OBSTRN", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.54282735504623, "bbox_min_lat": 40.52757300537249, "bbox_max_lon": 141.54366660111737, "bbox_max_lat": 40.52858476697277, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:147:area"} +{"feature_id": 606543, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2043, "object_class_id": 104, "object_class": "PILBOP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.55123507477714, "bbox_min_lat": 40.56489638253686, "bbox_max_lon": 141.55123507477714, "bbox_max_lat": 40.56489638253686, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2043:point"} +{"feature_id": 606544, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2044, "object_class_id": 104, "object_class": "PILBOP", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.55165215464282, "bbox_min_lat": 40.5816680975283, "bbox_max_lon": 141.55165215464282, "bbox_max_lat": 40.5816680975283, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2044:point"} +{"feature_id": 513842, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 912, "object_class_id": 104, "object_class": "PILBOP", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.55242872366532, "bbox_min_lat": 40.564373951200075, "bbox_max_lon": 141.55242872366532, "bbox_max_lat": 40.564373951200075, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:912:point"} +{"feature_id": 606536, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2036, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.54550785613407, "bbox_min_lat": 40.549177658809995, "bbox_max_lon": 141.54550785613407, "bbox_max_lat": 40.549177658809995, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Private"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2036:point"} +{"feature_id": 606537, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2037, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.49653148995804, "bbox_min_lat": 40.56304163306486, "bbox_max_lon": 141.49653148995804, "bbox_max_lat": 40.56304163306486, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2037:point"} +{"feature_id": 606538, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2038, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50991873637773, "bbox_min_lat": 40.54829327566755, "bbox_max_lon": 141.50991873637773, "bbox_max_lat": 40.54829327566755, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2038:point"} +{"feature_id": 606539, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2039, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50976105984319, "bbox_min_lat": 40.54817129086928, "bbox_max_lon": 141.50976105984319, "bbox_max_lat": 40.54817129086928, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2039:point"} +{"feature_id": 606540, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2040, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.49636872708362, "bbox_min_lat": 40.56310769351778, "bbox_max_lon": 141.49636872708362, "bbox_max_lat": 40.56310769351778, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2040:point"} +{"feature_id": 606541, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2041, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50988821833877, "bbox_min_lat": 40.54808488483609, "bbox_max_lon": 141.50988821833877, "bbox_max_lat": 40.54808488483609, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2041:point"} +{"feature_id": 606542, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2042, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5100357221937, "bbox_min_lat": 40.54820686979171, "bbox_max_lon": 141.5100357221937, "bbox_max_lat": 40.54820686979171, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2042:point"} +{"feature_id": 513830, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 900, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.51965743067836, "bbox_min_lat": 40.536725022894316, "bbox_max_lon": 141.51965743067836, "bbox_max_lat": 40.536725022894316, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:900:point"} +{"feature_id": 513831, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 901, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.519804934558, "bbox_min_lat": 40.53542869928663, "bbox_max_lon": 141.519804934558, "bbox_max_lat": 40.53542869928663, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Always dry"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:901:point"} +{"feature_id": 513832, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 902, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.52064418076986, "bbox_min_lat": 40.534767818775094, "bbox_max_lon": 141.52064418076986, "bbox_max_lat": 40.534767818775094, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:902:point"} +{"feature_id": 513833, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 903, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.5198761433275, "bbox_min_lat": 40.53690803126555, "bbox_max_lon": 141.5198761433275, "bbox_max_lat": 40.53690803126555, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:903:point"} +{"feature_id": 513834, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 904, "object_class_id": 103, "object_class": "PILPNT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.52208361518166, "bbox_min_lat": 40.533613804098835, "bbox_max_lon": 141.52208361518166, "bbox_max_lat": 40.533613804098835, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:904:point"} +{"feature_id": 605468, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 968, "object_class_id": 106, "object_class": "PIPOHD", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.50971528278473, "bbox_min_lat": 40.54804930584882, "bbox_max_lon": 141.51005098121317, "bbox_max_lat": 40.54829327566755, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:968:line"} +{"feature_id": 605469, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 969, "object_class_id": 106, "object_class": "PIPOHD", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.50970002376528, "bbox_min_lat": 40.54807471941306, "bbox_max_lon": 141.51002046317427, "bbox_max_lat": 40.54830344105737, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:969:line"} +{"feature_id": 605470, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 970, "object_class_id": 107, "object_class": "PIPSOL", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.5039321144036, "bbox_min_lat": 40.53110647814896, "bbox_max_lon": 141.504181345055, "bbox_max_lat": 40.53250964730796, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATPIP": 1, "PRODCT": [2]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:970:line"} +{"feature_id": 513457, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 527, "object_class_id": 107, "object_class": "PIPSOL", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 130, "coverage_id": 1759, "bbox_min_lon": 141.50387451555522, "bbox_min_lat": 40.531092187451655, "bbox_max_lon": 141.50411357356705, "bbox_max_lat": 40.53251569238428, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATPIP": 1, "INFORM": "PIPELINES|Mariners are advised not to anchor or trawl in the vicinity of pipelines. Gas from a damaged oil or gas pipeline could cause an explosion, loss of a vessels buoyancy or other serious hazard. Pipelines are not always buried and may effectively reduce the charted depth by up to 2 metres. They may also span seabed undulations and cause fishing gear to become irrecoverably snagged, putting a vessel in severe danger. See Annual Notice to Mariners No 24 and The Mariners Handbook.", "PRODCT": [1]}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:527:line"} +{"feature_id": 605638, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1138, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5151525800578, "bbox_min_lat": 40.53628687333873, "bbox_max_lon": 141.5151525800578, "bbox_max_lat": 40.53628687333873, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Tozai Oilterminal Co.,Ltd.", "PRODCT": [1], "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1138:point"} +{"feature_id": 605639, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1139, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.48837300087854, "bbox_min_lat": 40.54867955939618, "bbox_max_lon": 141.48837300087854, "bbox_max_lat": 40.54867955939618, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Tohoku Satetsu", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1139:point"} +{"feature_id": 605640, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1140, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50824024423545, "bbox_min_lat": 40.52898641683994, "bbox_max_lon": 141.50824024423545, "bbox_max_lat": 40.52898641683994, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "MRC Unitec Co., Ltd.", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1140:point"} +{"feature_id": 605641, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1141, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.4876761723225, "bbox_min_lat": 40.55089048260121, "bbox_max_lon": 141.4876761723225, "bbox_max_lat": 40.55089048260121, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Toshin Steel Industry", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1141:point"} +{"feature_id": 605642, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1142, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.49213689234915, "bbox_min_lat": 40.531909745248655, "bbox_max_lon": 141.49213689234915, "bbox_max_lat": 40.531909745248655, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Hachinohe Gas Co., Ltd.", "PRODCT": [2]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1142:point"} +{"feature_id": 605643, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1143, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50676011934632, "bbox_min_lat": 40.53814236398398, "bbox_max_lon": 141.50676011934632, "bbox_max_lat": 40.53814236398398, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Pacific Metals CO., LTD.", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1143:point"} +{"feature_id": 605644, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1144, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5025994933694, "bbox_min_lat": 40.5343093212615, "bbox_max_lon": 141.5025994933694, "bbox_max_lat": 40.5343093212615, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Pacific Metals CO., LTD.", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1144:point"} +{"feature_id": 605645, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1145, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.49952734411502, "bbox_min_lat": 40.52800008248382, "bbox_max_lon": 141.49952734411502, "bbox_max_lat": 40.52800008248382, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Koshuha Foundry Co., Ltd.", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1145:point"} +{"feature_id": 605646, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1146, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55052298720165, "bbox_min_lat": 40.532885854333834, "bbox_max_lon": 141.55052298720165, "bbox_max_lat": 40.532885854333834, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Sumimetal Mining Co., Ltd.", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1146:point"} +{"feature_id": 605647, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1147, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.49177576222155, "bbox_min_lat": 40.55442272567037, "bbox_max_lon": 141.49177576222155, "bbox_max_lat": 40.55442272567037, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Hachinohe Smelting Co., Ltd.", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1147:point"} +{"feature_id": 605648, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1148, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.50546818903078, "bbox_min_lat": 40.53062858049595, "bbox_max_lon": 141.50546818903078, "bbox_max_lat": 40.53062858049595, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Kitanihon Shipbuilding Co., Ltd.", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1148:point"} +{"feature_id": 605649, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1149, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.51997443021202, "bbox_min_lat": 40.53397887627707, "bbox_max_lon": 141.51997443021202, "bbox_max_lat": 40.53397887627707, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "JX Nippon Oil & Energy Corporation", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1149:point"} +{"feature_id": 604522, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 22, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.47556051085908, "bbox_min_lat": 40.56808744764105, "bbox_max_lon": 141.48006700794411, "bbox_max_lat": 40.57377814151934, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Mitsubishi Paper Mills Limited"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:22:area"} +{"feature_id": 604533, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 33, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.51657166886898, "bbox_min_lat": 40.5301455953626, "bbox_max_lon": 141.5218156852287, "bbox_max_lat": 40.5327638414758, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Tank farm"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:33:area"} +{"feature_id": 604534, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 34, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5151525800578, "bbox_min_lat": 40.53412122200863, "bbox_max_lon": 141.51980149465794, "bbox_max_lat": 40.53723750099305, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Tank farm"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:34:area"} +{"feature_id": 604559, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 59, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.51973028590038, "bbox_min_lat": 40.53194533280882, "bbox_max_lon": 141.5224667367263, "bbox_max_lat": 40.53397887627707, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Tank farm"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:59:area"} +{"feature_id": 604560, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 60, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5130926124286, "bbox_min_lat": 40.53118273809742, "bbox_max_lon": 141.5149745581639, "bbox_max_lat": 40.53331289758738, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Tank farm|Oil Tank Yard", "PRODCT": [1]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:60:area"} +{"feature_id": 604563, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 63, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.49270147606973, "bbox_min_lat": 40.547246232251226, "bbox_max_lon": 141.49581940238252, "bbox_max_lat": 40.54980790173839, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Tokyotekko Co., Ltd."}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:63:area"} +{"feature_id": 604582, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 82, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.51023917578672, "bbox_min_lat": 40.5325198150932, "bbox_max_lon": 141.51196344498743, "bbox_max_lat": 40.53362301062516, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Tank farm"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:82:area"} +{"feature_id": 604591, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 91, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.49783359295327, "bbox_min_lat": 40.54635165791852, "bbox_max_lon": 141.49958838019293, "bbox_max_lat": 40.54775450779876, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area", "OBJNAM": "Yoshida Sangyo Corporation"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:91:area"} +{"feature_id": 604654, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 154, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.48168955034834, "bbox_min_lat": 40.562335290300744, "bbox_max_lon": 141.48241689694333, "bbox_max_lat": 40.56347356561492, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Tank farm"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:154:area"} +{"feature_id": 604658, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 158, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.55021780681213, "bbox_min_lat": 40.531416601398206, "bbox_max_lon": 141.55095532608678, "bbox_max_lat": 40.532753673727576, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area|Silo farm"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:158:area"} +{"feature_id": 604702, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 202, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.4880830795085, "bbox_min_lat": 40.55522063103808, "bbox_max_lon": 141.4891105201532, "bbox_max_lat": 40.55577458522323, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Tank farm"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:202:area"} +{"feature_id": 604737, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 237, "object_class_id": 111, "object_class": "PRDINS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.54511620796754, "bbox_min_lat": 40.52835597799762, "bbox_max_lon": 141.54565535998898, "bbox_max_lat": 40.528828807685365, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Production area|Silo farm"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:237:area"} +{"feature_id": 513650, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 720, "object_class_id": 112, "object_class": "PYLONS", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.55533302419232, "bbox_min_lat": 40.53861100186131, "bbox_max_lon": 141.55533302419232, "bbox_max_lat": 40.53861100186131, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Power transmission pylon/pole"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:720:point"} +{"feature_id": 513651, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 721, "object_class_id": 112, "object_class": "PYLONS", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.55657917765836, "bbox_min_lat": 40.53857541784393, "bbox_max_lon": 141.55657917765836, "bbox_max_lat": 40.53857541784393, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Power transmission pylon/pole"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:721:point"} +{"feature_id": 605471, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 971, "object_class_id": 130, "object_class": "RIVBNK", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.46667976152443, "bbox_min_lat": 40.58934378105781, "bbox_max_lon": 141.46818531811266, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:971:line"} +{"feature_id": 605472, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 972, "object_class_id": 130, "object_class": "RIVBNK", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.45999631099423, "bbox_min_lat": 40.58533587354387, "bbox_max_lon": 141.46794117380105, "bbox_max_lat": 40.589389497248476, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:972:line"} +{"feature_id": 605473, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 973, "object_class_id": 130, "object_class": "RIVBNK", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.46657803472792, "bbox_min_lat": 40.58933362190007, "bbox_max_lon": 141.4680123825586, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:973:line"} +{"feature_id": 605474, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 974, "object_class_id": 130, "object_class": "RIVBNK", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.45999631099423, "bbox_min_lat": 40.58575242264449, "bbox_max_lon": 141.4680123825586, "bbox_max_lat": 40.58959775949944, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:974:line"} +{"feature_id": 357930, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 2258, "object_class_id": 130, "object_class": "RIVBNK", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.42604500431835, "bbox_min_lat": 40.47736990683258, "bbox_max_lon": 141.50307254431448, "bbox_max_lat": 40.54153506842535, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:2258:line"} +{"feature_id": 357943, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 2271, "object_class_id": 130, "object_class": "RIVBNK", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.49361195105027, "bbox_min_lat": 40.50205608050168, "bbox_max_lon": 141.5250455351216, "bbox_max_lat": 40.53297909710472, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:2271:line"} +{"feature_id": 357950, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 2278, "object_class_id": 130, "object_class": "RIVBNK", "geometry_type": "LINE", "scale_code": "C", "native_scale": 200000, "raw_geotype": 2, "coverage_id": 1255, "bbox_min_lon": 141.38484564655496, "bbox_min_lat": 40.59166232814556, "bbox_max_lon": 141.46498602691543, "bbox_max_lat": 40.60688658555062, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:2278:line"} +{"feature_id": 604551, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 51, "object_class_id": 129, "object_class": "RIVERS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.45999631099423, "bbox_min_lat": 40.58533587354387, "bbox_max_lon": 141.4680123825586, "bbox_max_lat": 40.58959775949944, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Gonohe Kawa"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:51:area"} +{"feature_id": 604644, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 144, "object_class_id": 129, "object_class": "RIVERS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.46657803472792, "bbox_min_lat": 40.58933362190007, "bbox_max_lon": 141.46818531811266, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:144:area"} +{"feature_id": 355983, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 311, "object_class_id": 129, "object_class": "RIVERS", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.42604500431835, "bbox_min_lat": 40.47736990683258, "bbox_max_lon": 141.50307254431448, "bbox_max_lat": 40.54153506842535, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Mabechi River"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:311:area"} +{"feature_id": 356044, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 372, "object_class_id": 129, "object_class": "RIVERS", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.38484564655496, "bbox_min_lat": 40.59166232814556, "bbox_max_lon": 141.46498602691543, "bbox_max_lat": 40.60688658555062, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Oirase River"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:372:area"} +{"feature_id": 356056, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 384, "object_class_id": 129, "object_class": "RIVERS", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 4, "coverage_id": 1255, "bbox_min_lon": 141.49361195105027, "bbox_min_lat": 40.50205608050168, "bbox_max_lon": 141.5250455351216, "bbox_max_lat": 40.53297909710472, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:384:area"} +{"feature_id": 606545, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2045, "object_class_id": 127, "object_class": "RSCSTA", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.55643331407842, "bbox_min_lat": 40.53463976461626, "bbox_max_lon": 141.55643331407842, "bbox_max_lat": 40.53463976461626, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2045:point"} +{"feature_id": 513843, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 913, "object_class_id": 118, "object_class": "RTPBCN", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.57267744590357, "bbox_min_lat": 40.5397649304665, "bbox_max_lon": 141.57267744590357, "bbox_max_lat": 40.5397649304665, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATRTB": 1, "SORIND": "GB,MDHS,graph,LL F-6620.A"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:913:point"} +{"feature_id": 606229, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1729, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5384073257382, "bbox_min_lat": 40.579620761128076, "bbox_max_lon": 141.5384073257382, "bbox_max_lat": 40.579620761128076, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1729:point"} +{"feature_id": 606230, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1730, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.58481000396276, "bbox_min_lat": 40.550524541732436, "bbox_max_lon": 141.58481000396276, "bbox_max_lat": 40.550524541732436, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1730:point"} +{"feature_id": 606231, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1731, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.59467750322347, "bbox_min_lat": 40.58652455557915, "bbox_max_lon": 141.59467750322347, "bbox_max_lat": 40.58652455557915, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1731:point"} +{"feature_id": 606232, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1732, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5693475308944, "bbox_min_lat": 40.55354349409437, "bbox_max_lon": 141.5693475308944, "bbox_max_lat": 40.55354349409437, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1732:point"} +{"feature_id": 606233, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1733, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.56588373347347, "bbox_min_lat": 40.54730214275028, "bbox_max_lon": 141.56588373347347, "bbox_max_lat": 40.54730214275028, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1733:point"} +{"feature_id": 606234, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1734, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.59106620194763, "bbox_min_lat": 40.527084913912766, "bbox_max_lon": 141.59106620194763, "bbox_max_lat": 40.527084913912766, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1734:point"} +{"feature_id": 606235, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1735, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.58846199595715, "bbox_min_lat": 40.55680116710043, "bbox_max_lon": 141.58846199595715, "bbox_max_lat": 40.55680116710043, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1735:point"} +{"feature_id": 606236, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1736, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.57148887996075, "bbox_min_lat": 40.54992988355559, "bbox_max_lon": 141.57148887996075, "bbox_max_lat": 40.54992988355559, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1736:point"} +{"feature_id": 606237, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1737, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.57569528299612, "bbox_min_lat": 40.551861232717016, "bbox_max_lon": 141.57569528299612, "bbox_max_lat": 40.551861232717016, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1737:point"} +{"feature_id": 606238, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1738, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55759299955852, "bbox_min_lat": 40.54935555055996, "bbox_max_lon": 141.55759299955852, "bbox_max_lat": 40.54935555055996, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1738:point"} +{"feature_id": 606239, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1739, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.51468463679387, "bbox_min_lat": 40.57942262847366, "bbox_max_lon": 141.51468463679387, "bbox_max_lat": 40.57942262847366, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1739:point"} +{"feature_id": 606240, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1740, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.51186171819094, "bbox_min_lat": 40.56033309836147, "bbox_max_lon": 141.51186171819094, "bbox_max_lat": 40.56033309836147, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATQUA": [1], "NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1740:point"} +{"feature_id": 604952, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 452, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.58220071163242, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.59028799195437, "bbox_max_lat": 40.531360677639675, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:452:area"} +{"feature_id": 604953, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 453, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5762140896583, "bbox_min_lat": 40.537105328971435, "bbox_max_lon": 141.58281107241146, "bbox_max_lat": 40.542453004138665, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [9]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:453:area"} +{"feature_id": 604956, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 456, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5799830674687, "bbox_min_lat": 40.53413138954932, "bbox_max_lon": 141.58195148098105, "bbox_max_lat": 40.53714599731356, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:456:area"} +{"feature_id": 604960, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 460, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.58185484052436, "bbox_min_lat": 40.53263166062886, "bbox_max_lon": 141.58383851305615, "bbox_max_lat": 40.53412122200863, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [9]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:460:area"} +{"feature_id": 604962, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 462, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.47098280501646, "bbox_min_lat": 40.58631628375762, "bbox_max_lon": 141.47273759225612, "bbox_max_lat": 40.587997679213444, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [4]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:462:area"} +{"feature_id": 604963, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 463, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5822312296714, "bbox_min_lat": 40.53122849402484, "bbox_max_lon": 141.5833909151515, "bbox_max_lat": 40.53234187862896, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [9]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:463:area"} +{"feature_id": 604973, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 473, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5819667400005, "bbox_min_lat": 40.53194533280882, "bbox_max_lon": 141.58253132372107, "bbox_max_lat": 40.532926525237144, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [5]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:473:area"} +{"feature_id": 513200, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 270, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.56559725968006, "bbox_min_lat": 40.542804700099516, "bbox_max_lon": 141.5678759403037, "bbox_max_lat": 40.54351633192592, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [9]}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:270:area"} +{"feature_id": 356970, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1298, "object_class_id": 138, "object_class": "SBDARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.60323276074365, "bbox_min_lat": 40.50786694748101, "bbox_max_lon": 141.61269335400783, "bbox_max_lat": 40.51605129318746, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATSUR": [9]}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1298:area"} +{"feature_id": 356820, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1148, "object_class_id": 136, "object_class": "SEAARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.37538505329078, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 143.08335783594634, "bbox_max_lat": 41.33307476146743, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "North Pacific Ocean"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1148:area"} +{"feature_id": 356905, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1233, "object_class_id": 136, "object_class": "SEAARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.5926735179391, "bbox_min_lat": 40.533603657525966, "bbox_max_lon": 141.59932645126682, "bbox_max_lat": 40.53859993131931, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Hamanaka"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1233:area"} +{"feature_id": 606440, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1940, "object_class_id": 142, "object_class": "SILBUI", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.54422101215832, "bbox_min_lat": 40.527369634362906, "bbox_max_lon": 141.54422101215832, "bbox_max_lat": 40.527369634362906, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1940:point"} +{"feature_id": 606441, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1941, "object_class_id": 142, "object_class": "SILBUI", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.54400229954584, "bbox_min_lat": 40.527339128658255, "bbox_max_lon": 141.54400229954584, "bbox_max_lat": 40.527339128658255, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1941:point"} +{"feature_id": 513719, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 789, "object_class_id": 142, "object_class": "SILBUI", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.54410238397577, "bbox_min_lat": 40.5283416869048, "bbox_max_lon": 141.54410238397577, "bbox_max_lat": 40.5283416869048, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "More than one", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:789:point"} +{"feature_id": 513720, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 790, "object_class_id": 142, "object_class": "SILBUI", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.5090066332991, "bbox_min_lat": 40.54605781244458, "bbox_max_lon": 141.5090066332991, "bbox_max_lat": 40.54605781244458, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "more than one", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:790:point"} +{"feature_id": 513721, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 791, "object_class_id": 142, "object_class": "SILBUI", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 129, "coverage_id": 1759, "bbox_min_lon": 141.54427023321813, "bbox_min_lat": 40.52743160734014, "bbox_max_lon": 141.54427023321813, "bbox_max_lat": 40.52743160734014, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "SILOS"}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:791:point"} +{"feature_id": 604966, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 466, "object_class_id": 142, "object_class": "SILBUI", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 4, "coverage_id": 2200, "bbox_min_lon": 141.5076451424759, "bbox_min_lat": 40.54524358905386, "bbox_max_lon": 141.50872853285864, "bbox_max_lat": 40.5461839239009, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:466:area"} +{"feature_id": 606546, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2046, "object_class_id": 140, "object_class": "SISTAT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5214392960816, "bbox_min_lat": 40.52813227246671, "bbox_max_lon": 141.5214392960816, "bbox_max_lat": 40.52813227246671, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSIT": [2]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2046:point"} +{"feature_id": 606547, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2047, "object_class_id": 140, "object_class": "SISTAT", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52367219926484, "bbox_min_lat": 40.52990155944516, "bbox_max_lon": 141.52367219926484, "bbox_max_lat": 40.52990155944516, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSIT": [2]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2047:point"} +{"feature_id": 513844, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 914, "object_class_id": 140, "object_class": "SISTAT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.52138678650883, "bbox_min_lat": 40.52817899202388, "bbox_max_lon": 141.52138678650883, "bbox_max_lat": 40.52817899202388, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:914:point"} +{"feature_id": 513845, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 915, "object_class_id": 140, "object_class": "SISTAT", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.52366546713245, "bbox_min_lat": 40.529897436757, "bbox_max_lon": 141.52366546713245, "bbox_max_lat": 40.529897436757, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:915:point"} +{"feature_id": 606548, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2048, "object_class_id": 141, "object_class": "SISTAW", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55547708219132, "bbox_min_lat": 40.535127801051665, "bbox_max_lon": 141.55547708219132, "bbox_max_lat": 40.535127801051665, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSIW": [10]}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2048:point"} +{"feature_id": 605475, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 975, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.51969976786143, "bbox_min_lat": 40.535381985287216, "bbox_max_lon": 141.51973028590038, "bbox_max_lat": 40.53540231998442, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:975:line"} +{"feature_id": 605476, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 976, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.52770058040633, "bbox_min_lat": 40.5314572731933, "bbox_max_lon": 141.52799050177637, "bbox_max_lat": 40.53179281456082, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:976:line"} +{"feature_id": 605477, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 977, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.48515334776926, "bbox_min_lat": 40.558874611203855, "bbox_max_lon": 141.48675045847435, "bbox_max_lat": 40.559870654654276, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:977:line"} +{"feature_id": 605478, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 978, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.52725298250175, "bbox_min_lat": 40.5271408412395, "bbox_max_lon": 141.53649486196397, "bbox_max_lat": 40.5315386167094, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:978:line"} +{"feature_id": 605479, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 979, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.48589086704388, "bbox_min_lat": 40.53130475383445, "bbox_max_lon": 141.48606888893775, "bbox_max_lat": 40.53144710524684, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:979:line"} +{"feature_id": 605480, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 980, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.5424967429576, "bbox_min_lat": 40.52762384802846, "bbox_max_lon": 141.54268493753113, "bbox_max_lat": 40.52763910081771, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:980:line"} +{"feature_id": 605481, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 981, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.54248148393813, "bbox_min_lat": 40.52790348194681, "bbox_max_lon": 141.54266967851163, "bbox_max_lat": 40.52791365043095, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:981:line"} +{"feature_id": 605482, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 982, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.50949657017225, "bbox_min_lat": 40.547896824260796, "bbox_max_lon": 141.5098322686007, "bbox_max_lat": 40.54815096004797, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:982:line"} +{"feature_id": 605483, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 983, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.51555440090397, "bbox_min_lat": 40.53871679313628, "bbox_max_lon": 141.5158290632545, "bbox_max_lat": 40.538915046302165, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:983:line"} +{"feature_id": 605484, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 984, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.4957634526444, "bbox_min_lat": 40.53131492180248, "bbox_max_lon": 141.49584992042145, "bbox_max_lat": 40.531767394819084, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:984:line"} +{"feature_id": 605485, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 985, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.51920639289838, "bbox_min_lat": 40.5301455953626, "bbox_max_lon": 141.5192674289763, "bbox_max_lat": 40.530155763506556, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:985:line"} +{"feature_id": 605486, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 986, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 130, "coverage_id": 2200, "bbox_min_lon": 141.48506687999222, "bbox_min_lat": 40.53057774011952, "bbox_max_lon": 141.48525507456577, "bbox_max_lat": 40.530730261133066, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:986:line"} +{"feature_id": 604998, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 498, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.48233042916632, "bbox_min_lat": 40.563702234660056, "bbox_max_lon": 141.49193343875612, "bbox_max_lat": 40.571181822467274, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSLC": 6, "OBJNAM": "No 4 Wharf", "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:498:area"} +{"feature_id": 604999, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 499, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.50182128337616, "bbox_min_lat": 40.54334763054349, "bbox_max_lon": 141.5100357221937, "bbox_max_lat": 40.54897943601769, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSLC": 6, "OBJNAM": "No 3 Wharf", "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:499:area"} +{"feature_id": 605000, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 500, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.49338304560627, "bbox_min_lat": 40.55327413182146, "bbox_max_lon": 141.50128213135469, "bbox_max_lat": 40.558183470304584, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSLC": 6, "OBJNAM": "No 1 Wharf", "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:500:area"} +{"feature_id": 605001, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 501, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.49832696791628, "bbox_min_lat": 40.54858298867289, "bbox_max_lon": 141.50594630497434, "bbox_max_lat": 40.55272523930777, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSLC": 6, "OBJNAM": "No 2 Wharf", "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:501:area"} +{"feature_id": 605002, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 502, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5107579824489, "bbox_min_lat": 40.53889471267114, "bbox_max_lon": 141.5174261739596, "bbox_max_lat": 40.54304772870506, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSLC": 6, "OBJNAM": "Kawaragi No 2 Wharf", "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:502:area"} +{"feature_id": 605003, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 503, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.47699485868978, "bbox_min_lat": 40.55540867104595, "bbox_max_lon": 141.52820921438885, "bbox_max_lat": 40.57845227802509, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATCON": [3], "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:503:area"} +{"feature_id": 605004, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 504, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.53498930537572, "bbox_min_lat": 40.54922340244798, "bbox_max_lon": 141.5454925971146, "bbox_max_lat": 40.56592282453552, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSLC": 1, "NATCON": [3], "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:504:area"} +{"feature_id": 605005, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 505, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.53481636982167, "bbox_min_lat": 40.54910141934393, "bbox_max_lon": 141.54553837417302, "bbox_max_lat": 40.56589233638616, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSLC": 1, "OBJNAM": "Middle Breakwater", "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:505:area"} +{"feature_id": 605006, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 506, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.47721357130226, "bbox_min_lat": 40.56706103884022, "bbox_max_lon": 141.4916892944445, "bbox_max_lat": 40.57847259964477, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"NATCON": [3], "WATLEV": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:506:area"} +{"feature_id": 605007, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 507, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.54939381976047, "bbox_min_lat": 40.54470479665162, "bbox_max_lon": 141.5603192777048, "bbox_max_lat": 40.549960378975165, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSLC": 1, "NATCON": [3], "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:507:area"} +{"feature_id": 605008, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 508, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.49187748901807, "bbox_min_lat": 40.55859002463888, "bbox_max_lon": 141.5066431335304, "bbox_max_lat": 40.56627851858513, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSLC": 1, "OBJNAM": "Hattaro North Breakwater", "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:508:area"} +{"feature_id": 605009, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 509, "object_class_id": 139, "object_class": "SLCONS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5338296198956, "bbox_min_lat": 40.536088612395424, "bbox_max_lon": 141.54678452743016, "bbox_max_lat": 40.538432120897646, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATSLC": 1, "NATCON": [3], "WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:509:area"} +{"feature_id": 604975, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 475, "object_class_id": 143, "object_class": "SLIPWY", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.4736175290459, "bbox_min_lat": 40.58537651259471, "bbox_max_lon": 141.4746347970109, "bbox_max_lat": 40.58675822563124, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"OBJNAM": "Ichikawa Slipway", "WATLEV": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:475:area"} +{"feature_id": 513212, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 282, "object_class_id": 143, "object_class": "SLIPWY", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.48513643649827, "bbox_min_lat": 40.55965309509652, "bbox_max_lon": 141.48580783346776, "bbox_max_lat": 40.55996308617321, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 4}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:282:area"} +{"feature_id": 513213, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 283, "object_class_id": 143, "object_class": "SLIPWY", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.48477530631015, "bbox_min_lat": 40.559505721786124, "bbox_max_lon": 141.48520764526776, "bbox_max_lat": 40.55974456802254, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"WATLEV": 2}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:283:area"} +{"feature_id": 606738, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2238, "object_class_id": 147, "object_class": "SOUNDG", "geometry_type": "SOUNDING", "scale_code": "F", "native_scale": 20000, "raw_geotype": 8, "coverage_id": null, "bbox_min_lon": 141.47073357436506, "bbox_min_lat": 40.52099872504556, "bbox_max_lon": 141.59583718870357, "bbox_max_lat": 40.5929095500782, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2238:sounding"} +{"feature_id": 513921, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 991, "object_class_id": 147, "object_class": "SOUNDG", "geometry_type": "SOUNDING", "scale_code": "E", "native_scale": 50000, "raw_geotype": 8, "coverage_id": null, "bbox_min_lon": 141.48180488335433, "bbox_min_lat": 40.52569276174202, "bbox_max_lon": 141.57742300175593, "bbox_max_lat": 40.57195000057247, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:991:sounding"} +{"feature_id": 362107, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 6435, "object_class_id": 147, "object_class": "SOUNDG", "geometry_type": "SOUNDING", "scale_code": "C", "native_scale": 200000, "raw_geotype": 8, "coverage_id": null, "bbox_min_lon": 140.00018100919212, "bbox_min_lat": 40.00088065242476, "bbox_max_lon": 143.984799783809, "bbox_max_lat": 43.997398301187744, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:6435:sounding"} +{"feature_id": 329756, "cell_id": 12, "source_relative_path": "03900420\\B\\03900420.B", "source_record_index": 1933, "object_class_id": 147, "object_class": "SOUNDG", "geometry_type": "SOUNDING", "scale_code": "B", "native_scale": 1000000, "raw_geotype": 8, "coverage_id": null, "bbox_min_lon": 140.06225470926594, "bbox_min_lat": 40.00962335193312, "bbox_max_lon": 149.9995399683786, "bbox_max_lat": 49.99972078852007, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/B/03900420.B:1933:sounding"} +{"feature_id": 605582, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1082, "object_class_id": 154, "object_class": "TELPHC", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.50892181377202, "bbox_min_lat": 40.547246232251226, "bbox_max_lon": 141.50962881500772, "bbox_max_lat": 40.547896824260796, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1082:line"} +{"feature_id": 605583, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1083, "object_class_id": 154, "object_class": "TELPHC", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.50817920815757, "bbox_min_lat": 40.54612801246834, "bbox_max_lon": 141.50892181377202, "bbox_max_lat": 40.547246232251226, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1083:line"} +{"feature_id": 513504, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 574, "object_class_id": 154, "object_class": "TELPHC", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 2, "coverage_id": 1759, "bbox_min_lon": 141.5093931951906, "bbox_min_lat": 40.54792828049828, "bbox_max_lon": 141.50956104443296, "bbox_max_lat": 40.54801976944343, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:574:line"} +{"feature_id": 513505, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 575, "object_class_id": 154, "object_class": "TELPHC", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 2, "coverage_id": 1759, "bbox_min_lon": 141.50799953784488, "bbox_min_lat": 40.54614930394491, "bbox_max_lon": 141.5089354245296, "bbox_max_lat": 40.54745050286525, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:575:line"} +{"feature_id": 513506, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 576, "object_class_id": 154, "object_class": "TELPHC", "geometry_type": "LINE", "scale_code": "E", "native_scale": 50000, "raw_geotype": 2, "coverage_id": 1759, "bbox_min_lon": 141.5090524103652, "bbox_min_lat": 40.54759790271135, "bbox_max_lon": 141.50924569131095, "bbox_max_lat": 40.54778088137933, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:576:line"} +{"feature_id": 604942, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 442, "object_class_id": 155, "object_class": "TESARE", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.46794117380105, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.59638651340472, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Jeppesen adopts \"International Boundaries and National Limits\" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.", "NATION": "JP"}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:442:area"} +{"feature_id": 356833, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 1161, "object_class_id": 155, "object_class": "TESARE", "geometry_type": "AREA", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.30000548760523, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 142.22018551373947, "bbox_max_lat": 41.33307476146743, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Jeppesen adopts \"International Boundaries and National Limits\" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.", "NATION": "JP"}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:1161:area"} +{"feature_id": 328188, "cell_id": 12, "source_relative_path": "03900420\\B\\03900420.B", "source_record_index": 365, "object_class_id": 155, "object_class": "TESARE", "geometry_type": "AREA", "scale_code": "B", "native_scale": 1000000, "raw_geotype": 132, "coverage_id": 1184, "bbox_min_lon": 139.9999979009354, "bbox_min_lat": 40.29440769058278, "bbox_max_lon": 141.7972054708302, "bbox_max_lat": 41.606003535658594, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"INFORM": "Jeppesen adopts \"International Boundaries and National Limits\" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.", "NATION": "JP"}, "suggested_source_id": "cm95:1:03900420/B/03900420.B:365:area"} +{"feature_id": 606442, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1942, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.49212671966947, "bbox_min_lat": 40.53255540232935, "bbox_max_lon": 141.49212671966947, "bbox_max_lat": 40.53255540232935, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1942:point"} +{"feature_id": 606443, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1943, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.50403384120006, "bbox_min_lat": 40.52984563442224, "bbox_max_lon": 141.50403384120006, "bbox_max_lat": 40.52984563442224, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1943:point"} +{"feature_id": 606444, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1944, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.49338304560627, "bbox_min_lat": 40.5522373310738, "bbox_max_lon": 141.49338304560627, "bbox_max_lat": 40.5522373310738, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1944:point"} +{"feature_id": 606445, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1945, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.50641424823823, "bbox_min_lat": 40.53310446014887, "bbox_max_lon": 141.50641424823823, "bbox_max_lat": 40.53310446014887, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1945:point"} +{"feature_id": 606446, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1946, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.50633795314087, "bbox_min_lat": 40.52989139126262, "bbox_max_lon": 141.50633795314087, "bbox_max_lat": 40.52989139126262, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1946:point"} +{"feature_id": 606447, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1947, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.49321011005222, "bbox_min_lat": 40.552471120879524, "bbox_max_lon": 141.49321011005222, "bbox_max_lat": 40.552471120879524, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1947:point"} +{"feature_id": 606448, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1948, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.50628200340276, "bbox_min_lat": 40.529459242079696, "bbox_max_lon": 141.50628200340276, "bbox_max_lat": 40.529459242079696, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1948:point"} +{"feature_id": 606449, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1949, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.5448873226754, "bbox_min_lat": 40.529042342579885, "bbox_max_lon": 141.5448873226754, "bbox_max_lat": 40.529042342579885, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1949:point"} +{"feature_id": 606450, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1950, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.50394737342305, "bbox_min_lat": 40.52946941032777, "bbox_max_lon": 141.50394737342305, "bbox_max_lat": 40.52946941032777, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1950:point"} +{"feature_id": 606451, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1951, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 1, "coverage_id": 2200, "bbox_min_lon": 141.50741117084394, "bbox_min_lat": 40.532951944539185, "bbox_max_lon": 141.50741117084394, "bbox_max_lat": 40.532951944539185, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1951:point"} +{"feature_id": 513722, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 792, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.49175885206074, "bbox_min_lat": 40.53238859495904, "bbox_max_lon": 141.49175885206074, "bbox_max_lat": 40.53238859495904, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:792:point"} +{"feature_id": 513723, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 793, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "POINT", "scale_code": "E", "native_scale": 50000, "raw_geotype": 1, "coverage_id": 1759, "bbox_min_lon": 141.51709391497675, "bbox_min_lat": 40.534935581368444, "bbox_max_lon": 141.51709391497675, "bbox_max_lat": 40.534935581368444, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:793:point"} +{"feature_id": 513195, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 265, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.5195607902055, "bbox_min_lat": 40.53207847622974, "bbox_max_lon": 141.52256173120537, "bbox_max_lat": 40.53418318827337, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:265:area"} +{"feature_id": 513196, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 266, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.5129638063464, "bbox_min_lat": 40.53195137797524, "bbox_max_lon": 141.51426082321922, "bbox_max_lat": 40.533359613173054, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:266:area"} +{"feature_id": 513197, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 267, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.51565448056496, "bbox_min_lat": 40.53507792505766, "bbox_max_lon": 141.51788229778182, "bbox_max_lat": 40.53626749977913, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:267:area"} +{"feature_id": 513199, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 269, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.5174296134615, "bbox_min_lat": 40.53449329726174, "bbox_max_lon": 141.51903689711568, "bbox_max_lat": 40.53570321696747, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:269:area"} +{"feature_id": 513201, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 271, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.5164937267768, "bbox_min_lat": 40.531015927405434, "bbox_max_lon": 141.51713969204286, "bbox_max_lat": 40.53275463489108, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:271:area"} +{"feature_id": 513202, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 272, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.55022125181117, "bbox_min_lat": 40.53134638697893, "bbox_max_lon": 141.5511062750891, "bbox_max_lat": 40.53286648002703, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:272:area"} +{"feature_id": 513205, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 275, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.51548663132257, "bbox_min_lat": 40.53575405345159, "bbox_max_lon": 141.5169972745039, "bbox_max_lat": 40.53680127644309, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:275:area"} +{"feature_id": 513206, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 276, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.553507027889, "bbox_min_lat": 40.529699156921296, "bbox_max_lon": 141.5544683462771, "bbox_max_lat": 40.530395675806176, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:276:area"} +{"feature_id": 513208, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 278, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.54991098502978, "bbox_min_lat": 40.52829084479693, "bbox_max_lon": 141.55055695029588, "bbox_max_lat": 40.52878401161566, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:278:area"} +{"feature_id": 513209, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 279, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.5169464110971, "bbox_min_lat": 40.530629541837506, "bbox_max_lon": 141.51764323976997, "bbox_max_lat": 40.5309600033164, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:279:area"} +{"feature_id": 513211, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 281, "object_class_id": 153, "object_class": "TNKCON", "geometry_type": "AREA", "scale_code": "E", "native_scale": 50000, "raw_geotype": 4, "coverage_id": 1759, "bbox_min_lon": 141.4954057583267, "bbox_min_lat": 40.52982625944759, "bbox_max_lon": 141.49569567974532, "bbox_max_lat": 40.53028382654616, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:281:area"} +{"feature_id": 606452, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1952, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.54813240748382, "bbox_min_lat": 40.53939288485493, "bbox_max_lon": 141.54813240748382, "bbox_max_lat": 40.53939288485493, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 1, "COLOUR": [1], "CONVIS": 1, "NATCON": [2], "SORIND": "GB,UKHO,graph,LL M-6622", "VERLEN": 8, "_cm93_relation20_raw": 2243}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1952:point"} +{"feature_id": 606453, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1953, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.56767921143177, "bbox_min_lat": 40.54238692330532, "bbox_max_lon": 141.56767921143177, "bbox_max_lat": 40.54238692330532, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 1, "COLOUR": [1], "CONVIS": 1, "NATCON": [2], "SORIND": "GB,UKHO,graph,LL M-6621", "VERLEN": 9, "_cm93_relation20_raw": 2240}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1953:point"} +{"feature_id": 606454, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1954, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.51452696025927, "bbox_min_lat": 40.55241521469589, "bbox_max_lon": 141.51452696025927, "bbox_max_lat": 40.55241521469589, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 1, "COLOUR": [1], "CONVIS": 1, "NATCON": [2], "SORIND": "GB,UKHO,graph,LL M-6625.5", "VERLEN": 10, "_cm93_relation20_raw": 2239}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1954:point"} +{"feature_id": 606455, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1955, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.5759546863272, "bbox_min_lat": 40.53986563666468, "bbox_max_lon": 141.5759546863272, "bbox_max_lat": 40.53986563666468, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 1, "COLOUR": [1], "CONVIS": 1, "NATCON": [2], "SORIND": "GB,UKHO,graph,LL M-6620", "VERLEN": 23, "_cm93_relation20_raw": 2241}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1955:point"} +{"feature_id": 606456, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1956, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.5350198234147, "bbox_min_lat": 40.56587201094555, "bbox_max_lon": 141.5350198234147, "bbox_max_lat": 40.56587201094555, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 1, "COLOUR": [1], "CONVIS": 1, "SORIND": "GB,UKHO,graph,LL M-6624.86", "VERLEN": 5, "_cm93_relation20_raw": 2242}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1956:point"} +{"feature_id": 606457, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1957, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 161, "coverage_id": 2200, "bbox_min_lon": 141.55521767886023, "bbox_min_lat": 40.536297040550764, "bbox_max_lon": 141.55521767886023, "bbox_max_lat": 40.536297040550764, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 1, "COLOUR": [1], "CONVIS": 1, "SORIND": "GB,UKHO,graph,LL M-6624.4", "VERLEN": 9, "_cm93_relation20_raw": 2244}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1957:point"} +{"feature_id": 606458, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1958, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.48809833852798, "bbox_min_lat": 40.556491161360874, "bbox_max_lon": 141.48809833852798, "bbox_max_lat": 40.556491161360874, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 3, "CONVIS": 2, "INFORM": "Radio", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1958:point"} +{"feature_id": 606459, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1959, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.487254006117, "bbox_min_lat": 40.55602869111419, "bbox_max_lon": 141.487254006117, "bbox_max_lat": 40.55602869111419, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 3, "CONVIS": 2, "INFORM": "Radio", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1959:point"} +{"feature_id": 606460, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1960, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.487370991933, "bbox_min_lat": 40.55682149529551, "bbox_max_lon": 141.487370991933, "bbox_max_lat": 40.55682149529551, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 3, "CONVIS": 2, "INFORM": "Radio", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1960:point"} +{"feature_id": 606461, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1961, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.48819497898467, "bbox_min_lat": 40.55577458522323, "bbox_max_lon": 141.48819497898467, "bbox_max_lat": 40.55577458522323, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 3, "CONVIS": 2, "INFORM": "Radio", "QUAPOS": 4}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1961:point"} +{"feature_id": 606462, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1962, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5214392960816, "bbox_min_lat": 40.52781196552014, "bbox_max_lon": 141.5214392960816, "bbox_max_lat": 40.52781196552014, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CONVIS": 1, "HEIGHT": 51}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1962:point"} +{"feature_id": 606463, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1963, "object_class_id": 158, "object_class": "TOWERS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.553798590049, "bbox_min_lat": 40.526698505652824, "bbox_max_lon": 141.553798590049, "bbox_max_lat": 40.526698505652824, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATTOW": 3, "HEIGHT": 53}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1963:point"} +{"feature_id": 606549, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2049, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.57399644549454, "bbox_min_lat": 40.54368819540977, "bbox_max_lon": 141.57399644549454, "bbox_max_lat": 40.54368819540977, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 0.3, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2049:point"} +{"feature_id": 606550, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2050, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5783045753264, "bbox_min_lat": 40.54233100870312, "bbox_max_lon": 141.5783045753264, "bbox_max_lat": 40.54233100870312, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 0.5, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2050:point"} +{"feature_id": 606551, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2051, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.59056265430493, "bbox_min_lat": 40.52279870812551, "bbox_max_lon": 141.59056265430493, "bbox_max_lat": 40.52279870812551, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 0.7, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2051:point"} +{"feature_id": 606552, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2052, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5803899746547, "bbox_min_lat": 40.541166957748345, "bbox_max_lon": 141.5803899746547, "bbox_max_lat": 40.541166957748345, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 0.7, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2052:point"} +{"feature_id": 606553, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2053, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.57795361787848, "bbox_min_lat": 40.54323580289634, "bbox_max_lon": 141.57795361787848, "bbox_max_lat": 40.54323580289634, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 0.8, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2053:point"} +{"feature_id": 606554, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2054, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.57343186177394, "bbox_min_lat": 40.54388643386297, "bbox_max_lon": 141.57343186177394, "bbox_max_lat": 40.54388643386297, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 1.4, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2054:point"} +{"feature_id": 606555, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2055, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55662150865197, "bbox_min_lat": 40.53705957705704, "bbox_max_lon": 141.55662150865197, "bbox_max_lat": 40.53705957705704, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 1.6, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2055:point"} +{"feature_id": 606556, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2056, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.56846250776482, "bbox_min_lat": 40.547566446295754, "bbox_max_lon": 141.56846250776482, "bbox_max_lat": 40.547566446295754, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 1.7, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2056:point"} +{"feature_id": 606557, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2057, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.58233295646792, "bbox_min_lat": 40.53549382604538, "bbox_max_lon": 141.58233295646792, "bbox_max_lat": 40.53549382604538, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 2, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2057:point"} +{"feature_id": 606558, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2058, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.58351807364716, "bbox_min_lat": 40.538264367047745, "bbox_max_lon": 141.58351807364716, "bbox_max_lat": 40.538264367047745, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 2, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2058:point"} +{"feature_id": 606559, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2059, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.58104102615232, "bbox_min_lat": 40.53694773891256, "bbox_max_lon": 141.58104102615232, "bbox_max_lat": 40.53694773891256, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 2, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2059:point"} +{"feature_id": 606560, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2060, "object_class_id": 168, "object_class": "UWTROC", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.58472353618572, "bbox_min_lat": 40.53782210488448, "bbox_max_lon": 141.58472353618572, "bbox_max_lat": 40.53782210488448, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"VALSOU": 2, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2060:point"} +{"feature_id": 605650, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1150, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.58328918835502, "bbox_min_lat": 40.54721065281842, "bbox_max_lon": 141.58328918835502, "bbox_max_lat": 40.54721065281842, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 2, "VALSOU": 23.5, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1150:point"} +{"feature_id": 605651, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1151, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.54923105688604, "bbox_min_lat": 40.530267612988084, "bbox_max_lon": 141.54923105688604, "bbox_max_lat": 40.530267612988084, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 3, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1151:point"} +{"feature_id": 605652, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1152, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52744117707525, "bbox_min_lat": 40.53349083147308, "bbox_max_lon": 141.52744117707525, "bbox_max_lat": 40.53349083147308, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 3, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1152:point"} +{"feature_id": 605653, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1153, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52830585484554, "bbox_min_lat": 40.53366876488627, "bbox_max_lon": 141.52830585484554, "bbox_max_lat": 40.53366876488627, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 3.2, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1153:point"} +{"feature_id": 605654, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1154, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5516267229437, "bbox_min_lat": 40.53403479785053, "bbox_max_lon": 141.5516267229437, "bbox_max_lat": 40.53403479785053, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 3.3, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1154:point"} +{"feature_id": 605655, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1155, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.54553837417302, "bbox_min_lat": 40.52969311139527, "bbox_max_lon": 141.54553837417302, "bbox_max_lat": 40.52969311139527, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 3.7, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1155:point"} +{"feature_id": 605656, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1156, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.4865012278229, "bbox_min_lat": 40.55870182664797, "bbox_max_lon": 141.4865012278229, "bbox_max_lat": 40.55870182664797, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 3.7, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1156:point"} +{"feature_id": 605657, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1157, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5523184651599, "bbox_min_lat": 40.53377044091027, "bbox_max_lon": 141.5523184651599, "bbox_max_lat": 40.53377044091027, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 4.2, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1157:point"} +{"feature_id": 605658, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1158, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5341500593046, "bbox_min_lat": 40.5340093789593, "bbox_max_lon": 141.5341500593046, "bbox_max_lat": 40.5340093789593, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 4.3, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1158:point"} +{"feature_id": 605659, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1159, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.53132205436182, "bbox_min_lat": 40.532311375187646, "bbox_max_lon": 141.53132205436182, "bbox_max_lat": 40.532311375187646, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 4.3, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1159:point"} +{"feature_id": 605660, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1160, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52803119249498, "bbox_min_lat": 40.533180717823534, "bbox_max_lon": 141.52803119249498, "bbox_max_lat": 40.533180717823534, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 4.7, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1160:point"} +{"feature_id": 605661, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1161, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5324969988614, "bbox_min_lat": 40.5331705501386, "bbox_max_lon": 141.5324969988614, "bbox_max_lat": 40.5331705501386, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 3, "VALSOU": 4.9, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1161:point"} +{"feature_id": 604833, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 333, "object_class_id": 176, "object_class": "WRECKS", "geometry_type": "AREA", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.5422932893646, "bbox_min_lat": 40.53198092035005, "bbox_max_lon": 141.5425526926957, "bbox_max_lat": 40.53225545217583, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CATWRK": 2, "VALSOU": 7, "WATLEV": 3}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:333:area"} +{"feature_id": 605584, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1084, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.58070532772385, "bbox_min_lat": 40.5343093212615, "bbox_max_lon": 141.58281107241146, "bbox_max_lat": 40.538737126821324, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1084:line"} +{"feature_id": 605585, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1085, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.58311116646112, "bbox_min_lat": 40.53356708870802, "bbox_max_lon": 141.58351807364716, "bbox_max_lat": 40.53412122200863, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1085:line"} +{"feature_id": 605586, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1086, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.5604210045013, "bbox_min_lat": 40.538915046302165, "bbox_max_lon": 141.5646528392358, "bbox_max_lat": 40.54126862239338, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1086:line"} +{"feature_id": 605587, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1087, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.5817632864075, "bbox_min_lat": 40.53728325278595, "bbox_max_lon": 141.58183958150488, "bbox_max_lat": 40.53735950570467, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1087:line"} +{"feature_id": 605588, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1088, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.5819667400005, "bbox_min_lat": 40.53936746799647, "bbox_max_lon": 141.58213967555454, "bbox_max_lat": 40.539413218334765, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1088:line"} +{"feature_id": 605589, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1089, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.58143267431888, "bbox_min_lat": 40.53975380320449, "bbox_max_lon": 141.58175311372784, "bbox_max_lat": 40.539809719957944, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1089:line"} +{"feature_id": 605590, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1090, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.57656504710624, "bbox_min_lat": 40.543434042688425, "bbox_max_lon": 141.57663625586378, "bbox_max_lat": 40.54348995636987, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1090:line"} +{"feature_id": 605591, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1091, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.56779619724773, "bbox_min_lat": 40.542839321551995, "bbox_max_lon": 141.5713159444067, "bbox_max_lat": 40.544074505699285, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1091:line"} +{"feature_id": 605592, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1092, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.590211696857, "bbox_min_lat": 40.52260040727397, "bbox_max_lon": 141.59034394169245, "bbox_max_lat": 40.52266650762302, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1092:line"} +{"feature_id": 605593, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1093, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.5803035068777, "bbox_min_lat": 40.54241742215959, "bbox_max_lon": 141.58037471563523, "bbox_max_lat": 40.54247333668963, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1093:line"} +{"feature_id": 605594, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1094, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.5674503261396, "bbox_min_lat": 40.544130418846095, "bbox_max_lon": 141.56753679391664, "bbox_max_lat": 40.5441964979594, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1094:line"} +{"feature_id": 605595, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1095, "object_class_id": 177, "object_class": "ZEMCNT", "geometry_type": "LINE", "scale_code": "F", "native_scale": 20000, "raw_geotype": 2, "coverage_id": 2200, "bbox_min_lon": 141.51177525041393, "bbox_min_lat": 40.542981648458436, "bbox_max_lon": 141.51403358529626, "bbox_max_lat": 40.54647364603113, "geometry_repaired": 0, "geometry_issue": null, "attributes": {}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1095:line"} +{"feature_id": 606716, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2216, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.51800601669967, "bbox_min_lat": 40.54032821853955, "bbox_max_lon": 141.51800601669967, "bbox_max_lat": 40.54032821853955, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2262}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2216:point"} +{"feature_id": 606717, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2217, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.56030401868534, "bbox_min_lat": 40.544648883984316, "bbox_max_lon": 141.56030401868534, "bbox_max_lat": 40.544648883984316, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2264}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2217:point"} +{"feature_id": 606718, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2218, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.47915655311542, "bbox_min_lat": 40.58768781797142, "bbox_max_lon": 141.47915655311542, "bbox_max_lat": 40.58768781797142, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2252}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2218:point"} +{"feature_id": 606719, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2219, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.5254269865045, "bbox_min_lat": 40.53363317824145, "bbox_max_lon": 141.5254269865045, "bbox_max_lat": 40.53363317824145, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2270}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2219:point"} +{"feature_id": 606720, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2220, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.5075434156794, "bbox_min_lat": 40.549081088805, "bbox_max_lon": 141.5075434156794, "bbox_max_lat": 40.549081088805, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2260}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2220:point"} +{"feature_id": 606721, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2221, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.53280217925092, "bbox_min_lat": 40.535966605369474, "bbox_max_lon": 141.53280217925092, "bbox_max_lat": 40.535966605369474, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2275}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2221:point"} +{"feature_id": 606722, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2222, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.50160257076368, "bbox_min_lat": 40.552715074589145, "bbox_max_lon": 141.50160257076368, "bbox_max_lat": 40.552715074589145, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2269}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2222:point"} +{"feature_id": 606723, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2223, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.52411979716945, "bbox_min_lat": 40.545101266953736, "bbox_max_lon": 141.52411979716945, "bbox_max_lat": 40.545101266953736, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2274}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2223:point"} +{"feature_id": 606724, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2224, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.4824321559628, "bbox_min_lat": 40.58365441116841, "bbox_max_lon": 141.4824321559628, "bbox_max_lat": 40.58365441116841, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2277}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2224:point"} +{"feature_id": 606725, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2225, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.5251777558531, "bbox_min_lat": 40.5334501609123, "bbox_max_lon": 141.5251777558531, "bbox_max_lat": 40.5334501609123, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2276}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2225:point"} +{"feature_id": 606726, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2226, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.52561518107802, "bbox_min_lat": 40.53350099910942, "bbox_max_lon": 141.52561518107802, "bbox_max_lat": 40.53350099910942, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2266}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2226:point"} +{"feature_id": 606727, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2227, "object_class_id": 201, "object_class": "_extgn", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 33, "coverage_id": 2200, "bbox_min_lon": 141.47109979083245, "bbox_min_lat": 40.546926016675656, "bbox_max_lon": 141.47109979083245, "bbox_max_lat": 40.546926016675656, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_cm93_relation20_raw": 2257}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2227:point"} +{"feature_id": 604501, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 1, "object_class_id": 217, "object_class": "_m_sor", "geometry_type": "META", "scale_code": "F", "native_scale": 20000, "raw_geotype": 132, "coverage_id": 2200, "bbox_min_lon": 141.45999631099423, "bbox_min_lat": 40.520830927549845, "bbox_max_lon": 141.59638651340472, "bbox_max_lat": 40.5930568498369, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CSCALE": 12000, "HORDAT": 2, "MARSYS": 2, "NMDATE": "20140328", "RECDAT": "20140505", "SORIND": "JP,JHOD,graph,W65", "VERDAT": 11, "_chcod": "31-0F700", "_dgdat": "20120313", "_hvdat": 3, "_quart": 4, "_sorhd": 2, "_wgsox": 0, "_wgsoy": 0}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:1:meta"} +{"feature_id": 512931, "cell_id": 351, "source_relative_path": "03900420\\E\\03910424.E", "source_record_index": 1, "object_class_id": 217, "object_class": "_m_sor", "geometry_type": "META", "scale_code": "E", "native_scale": 50000, "raw_geotype": 132, "coverage_id": 1759, "bbox_min_lon": 141.47966862026965, "bbox_min_lat": 40.52133528089739, "bbox_max_lon": 141.5780028445932, "bbox_max_lat": 40.572168478876776, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CSCALE": 20000, "HORDAT": 2, "MARSYS": 2, "NMDATE": "20060323", "RECDAT": "20060322", "SORIND": "GB,MDHS,graph,2959B", "VERDAT": 10, "_chcod": "31-0684B", "_dgdat": "20030320", "_hvdat": 21, "_quart": 4, "_sorhd": 2, "_wgsox": 0, "_wgsoy": 0}, "suggested_source_id": "cm95:1:03900420/E/03910424.E:1:meta"} +{"feature_id": 355675, "cell_id": 40, "source_relative_path": "03900420\\C\\03900420.C", "source_record_index": 3, "object_class_id": 217, "object_class": "_m_sor", "geometry_type": "META", "scale_code": "C", "native_scale": 200000, "raw_geotype": 132, "coverage_id": 1255, "bbox_min_lon": 141.30000548760523, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 143.08335783594634, "bbox_max_lat": 41.33307476146743, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CSCALE": 250000, "HORDAT": 2, "MARSYS": 2, "NMDATE": "20140523", "RECDAT": "20140602", "SORIND": "JP,JHOD,graph,W53", "VERDAT": 11, "_chcod": "31-0F710", "_dgdat": "20070914", "_hvdat": 3, "_quart": 4, "_sorhd": 2, "_wgsox": 0, "_wgsoy": 0}, "suggested_source_id": "cm95:1:03900420/C/03900420.C:3:meta"} +{"feature_id": 327828, "cell_id": 12, "source_relative_path": "03900420\\B\\03900420.B", "source_record_index": 5, "object_class_id": 217, "object_class": "_m_sor", "geometry_type": "META", "scale_code": "B", "native_scale": 1000000, "raw_geotype": 132, "coverage_id": 1184, "bbox_min_lon": 139.9999979009354, "bbox_min_lat": 39.99999935237068, "bbox_max_lon": 141.8321486304079, "bbox_max_lat": 45.254135718959375, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CSCALE": 1200000, "HORDAT": 2, "MARSYS": 2, "NMDATE": "20140926", "RECDAT": "20141006", "SORIND": "JP,JHOD,graph,W1154", "VERDAT": 11, "_chcod": "31-0F270", "_dgdat": "20081003", "_hvdat": 3, "_quart": 4, "_sorhd": 2, "_wgsox": 0, "_wgsoy": 0}, "suggested_source_id": "cm95:1:03900420/B/03900420.B:5:meta"} +{"feature_id": 322991, "cell_id": 4, "source_relative_path": "03900420\\A\\03900420.A", "source_record_index": 1, "object_class_id": 217, "object_class": "_m_sor", "geometry_type": "META", "scale_code": "A", "native_scale": 3000000, "raw_geotype": 132, "coverage_id": 1160, "bbox_min_lon": 140.00000125369664, "bbox_min_lat": 40.00000035819904, "bbox_max_lon": 160.00000143279615, "bbox_max_lat": 60.00000053729857, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CSCALE": 3000000, "HORDAT": 2, "MARSYS": 1, "NMDATE": "20021101", "RECDAT": "20080102", "SORIND": "IT,CMAP,graph,W-135", "_chcod": "90-01520", "_dgdat": "20000101", "_quart": 4, "_sorhd": 2, "_wgsox": 0, "_wgsoy": 0}, "suggested_source_id": "cm95:1:03900420/A/03900420.A:1:meta"} +{"feature_id": 644517, "cell_id": 784, "source_relative_path": "03900360\\Z\\03900360.Z", "source_record_index": 1, "object_class_id": 217, "object_class": "_m_sor", "geometry_type": "META", "scale_code": "Z", "native_scale": 20000000, "raw_geotype": 132, "coverage_id": 2311, "bbox_min_lon": 120.00000107459711, "bbox_min_lat": 40.00000035819904, "bbox_max_lon": 160.00000143279615, "bbox_max_lat": 80.00000071639808, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"CSCALE": 20000000, "HORDAT": 2, "MARSYS": 1, "NMDATE": "20021101", "RECDAT": "20080102", "SORIND": "IT,CMAP,graph,W-14", "_chcod": "90-00310", "_dgdat": "20000101", "_quart": 4, "_sorhd": 2, "_wgsox": 0, "_wgsoy": 0}, "suggested_source_id": "cm95:1:03900360/Z/03900360.Z:1:meta"} +{"feature_id": 606649, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2149, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5033268399644, "bbox_min_lat": 40.52367325872837, "bbox_max_lon": 141.5033268399644, "bbox_max_lat": 40.52367325872837, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Aomori", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2149:point"} +{"feature_id": 606650, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2150, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.54125058970044, "bbox_min_lat": 40.526820529554534, "bbox_max_lon": 141.54125058970044, "bbox_max_lat": 40.526820529554534, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Area 1 Chikkogai", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2150:point"} +{"feature_id": 606651, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2151, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.54794421291032, "bbox_min_lat": 40.52869661907635, "bbox_max_lon": 141.54794421291032, "bbox_max_lat": 40.52869661907635, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Area 2 Chikkogai", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2151:point"} +{"feature_id": 606652, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2152, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.5038354739469, "bbox_min_lat": 40.5271713470344, "bbox_max_lon": 141.5038354739469, "bbox_max_lat": 40.5271713470344, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Area 3 Koyo", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2152:point"} +{"feature_id": 606653, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2153, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.51512206201883, "bbox_min_lat": 40.52610363595054, "bbox_max_lon": 141.51512206201883, "bbox_max_lat": 40.52610363595054, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Area 4 Koyo", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2153:point"} +{"feature_id": 606654, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2154, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.54897165355496, "bbox_min_lat": 40.52447661492469, "bbox_max_lon": 141.54897165355496, "bbox_max_lat": 40.52447661492469, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Area 5 Shirogane", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2154:point"} +{"feature_id": 606655, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2155, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55846276366864, "bbox_min_lat": 40.53757809692398, "bbox_max_lon": 141.55846276366864, "bbox_max_lat": 40.53757809692398, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Kabu Island Marine Park", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2155:point"} +{"feature_id": 606656, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2156, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.55759299955852, "bbox_min_lat": 40.5390929653105, "bbox_max_lon": 141.55759299955852, "bbox_max_lat": 40.5390929653105, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Kabu Shima", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2156:point"} +{"feature_id": 606657, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2157, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.52664262172271, "bbox_min_lat": 40.53770010101532, "bbox_max_lon": 141.52664262172271, "bbox_max_lat": 40.53770010101532, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Kawaragi No 1 Wharf [Port Island]", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2157:point"} +{"feature_id": 606658, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2158, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.46334312259916, "bbox_min_lat": 40.5742963770966, "bbox_max_lon": 141.46334312259916, "bbox_max_lat": 40.5742963770966, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Kikyono Industrial Park", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2158:point"} +{"feature_id": 606659, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2159, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.56571079791942, "bbox_min_lat": 40.54243775472137, "bbox_max_lon": 141.56571079791942, "bbox_max_lat": 40.54243775472137, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "O Saki", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2159:point"} +{"feature_id": 606660, "cell_id": 693, "source_relative_path": "03900420\\F\\03910424.F", "source_record_index": 2160, "object_class_id": 198, "object_class": "_texto", "geometry_type": "POINT", "scale_code": "F", "native_scale": 20000, "raw_geotype": 129, "coverage_id": 2200, "bbox_min_lon": 141.51662761860706, "bbox_min_lat": 40.5377102680129, "bbox_max_lon": 141.51662761860706, "bbox_max_lat": 40.5377102680129, "geometry_repaired": 0, "geometry_issue": null, "attributes": {"_texta": {"text": "Pier for Tohoku Port", "prefix": [0, 12, 0]}}, "suggested_source_id": "cm95:1:03900420/F/03910424.F:2160:point"} diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_关联对象样本_v1.jsonl b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_关联对象样本_v1.jsonl new file mode 100644 index 0000000..e69de29 diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_对象映射准备表_v1.csv b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_对象映射准备表_v1.csv new file mode 100644 index 0000000..1462dda --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI_对象映射准备表_v1.csv @@ -0,0 +1,81 @@ +cm95_object_class_id,cm95_object_class,cm95_description,geometry_type,aoi_feature_count,aoi_cell_count,min_native_scale,max_native_scale,available_attributes,target_source_layer,canonical_family,canonical_object_type,chart_render_type,safety_class,mapping_status,notes +176,WRECKS,Wreck,POINT,480,3,20000,200000,"[""CATWRK"", ""VALSOU"", ""WATLEV""]",,,,,,UNMAPPED, +45,DEPCNT,Depth contour,LINE,451,6,20000,20000000,"[""QUAPOS"", ""VALDCO""]",,,,,,UNMAPPED, +44,DEPARE,Depth area,AREA,414,6,20000,20000000,"[""DRVAL1"", ""DRVAL2""]",,,,,,UNMAPPED, +138,SBDARE,Seabed area,POINT,287,3,20000,200000,"[""NATQUA"", ""NATSUR""]",,,,,,UNMAPPED, +139,SLCONS,Shoreline construction,LINE,209,4,20000,1000000,"[""CATSLC"", ""CONDTN"", ""INFORM"", ""OBJNAM"", ""WATLEV""]",,,,,,UNMAPPED, +168,UWTROC,Underwater rock,POINT,176,4,20000,1000000,"[""EXPSOU"", ""VALSOU"", ""WATLEV""]",,,,,,UNMAPPED, +35,COALNE,Coastline,LINE,171,6,20000,20000000,"[""CATCOA""]",,,,,,UNMAPPED, +81,LNDARE,Land area,AREA,159,6,20000,20000000,"[""OBJNAM""]",,,,,,UNMAPPED, +139,SLCONS,Shoreline construction,AREA,119,2,20000,50000,"[""CATSLC"", ""CONDTN"", ""INFORM"", ""NATCON"", ""OBJNAM"", ""WATLEV""]",,,,,,UNMAPPED, +198,_texto,Text,POINT,113,5,20000,3000000,"[""_texta""]",,,,,,UNMAPPED, +86,LIGHTS,Light,POINT,96,4,20000,1000000,"[""CATLIT"", ""COLOUR"", ""HEIGHT"", ""INFORM"", ""LITCHR"", ""OBJNAM"", ""QUAVEM"", ""SECTR1"", ""SECTR2"", ""SIGGRP"", ""SIGPER"", ""SORIND"", ""STATUS"", ""VALNMR""]",,,,,,UNMAPPED, +10,BRTFAC,Berthing facility,POINT,89,2,20000,50000,"[""OBJNAM""]",,,,,,UNMAPPED, +177,ZEMCNT,Zero meter contour,LINE,84,3,20000,200000,[],,,,,,UNMAPPED, +99,OBSTRN,Obstruction,AREA,70,4,20000,1000000,"[""INFORM"", ""VALSOU"", ""WATLEV""]",,,,,,UNMAPPED, +78,ITDARE,Intertidal area,AREA,69,3,20000,200000,"[""NATSUR""]",,,,,,UNMAPPED, +158,TOWERS,Tower,POINT,54,4,20000,1000000,"[""CATTOW"", ""COLOUR"", ""CONVIS"", ""HEIGHT"", ""INFORM"", ""NATCON"", ""QUAPOS"", ""SORIND"", ""VERLEN""]",,,,,,UNMAPPED, +153,TNKCON,Tank,POINT,46,2,20000,50000,[],,,,,,UNMAPPED, +201,_extgn,"Extended navigational aid, generic",POINT,42,2,20000,50000,"[""COLMAR"", ""INFORM""]",,,,,,UNMAPPED, +14,BUAARE,Built-up area,POINT,35,3,20000,1000000,"[""OBJNAM""]",,,,,,UNMAPPED, +33,CHIMNY,Chimney,POINT,35,3,20000,200000,"[""COLOUR"", ""CONVIS"", ""HEIGHT"", ""INFORM""]",,,,,,UNMAPPED, +13,BUISGL,"Building, single",AREA,20,1,20000,20000,"[""CATBUI"", ""INFORM"", ""OBJNAM""]",,,,,,UNMAPPED, +103,PILPNT,Pile,POINT,20,3,20000,200000,"[""INFORM""]",,,,,,UNMAPPED, +60,FSHHAV,Fish haven,POINT,18,3,20000,200000,"[""INFORM""]",,,,,,UNMAPPED, +11,BRIDGE,Bridge,AREA,17,3,20000,200000,"[""CATBRG"", ""INFORM"", ""OBJNAM"", ""VERCLR""]",,,,,,UNMAPPED, +29,CTNARE,Caution area,AREA,16,4,20000,1000000,"[""INFORM""]",,,,,,UNMAPPED, +193,$LINES,Cartographic line,LINE,15,2,20000,50000,"[""$SCODE""]",,,,,,UNMAPPED, +7,BCNLAT,"Beacon, lateral",POINT,15,3,20000,200000,"[""BCNSHP"", ""CATLAM"", ""COLMAR"", ""INFORM"", ""SORIND"", ""VERLEN""]",,,,,,UNMAPPED, +39,CRANES,Crane,POINT,15,2,20000,50000,"[""CATCRN""]",,,,,,UNMAPPED, +111,PRDINS,Production installation,AREA,15,1,20000,20000,"[""INFORM"", ""OBJNAM"", ""PRODCT""]",,,,,,UNMAPPED, +50,DRGARE,Dredged area,AREA,14,1,50000,50000,"[""DRVAL1"", ""INFORM""]",,,,,,UNMAPPED, +29,CTNARE,Caution area,POINT,13,2,20000,50000,"[""INFORM""]",,,,,,UNMAPPED, +9,BCNSPP,"Beacon, special purpose",POINT,12,4,20000,1000000,"[""CATSPM"", ""COLMAR"", ""INFORM"", ""SORIND"", ""VERLEN""]",,,,,,UNMAPPED, +13,BUISGL,"Building, single",POINT,12,3,20000,200000,"[""BUISHP"", ""CATBUI"", ""CONVIS"", ""INFORM"", ""OBJNAM"", ""QUAPOS""]",,,,,,UNMAPPED, +22,CBLSUB,"Cable, submarine",LINE,12,3,20000,200000,"[""CATCBL"", ""STATUS""]",,,,,,UNMAPPED, +111,PRDINS,Production installation,POINT,12,1,20000,20000,"[""INFORM"", ""OBJNAM"", ""PRODCT"", ""QUAPOS""]",,,,,,UNMAPPED, +194,$AREAS,Cartographic area,AREA,11,3,20000,200000,"[""$SCODE""]",,,,,,UNMAPPED, +153,TNKCON,Tank,AREA,11,1,50000,50000,[],,,,,,UNMAPPED, +138,SBDARE,Seabed area,AREA,9,3,20000,200000,"[""NATSUR""]",,,,,,UNMAPPED, +20,BOYSPP,"Buoy, special purpose",POINT,8,2,20000,50000,"[""BOYSHP"", ""CATSPM"", ""COLMAR"", ""INFORM"", ""STATUS""]",,,,,,UNMAPPED, +96,MORFAC,Mooring/Warping facility,POINT,7,1,50000,50000,"[""CATMOR"", ""INFORM""]",,,,,,UNMAPPED, +210,M_PROD,Production information,AREA,7,7,20000,20000000,"[""CPDATE""]",,,,,,UNMAPPED, +130,RIVBNK,River bank,LINE,7,2,20000,200000,[],,,,,,UNMAPPED, +38,CTRPNT,Control point,POINT,6,2,20000,50000,"[""CATCTR"", ""OBJNAM""]",,,,,,UNMAPPED, +99,OBSTRN,Obstruction,POINT,6,3,20000,200000,"[""EXPSOU"", ""INFORM"", ""VALSOU"", ""WATLEV""]",,,,,,UNMAPPED, +217,_m_sor,Source of data,META,6,6,20000,20000000,"[""CSCALE"", ""HORDAT"", ""MARSYS"", ""NMDATE"", ""RECDAT"", ""SORIND"", ""VERDAT"", ""_chcod"", ""_dgdat"", ""_hvdat"", ""_quart"", ""_sorhd"", ""_wgsox"", ""_wgsoy""]",,,,,,UNMAPPED, +191,$COMPS,Compass,POINT,5,2,20000,50000,"[""$ANNCH"", ""$CYEAR"", ""$VARIA""]",,,,,,UNMAPPED, +12,BUIREL,"Building, religious",POINT,5,2,20000,50000,"[""CATREB""]",,,,,,UNMAPPED, +21,CBLOHD,"Cable, overhead",LINE,5,2,20000,50000,"[""CATCBL"", ""QUAVEM"", ""VERCLR""]",,,,,,UNMAPPED, +57,FAIRWY,Fairway,AREA,5,2,20000,50000,"[""OBJNAM""]",,,,,,UNMAPPED, +129,RIVERS,River,AREA,5,2,20000,200000,"[""OBJNAM""]",,,,,,UNMAPPED, +142,SILBUI,Silo,POINT,5,2,20000,50000,"[""INFORM"", ""QUAPOS""]",,,,,,UNMAPPED, +154,TELPHC,Telepheric,LINE,5,2,20000,50000,[],,,,,,UNMAPPED, +11,BRIDGE,Bridge,LINE,4,2,20000,200000,[],,,,,,UNMAPPED, +72,HRBARE,Harbour area (administrative),AREA,4,2,20000,50000,"[""OBJNAM""]",,,,,,UNMAPPED, +95,MONUMT,Monument,POINT,4,2,20000,50000,"[""CONVIS""]",,,,,,UNMAPPED, +140,SISTAT,"Signal station, traffic",POINT,4,2,20000,50000,"[""CATSIT""]",,,,,,UNMAPPED, +147,SOUNDG,Spot soundings,SOUNDING,4,4,20000,1000000,[],,,,,,UNMAPPED, +1,AIRARE,Airport area,POINT,3,2,20000,200000,"[""OBJNAM""]",,,,,,UNMAPPED, +14,BUAARE,Built-up area,AREA,3,1,200000,200000,"[""OBJNAM""]",,,,,,UNMAPPED, +79,LAKARE,Lake,AREA,3,2,20000,200000,"[""OBJNAM""]",,,,,,UNMAPPED, +80,LAKSHR,Lake shore,LINE,3,2,20000,200000,[],,,,,,UNMAPPED, +97,NATARE,National territorial area,AREA,3,3,20000,1000000,"[""INFORM"", ""NATION""]",,,,,,UNMAPPED, +104,PILBOP,Pilot boarding place,POINT,3,2,20000,50000,[],,,,,,UNMAPPED, +143,SLIPWY,Slipway,AREA,3,2,20000,50000,"[""OBJNAM"", ""WATLEV""]",,,,,,UNMAPPED, +155,TESARE,Territorial sea area,AREA,3,3,20000,1000000,"[""INFORM"", ""NATION""]",,,,,,UNMAPPED, +4,ACHARE,Anchorage area,AREA,2,2,20000,50000,"[""CATACH""]",,,,,,UNMAPPED, +36,CONZNE,Contiguous zone,AREA,2,2,200000,1000000,"[""INFORM"", ""NATION"", ""SORIND""]",,,,,,UNMAPPED, +56,EXEZNE,Exclusive economic zone,AREA,2,2,200000,1000000,"[""INFORM"", ""NATION"", ""SORIND""]",,,,,,UNMAPPED, +96,MORFAC,Mooring/Warping facility,AREA,2,1,20000,20000,"[""CATMOR"", ""INFORM""]",,,,,,UNMAPPED, +106,PIPOHD,"Pipeline, overhead",LINE,2,1,20000,20000,[],,,,,,UNMAPPED, +107,PIPSOL,"Pipeline, submarine/on land",LINE,2,2,20000,50000,"[""CATPIP"", ""INFORM"", ""PRODCT""]",,,,,,UNMAPPED, +112,PYLONS,Pylon,POINT,2,1,50000,50000,"[""INFORM""]",,,,,,UNMAPPED, +136,SEAARE,Sea area,AREA,2,1,200000,200000,"[""OBJNAM""]",,,,,,UNMAPPED, +73,HRBFAC,Harbour facility,POINT,1,1,20000,20000,"[""OBJNAM""]",,,,,,UNMAPPED, +73,HRBFAC,Harbour facility,AREA,1,1,20000,20000,"[""CATHAF""]",,,,,,UNMAPPED, +127,RSCSTA,Rescue station,POINT,1,1,20000,20000,[],,,,,,UNMAPPED, +118,RTPBCN,Radar transponder beacon,POINT,1,1,50000,50000,"[""CATRTB"", ""SORIND""]",,,,,,UNMAPPED, +142,SILBUI,Silo,AREA,1,1,20000,20000,[],,,,,,UNMAPPED, +141,SISTAW,"Signal station, warning",POINT,1,1,20000,20000,"[""CATSIW""]",,,,,,UNMAPPED, +176,WRECKS,Wreck,AREA,1,1,20000,20000,"[""CATWRK"", ""VALSOU"", ""WATLEV""]",,,,,,UNMAPPED, diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI报告_v1.json b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI报告_v1.json new file mode 100644 index 0000000..31eed9c --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/AOI报告_v1.json @@ -0,0 +1,627 @@ +{ + "version": "v2.0", + "generated_at": "2026-09-03T08:30:30", + "database": "cm93_chart", + "dataset_id": 1, + "read_only": true, + "aoi": { + "tile": { + "z": 10, + "x": 914, + "y": 385 + }, + "bbox_wgs84": { + "min_lon": 141.328125, + "min_lat": 40.44694705960049, + "max_lon": 141.6796875, + "max_lat": 40.71395582628604 + }, + "known_navsea_samples_inside": [ + "z10/914/385", + "z11/1828-1829/770-771", + "z12/3656-3659/1540-1543" + ] + }, + "dataset": { + "id": 1, + "source_type": "CM93", + "name": "CM93JAPAN", + "source_root": "D:\\Ship\\CM93V2\\CM93JAPAN", + "parser_version": "0.2.0", + "normalized_srid": 4326 + }, + "warnings": [], + "counts": { + "aoi_cells": 7, + "aoi_spatial_features": 3605, + "object_class_geometry_groups": 80, + "attribute_group_count": 177, + "sample_feature_count": 600, + "related_sample_count": 0 + }, + "geometry_counts": [ + { + "geometry_type": "POINT", + "feature_count": 1632 + }, + { + "geometry_type": "LINE", + "feature_count": 970 + }, + { + "geometry_type": "AREA", + "feature_count": 993 + }, + { + "geometry_type": "SOUNDING", + "feature_count": 4 + }, + { + "geometry_type": "META", + "feature_count": 6 + } + ], + "object_classes": [ + { + "object_class_id": 176, + "object_class": "WRECKS", + "geometry_type": "POINT", + "feature_count": 480, + "description": "Wreck" + }, + { + "object_class_id": 45, + "object_class": "DEPCNT", + "geometry_type": "LINE", + "feature_count": 451, + "description": "Depth contour" + }, + { + "object_class_id": 44, + "object_class": "DEPARE", + "geometry_type": "AREA", + "feature_count": 414, + "description": "Depth area" + }, + { + "object_class_id": 138, + "object_class": "SBDARE", + "geometry_type": "POINT", + "feature_count": 287, + "description": "Seabed area" + }, + { + "object_class_id": 139, + "object_class": "SLCONS", + "geometry_type": "LINE", + "feature_count": 209, + "description": "Shoreline construction" + }, + { + "object_class_id": 168, + "object_class": "UWTROC", + "geometry_type": "POINT", + "feature_count": 176, + "description": "Underwater rock" + }, + { + "object_class_id": 35, + "object_class": "COALNE", + "geometry_type": "LINE", + "feature_count": 171, + "description": "Coastline" + }, + { + "object_class_id": 81, + "object_class": "LNDARE", + "geometry_type": "AREA", + "feature_count": 159, + "description": "Land area" + }, + { + "object_class_id": 139, + "object_class": "SLCONS", + "geometry_type": "AREA", + "feature_count": 119, + "description": "Shoreline construction" + }, + { + "object_class_id": 198, + "object_class": "_texto", + "geometry_type": "POINT", + "feature_count": 113, + "description": "Text" + }, + { + "object_class_id": 86, + "object_class": "LIGHTS", + "geometry_type": "POINT", + "feature_count": 96, + "description": "Light" + }, + { + "object_class_id": 10, + "object_class": "BRTFAC", + "geometry_type": "POINT", + "feature_count": 89, + "description": "Berthing facility" + }, + { + "object_class_id": 177, + "object_class": "ZEMCNT", + "geometry_type": "LINE", + "feature_count": 84, + "description": "Zero meter contour" + }, + { + "object_class_id": 99, + "object_class": "OBSTRN", + "geometry_type": "AREA", + "feature_count": 70, + "description": "Obstruction" + }, + { + "object_class_id": 78, + "object_class": "ITDARE", + "geometry_type": "AREA", + "feature_count": 69, + "description": "Intertidal area" + }, + { + "object_class_id": 158, + "object_class": "TOWERS", + "geometry_type": "POINT", + "feature_count": 54, + "description": "Tower" + }, + { + "object_class_id": 153, + "object_class": "TNKCON", + "geometry_type": "POINT", + "feature_count": 46, + "description": "Tank" + }, + { + "object_class_id": 201, + "object_class": "_extgn", + "geometry_type": "POINT", + "feature_count": 42, + "description": "Extended navigational aid, generic" + }, + { + "object_class_id": 14, + "object_class": "BUAARE", + "geometry_type": "POINT", + "feature_count": 35, + "description": "Built-up area" + }, + { + "object_class_id": 33, + "object_class": "CHIMNY", + "geometry_type": "POINT", + "feature_count": 35, + "description": "Chimney" + }, + { + "object_class_id": 13, + "object_class": "BUISGL", + "geometry_type": "AREA", + "feature_count": 20, + "description": "Building, single" + }, + { + "object_class_id": 103, + "object_class": "PILPNT", + "geometry_type": "POINT", + "feature_count": 20, + "description": "Pile" + }, + { + "object_class_id": 60, + "object_class": "FSHHAV", + "geometry_type": "POINT", + "feature_count": 18, + "description": "Fish haven" + }, + { + "object_class_id": 11, + "object_class": "BRIDGE", + "geometry_type": "AREA", + "feature_count": 17, + "description": "Bridge" + }, + { + "object_class_id": 29, + "object_class": "CTNARE", + "geometry_type": "AREA", + "feature_count": 16, + "description": "Caution area" + }, + { + "object_class_id": 193, + "object_class": "$LINES", + "geometry_type": "LINE", + "feature_count": 15, + "description": "Cartographic line" + }, + { + "object_class_id": 7, + "object_class": "BCNLAT", + "geometry_type": "POINT", + "feature_count": 15, + "description": "Beacon, lateral" + }, + { + "object_class_id": 39, + "object_class": "CRANES", + "geometry_type": "POINT", + "feature_count": 15, + "description": "Crane" + }, + { + "object_class_id": 111, + "object_class": "PRDINS", + "geometry_type": "AREA", + "feature_count": 15, + "description": "Production installation" + }, + { + "object_class_id": 50, + "object_class": "DRGARE", + "geometry_type": "AREA", + "feature_count": 14, + "description": "Dredged area" + }, + { + "object_class_id": 29, + "object_class": "CTNARE", + "geometry_type": "POINT", + "feature_count": 13, + "description": "Caution area" + }, + { + "object_class_id": 9, + "object_class": "BCNSPP", + "geometry_type": "POINT", + "feature_count": 12, + "description": "Beacon, special purpose" + }, + { + "object_class_id": 13, + "object_class": "BUISGL", + "geometry_type": "POINT", + "feature_count": 12, + "description": "Building, single" + }, + { + "object_class_id": 22, + "object_class": "CBLSUB", + "geometry_type": "LINE", + "feature_count": 12, + "description": "Cable, submarine" + }, + { + "object_class_id": 111, + "object_class": "PRDINS", + "geometry_type": "POINT", + "feature_count": 12, + "description": "Production installation" + }, + { + "object_class_id": 194, + "object_class": "$AREAS", + "geometry_type": "AREA", + "feature_count": 11, + "description": "Cartographic area" + }, + { + "object_class_id": 153, + "object_class": "TNKCON", + "geometry_type": "AREA", + "feature_count": 11, + "description": "Tank" + }, + { + "object_class_id": 138, + "object_class": "SBDARE", + "geometry_type": "AREA", + "feature_count": 9, + "description": "Seabed area" + }, + { + "object_class_id": 20, + "object_class": "BOYSPP", + "geometry_type": "POINT", + "feature_count": 8, + "description": "Buoy, special purpose" + }, + { + "object_class_id": 96, + "object_class": "MORFAC", + "geometry_type": "POINT", + "feature_count": 7, + "description": "Mooring/Warping facility" + }, + { + "object_class_id": 210, + "object_class": "M_PROD", + "geometry_type": "AREA", + "feature_count": 7, + "description": "Production information" + }, + { + "object_class_id": 130, + "object_class": "RIVBNK", + "geometry_type": "LINE", + "feature_count": 7, + "description": "River bank" + }, + { + "object_class_id": 38, + "object_class": "CTRPNT", + "geometry_type": "POINT", + "feature_count": 6, + "description": "Control point" + }, + { + "object_class_id": 99, + "object_class": "OBSTRN", + "geometry_type": "POINT", + "feature_count": 6, + "description": "Obstruction" + }, + { + "object_class_id": 217, + "object_class": "_m_sor", + "geometry_type": "META", + "feature_count": 6, + "description": "Source of data" + }, + { + "object_class_id": 191, + "object_class": "$COMPS", + "geometry_type": "POINT", + "feature_count": 5, + "description": "Compass" + }, + { + "object_class_id": 12, + "object_class": "BUIREL", + "geometry_type": "POINT", + "feature_count": 5, + "description": "Building, religious" + }, + { + "object_class_id": 21, + "object_class": "CBLOHD", + "geometry_type": "LINE", + "feature_count": 5, + "description": "Cable, overhead" + }, + { + "object_class_id": 57, + "object_class": "FAIRWY", + "geometry_type": "AREA", + "feature_count": 5, + "description": "Fairway" + }, + { + "object_class_id": 129, + "object_class": "RIVERS", + "geometry_type": "AREA", + "feature_count": 5, + "description": "River" + }, + { + "object_class_id": 142, + "object_class": "SILBUI", + "geometry_type": "POINT", + "feature_count": 5, + "description": "Silo" + }, + { + "object_class_id": 154, + "object_class": "TELPHC", + "geometry_type": "LINE", + "feature_count": 5, + "description": "Telepheric" + }, + { + "object_class_id": 11, + "object_class": "BRIDGE", + "geometry_type": "LINE", + "feature_count": 4, + "description": "Bridge" + }, + { + "object_class_id": 72, + "object_class": "HRBARE", + "geometry_type": "AREA", + "feature_count": 4, + "description": "Harbour area (administrative)" + }, + { + "object_class_id": 95, + "object_class": "MONUMT", + "geometry_type": "POINT", + "feature_count": 4, + "description": "Monument" + }, + { + "object_class_id": 140, + "object_class": "SISTAT", + "geometry_type": "POINT", + "feature_count": 4, + "description": "Signal station, traffic" + }, + { + "object_class_id": 147, + "object_class": "SOUNDG", + "geometry_type": "SOUNDING", + "feature_count": 4, + "description": "Spot soundings" + }, + { + "object_class_id": 1, + "object_class": "AIRARE", + "geometry_type": "POINT", + "feature_count": 3, + "description": "Airport area" + }, + { + "object_class_id": 14, + "object_class": "BUAARE", + "geometry_type": "AREA", + "feature_count": 3, + "description": "Built-up area" + }, + { + "object_class_id": 79, + "object_class": "LAKARE", + "geometry_type": "AREA", + "feature_count": 3, + "description": "Lake" + }, + { + "object_class_id": 80, + "object_class": "LAKSHR", + "geometry_type": "LINE", + "feature_count": 3, + "description": "Lake shore" + }, + { + "object_class_id": 97, + "object_class": "NATARE", + "geometry_type": "AREA", + "feature_count": 3, + "description": "National territorial area" + }, + { + "object_class_id": 104, + "object_class": "PILBOP", + "geometry_type": "POINT", + "feature_count": 3, + "description": "Pilot boarding place" + }, + { + "object_class_id": 143, + "object_class": "SLIPWY", + "geometry_type": "AREA", + "feature_count": 3, + "description": "Slipway" + }, + { + "object_class_id": 155, + "object_class": "TESARE", + "geometry_type": "AREA", + "feature_count": 3, + "description": "Territorial sea area" + }, + { + "object_class_id": 4, + "object_class": "ACHARE", + "geometry_type": "AREA", + "feature_count": 2, + "description": "Anchorage area" + }, + { + "object_class_id": 36, + "object_class": "CONZNE", + "geometry_type": "AREA", + "feature_count": 2, + "description": "Contiguous zone" + }, + { + "object_class_id": 56, + "object_class": "EXEZNE", + "geometry_type": "AREA", + "feature_count": 2, + "description": "Exclusive economic zone" + }, + { + "object_class_id": 96, + "object_class": "MORFAC", + "geometry_type": "AREA", + "feature_count": 2, + "description": "Mooring/Warping facility" + }, + { + "object_class_id": 106, + "object_class": "PIPOHD", + "geometry_type": "LINE", + "feature_count": 2, + "description": "Pipeline, overhead" + }, + { + "object_class_id": 107, + "object_class": "PIPSOL", + "geometry_type": "LINE", + "feature_count": 2, + "description": "Pipeline, submarine/on land" + }, + { + "object_class_id": 112, + "object_class": "PYLONS", + "geometry_type": "POINT", + "feature_count": 2, + "description": "Pylon" + }, + { + "object_class_id": 136, + "object_class": "SEAARE", + "geometry_type": "AREA", + "feature_count": 2, + "description": "Sea area" + }, + { + "object_class_id": 73, + "object_class": "HRBFAC", + "geometry_type": "POINT", + "feature_count": 1, + "description": "Harbour facility" + }, + { + "object_class_id": 73, + "object_class": "HRBFAC", + "geometry_type": "AREA", + "feature_count": 1, + "description": "Harbour facility" + }, + { + "object_class_id": 127, + "object_class": "RSCSTA", + "geometry_type": "POINT", + "feature_count": 1, + "description": "Rescue station" + }, + { + "object_class_id": 118, + "object_class": "RTPBCN", + "geometry_type": "POINT", + "feature_count": 1, + "description": "Radar transponder beacon" + }, + { + "object_class_id": 142, + "object_class": "SILBUI", + "geometry_type": "AREA", + "feature_count": 1, + "description": "Silo" + }, + { + "object_class_id": 141, + "object_class": "SISTAW", + "geometry_type": "POINT", + "feature_count": 1, + "description": "Signal station, warning" + }, + { + "object_class_id": 176, + "object_class": "WRECKS", + "geometry_type": "AREA", + "feature_count": 1, + "description": "Wreck" + } + ], + "next_step": "Use AOI_对象映射准备表_v1.csv + 属性值域汇总_v1.csv to author cm95_to_navsea_v1.yaml." +} \ No newline at end of file diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象字典_v1.csv b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象字典_v1.csv new file mode 100644 index 0000000..48540b3 --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象字典_v1.csv @@ -0,0 +1,68 @@ +object_class_id,object_class,geometry_code,display_code,description,raw_line +1,AIRARE,PA,6,Airport area,AIRARE|1|PA|6|Airport area|CATAIR|CONDTN|CONVIS|NATCON|NOBJNM|OBJNAM|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +4,ACHARE,PA,6,Anchorage area,ACHARE|4|PA|6|Anchorage area|CATACH|DATEND|DATSTA|NOBJNM|OBJNAM|PEREND|PERSTA|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +7,BCNLAT,P,8,"Beacon, lateral","BCNLAT|7|P|8|Beacon, lateral|BCNSHP|CATLAM|COLMAR|COLPAT|CONRAD|DATEND|DATSTA|MARSYS|NOBJNM|OBJNAM|PEREND|PERSTA|QUAVEM|STATUS|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +9,BCNSPP,P,8,"Beacon, special purpose","BCNSPP|9|P|8|Beacon, special purpose|BCNSHP|CATSPM|COLMAR|COLPAT|CONRAD|DATEND|DATSTA|MARSYS|NOBJNM|OBJNAM|PEREND|PERSTA|QUAVEM|STATUS|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +10,BRTFAC,PLA,6,Berthing facility,BRTFAC|10|PLA|6|Berthing facility|CONDTN|DATEND|DATSTA|NATCON|NOBJNM|OBJNAM|STATUS|WATLEV|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +11,BRIDGE,PLA,6,Bridge,BRIDGE|11|PLA|6|Bridge|CATBRG|COLOUR|CONDTN|CONRAD|CONVIS|DATEND|DATSTA|HORCLR|NATCON|NOBJNM|OBJNAM|QUAVEM|VERCCL|VERCLR|VERCOP|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +12,BUIREL,PA,6,"Building, religious","BUIREL|12|PA|6|Building, religious|BUISHP|CATREB|COLOUR|CONDTN|CONRAD|CONVIS|HEIGHT|NATCON|NOBJNM|OBJNAM|QUAVEM|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND|" +13,BUISGL,PA,6,"Building, single","BUISGL|13|PA|6|Building, single|BUISHP|CATBUI|COLOUR|COLPAT|CONDTN|CONRAD|CONVIS|HEIGHT|NATCON|NOBJNM|OBJNAM|QUAVEM|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +14,BUAARE,PA,6,Built-up area,BUAARE|14|PA|6|Built-up area|CATBUA|CONDTN|CONRAD|CONVIS|HEIGHT|NOBJNM|OBJNAM|QUAVEM|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +20,BOYSPP,P,8,"Buoy, special purpose","BOYSPP|20|P|8|Buoy, special purpose|BOYSHP|CATSPM|COLMAR|COLPAT|CONRAD|DATEND|DATSTA|MARSYS|NOBJNM|OBJNAM|PEREND|PERSTA|QUAVEM|STATUS|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +21,CBLOHD,L,7,"Cable, overhead","CBLOHD|21|L|7|Cable, overhead|CATCBL|CONDTN|DATEND|DATSTA|NOBJNM|OBJNAM|QUAVEM|STATUS|VERCLR|VERCSA|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +22,CBLSUB,L,7,"Cable, submarine","CBLSUB|22|L|7|Cable, submarine|BURDEP|CATCBL|CONDTN|DATEND|DATSTA|NOBJNM|OBJNAM|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +29,CTNARE,PA,6,Caution area,CTNARE|29|PA|6|Caution area|DATEND|DATSTA|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +33,CHIMNY,PA,6,Chimney,CHIMNY|33|PA|6|Chimney|COLOUR|COLPAT|CONDTN|CONRAD|CONVIS|HEIGHT|NATCON|NOBJNM|OBJNAM|QUAVEM|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +35,COALNE,L,7,Coastline,COALNE|35|L|7|Coastline|CATCOA|CONRAD|HEIGHT|NOBJNM|OBJNAM|QUAVEM|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +36,CONZNE,A,5,Contiguous zone,CONZNE|36|A|5|Contiguous zone|DATEND|DATSTA|NATION|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +38,CTRPNT,P,8,Control point,CTRPNT|38|P|8|Control point|CATCTR|DATEND|DATSTA|HEIGHT|NOBJNM|OBJNAM|QUAVEM|VERDAT|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +39,CRANES,PA,6,Crane,CRANES|39|PA|6|Crane|CATCRN|COLOUR|CONDTN|CONRAD|CONVIS|HEIGHT|LIFCAP|NOBJNM|OBJNAM|ORIENT|QUAVEM|RADIUS|STATUS|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +44,DEPARE,A,1,Depth area,DEPARE|44|A|1|Depth area|DRVAL1|DRVAL2|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +45,DEPCNT,L,7,Depth contour,DEPCNT|45|L|7|Depth contour|VALDCO|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +50,DRGARE,A,5,Dredged area,DRGARE|50|A|5|Dredged area|DRVAL1|DRVAL2|NOBJNM|OBJNAM|QUASOU|TECSOU|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +56,EXEZNE,A,5,Exclusive economic zone,EXEZNE|56|A|5|Exclusive economic zone|NATION|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +57,FAIRWY,A,5,Fairway,FAIRWY|57|A|5|Fairway|DATEND|DATSTA|DRVAL1|DRVAL2|NOBJNM|OBJNAM|QUASOU|STATUS|TECSOU|TRAFIC|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +60,FSHHAV,PA,6,Fish haven,FSHHAV|60|PA|6|Fish haven|EXPSOU|NOBJNM|OBJNAM|QUASOU|TECSOU|VALSOU|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +72,HRBARE,A,5,Harbour area (administrative),HRBARE|72|A|5|Harbour area (administrative)|NOBJNM|OBJNAM|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +73,HRBFAC,PA,6,Harbour facility,HRBFAC|73|PA|6|Harbour facility|CATHAF|CONDTN|DATEND|DATSTA|NATCON|NOBJNM|OBJNAM|PEREND|PERSTA|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +78,ITDARE,PLA,1,Intertidal area,ITDARE|78|PLA|1|Intertidal area|NATQUA|NATSUR|NOBJNM|OBJNAM|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +79,LAKARE,A,1,Lake,LAKARE|79|A|1|Lake|HEIGHT|NOBJNM|OBJNAM|QUAVEM|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +80,LAKSHR,L,7,Lake shore,LAKSHR|80|L|7|Lake shore|NOBJNM|OBJNAM|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +81,LNDARE,PA,1,Land area,LNDARE|81|PA|1|Land area|NOBJNM|OBJNAM|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +86,LIGHTS,P,8,Light,LIGHTS|86|P|8|Light|CATLIT|COLOUR|DATEND|DATSTA|EXCLIT|HEIGHT|LITCHR|LITVIS|MARSYS|NOBJNM|OBJNAM|ORIENT|PEREND|PERSTA|QUAVEM|SECTR1|SECTR2|SIGGRP|SIGPER|SIGSEQ|STATUS|SUPLIT|VALNMR|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +95,MONUMT,P,8,Monument,MONUMT|95|P|8|Monument|BUISHP|CATMNT|COLOUR|CONDTN|CONRAD|CONVIS|HEIGHT|NATCON|NOBJNM|OBJNAM|QUAVEM|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +96,MORFAC,PA,6,Mooring/Warping facility,MORFAC|96|PA|6|Mooring/Warping facility|CATMOR|COLOUR|CONDTN|CONRAD|DATEND|DATSTA|NATCON|NOBJNM|OBJNAM|PEREND|PERSTA|STATUS|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +97,NATARE,A,5,National territorial area,NATARE|97|A|5|National territorial area|NATION|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +99,OBSTRN,PA,6,Obstruction,OBSTRN|99|PA|6|Obstruction|EXPSOU|NOBJNM|OBJNAM|QUASOU|TECSOU|VALSOU|VERDAT|WATLEV|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +103,PILPNT,P,8,Pile,PILPNT|103|P|8|Pile|CATPLE|CONDTN|DATEND|DATSTA|EXPSOU|HEIGHT|QUASOU|QUAVEM|TECSOU|VALSOU|VERDAT|VERLEN|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +104,PILBOP,PA,8,Pilot boarding place,PILBOP|104|PA|8|Pilot boarding place|CATPIL|COMCHA|DATEND|DATSTA|NOBJNM|NPLDST|OBJNAM|PILDST|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +106,PIPOHD,L,7,"Pipeline, overhead","PIPOHD|106|L|7|Pipeline, overhead|CATPIP|CONDTN|DATEND|DATSTA|NOBJNM|OBJNAM|PRODCT|QUAVEM|STATUS|VERCLR|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +107,PIPSOL,L,7,"Pipeline, submarine/on land","PIPSOL|107|L|7|Pipeline, submarine/on land|BURDEP|CATPIP|CONDTN|DATEND|DATSTA|NOBJNM|OBJNAM|PRODCT|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +111,PRDINS,PA,6,Production installation,PRDINS|111|PA|6|Production installation|CATPRI|CONDTN|CONRAD|CONVIS|DATEND|DATSTA|EXPSOU|HEIGHT|NOBJNM|OBJNAM|PRODCT|QUASOU|QUAVEM|STATUS|TECSOU|VALSOU|VERDAT|WATLEV|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +112,PYLONS,PA,6,Pylon,PYLONS|112|PA|6|Pylon|COLOUR|COLPAT|CONDTN|CONRAD|CONVIS|HEIGHT|NATCON|NOBJNM|OBJNAM|QUAVEM|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +118,RTPBCN,P,8,Radar transponder beacon,RTPBCN|118|P|8|Radar transponder beacon|CATRTB|DATEND|DATSTA|NOBJNM|OBJNAM|RADWAL|SECTR1|SECTR2|SIGGRP|SIGSEQ|STATUS|VALMXR|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +127,RSCSTA,P,8,Rescue station,RSCSTA|127|P|8|Rescue station|CATRSC|DATEND|DATSTA|NOBJNM|OBJNAM|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +129,RIVERS,LA,1,River,RIVERS|129|LA|1|River|NOBJNM|OBJNAM|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +130,RIVBNK,L,7,River bank,RIVBNK|130|L|7|River bank|NOBJNM|OBJNAM|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +136,SEAARE,A,5,Sea area,SEAARE|136|A|5|Sea area|CATSEA|NOBJNM|OBJNAM|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +138,SBDARE,PA,6,Seabed area,SBDARE|138|PA|6|Seabed area|COLOUR|NATQUA|NATSUR|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +139,SLCONS,LA,7,Shoreline construction,SLCONS|139|LA|7|Shoreline construction|CATSLC|CONDTN|CONRAD|CONVIS|DATEND|DATSTA|HEIGHT|NATCON|NOBJNM|OBJNAM|QUAVEM|STATUS|VERDAT|VERLEN|WATLEV|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +140,SISTAT,P,8,"Signal station, traffic","SISTAT|140|P|8|Signal station, traffic|CATSIT|COMCHA|DATEND|DATSTA|NOBJNM|OBJNAM|PEREND|PERSTA|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +141,SISTAW,P,8,"Signal station, warning","SISTAW|141|P|8|Signal station, warning|CATSIW|COMCHA|DATEND|DATSTA|NOBJNM|OBJNAM|PEREND|PERSTA|STATUS|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +142,SILBUI,PA,6,Silo,SILBUI|142|PA|6|Silo|BUISHP|COLOUR|COLPAT|CONDTN|CONRAD|CONVIS|HEIGHT|NATCON|NOBJNM|OBJNAM|PRODCT|QUAVEM|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +143,SLIPWY,LA,6,Slipway,SLIPWY|143|LA|6|Slipway|CONDTN|HORCLR|HORLEN|HORWID|NATCON|NOBJNM|OBJNAM|STATUS|WATLEV|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +147,SOUNDG,S,7,Spot soundings,SOUNDG|147|S|7|Spot soundings|EXPSOU|NOBJNM|OBJNAM|QUASOU|TECSOU|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +153,TNKCON,PA,6,Tank,TNKCON|153|PA|6|Tank|COLOUR|COLPAT|CONDTN|CONRAD|CONVIS|HEIGHT|NOBJNM|OBJNAM|PRODCT|QUAVEM|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +154,TELPHC,L,7,Telepheric,TELPHC|154|L|7|Telepheric|CONDTN|CONRAD|CONVIS|DATEND|DATSTA|LIFCAP|NOBJNM|OBJNAM|QUAVEM|STATUS|VERCLR|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +155,TESARE,A,5,Territorial sea area,TESARE|155|A|5|Territorial sea area|NATION|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +158,TOWERS,PA,6,Tower,TOWERS|158|PA|6|Tower|CATTOW|COLOUR|COLPAT|CONDTN|CONRAD|CONVIS|HEIGHT|NATCON|NOBJNM|OBJNAM|QUAVEM|VERDAT|VERLEN|INFORM|NINFOM|PICREP|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +168,UWTROC,P,8,Underwater rock,UWTROC|168|P|8|Underwater rock|EXPSOU|NOBJNM|OBJNAM|QUASOU|TECSOU|VALSOU|VERDAT|WATLEV|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +176,WRECKS,PA,8,Wreck,WRECKS|176|PA|8|Wreck|CATWRK|CONRAD|CONVIS|EXPSOU|HEIGHT|NOBJNM|OBJNAM|QUASOU|QUAVEM|TECSOU|VALSOU|VERDAT|WATLEV|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +177,ZEMCNT,L,7,Zero meter contour,ZEMCNT|177|L|7|Zero meter contour|VERDAT|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +191,$COMPS,P,8,Compass,$COMPS|191|P|8|Compass|$CSIZE|$VARIA|$CYEAR|$ANNCH|SCAMIN|SCAMAX +193,$LINES,L,7,Cartographic line,$LINES|193|L|7|Cartographic line|$SCODE|SCAMIN|SCAMAX +194,$AREAS,A,5,Cartographic area,$AREAS|194|A|5|Cartographic area|$SCODE|$ROTAT|SCAMIN|SCAMAX +198,_texto,P,8,Text,_texto|198|P|8|Text|$JUSTH|$JUSTV|$SPACE|$CHARS|$COLOR|$ROTAT|_texta|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND +201,_extgn,P,8,"Extended navigational aid, generic","_extgn|201|P|8|Extended navigational aid, generic|CATCAM|CATLAM|COLMAR|MARSYS|NOBJNM|OBJNAM|INFORM|NINFOM|SCAMAX|SCAMIN|RECDAT|RECIND|SORDAT|SORIND" +210,M_PROD,A,0,Production information,M_PROD|210|A|0|Production information|AGENCY|CPDATE|NMDATE|PRCTRY|INFORM|NINFOM|RECDAT|RECIND|SORDAT|SORIND +217,_m_sor,A,0,Source of data,_m_sor|217|A|0|Source of data|CSCALE|DUNITS|HUNITS|HORACC|NMDATE|HORDAT|_sorhd|_wgsox|_wgsoy|SORDAT|SORIND|VERACC|VERDAT|_hvdat|MARSYS|_chcod|_dgdat|_quart|INFORM|NINFOM|RECDAT|RECIND diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象类别尺度分布_v1.csv b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象类别尺度分布_v1.csv new file mode 100644 index 0000000..18ee43e --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象类别尺度分布_v1.csv @@ -0,0 +1,204 @@ +object_class_id,object_class,geometry_type,scale_code,native_scale,feature_count +194,$AREAS,AREA,F,20000,3 +194,$AREAS,AREA,E,50000,7 +194,$AREAS,AREA,C,200000,1 +191,$COMPS,POINT,F,20000,4 +191,$COMPS,POINT,E,50000,1 +193,$LINES,LINE,F,20000,6 +193,$LINES,LINE,E,50000,9 +4,ACHARE,AREA,F,20000,1 +4,ACHARE,AREA,E,50000,1 +1,AIRARE,POINT,F,20000,1 +1,AIRARE,POINT,C,200000,2 +7,BCNLAT,POINT,F,20000,5 +7,BCNLAT,POINT,E,50000,5 +7,BCNLAT,POINT,C,200000,5 +9,BCNSPP,POINT,F,20000,4 +9,BCNSPP,POINT,E,50000,3 +9,BCNSPP,POINT,C,200000,3 +9,BCNSPP,POINT,B,1000000,2 +20,BOYSPP,POINT,F,20000,6 +20,BOYSPP,POINT,E,50000,2 +11,BRIDGE,LINE,F,20000,1 +11,BRIDGE,LINE,C,200000,3 +11,BRIDGE,AREA,F,20000,12 +11,BRIDGE,AREA,E,50000,4 +11,BRIDGE,AREA,C,200000,1 +10,BRTFAC,POINT,F,20000,45 +10,BRTFAC,POINT,E,50000,44 +14,BUAARE,POINT,F,20000,25 +14,BUAARE,POINT,C,200000,8 +14,BUAARE,POINT,B,1000000,2 +14,BUAARE,AREA,C,200000,3 +12,BUIREL,POINT,F,20000,4 +12,BUIREL,POINT,E,50000,1 +13,BUISGL,POINT,F,20000,9 +13,BUISGL,POINT,E,50000,2 +13,BUISGL,POINT,C,200000,1 +13,BUISGL,AREA,F,20000,20 +21,CBLOHD,LINE,F,20000,4 +21,CBLOHD,LINE,E,50000,1 +22,CBLSUB,LINE,F,20000,5 +22,CBLSUB,LINE,E,50000,4 +22,CBLSUB,LINE,C,200000,3 +33,CHIMNY,POINT,F,20000,17 +33,CHIMNY,POINT,E,50000,17 +33,CHIMNY,POINT,C,200000,1 +35,COALNE,LINE,F,20000,108 +35,COALNE,LINE,E,50000,49 +35,COALNE,LINE,C,200000,9 +35,COALNE,LINE,B,1000000,2 +35,COALNE,LINE,A,3000000,1 +35,COALNE,LINE,Z,20000000,2 +36,CONZNE,AREA,C,200000,1 +36,CONZNE,AREA,B,1000000,1 +39,CRANES,POINT,F,20000,7 +39,CRANES,POINT,E,50000,8 +29,CTNARE,POINT,F,20000,3 +29,CTNARE,POINT,E,50000,10 +29,CTNARE,AREA,F,20000,9 +29,CTNARE,AREA,E,50000,2 +29,CTNARE,AREA,C,200000,2 +29,CTNARE,AREA,B,1000000,3 +38,CTRPNT,POINT,F,20000,5 +38,CTRPNT,POINT,E,50000,1 +44,DEPARE,AREA,F,20000,239 +44,DEPARE,AREA,E,50000,150 +44,DEPARE,AREA,C,200000,18 +44,DEPARE,AREA,B,1000000,2 +44,DEPARE,AREA,A,3000000,2 +44,DEPARE,AREA,Z,20000000,3 +45,DEPCNT,LINE,F,20000,257 +45,DEPCNT,LINE,E,50000,164 +45,DEPCNT,LINE,C,200000,26 +45,DEPCNT,LINE,B,1000000,1 +45,DEPCNT,LINE,A,3000000,1 +45,DEPCNT,LINE,Z,20000000,2 +50,DRGARE,AREA,E,50000,14 +56,EXEZNE,AREA,C,200000,1 +56,EXEZNE,AREA,B,1000000,1 +57,FAIRWY,AREA,F,20000,2 +57,FAIRWY,AREA,E,50000,3 +60,FSHHAV,POINT,F,20000,4 +60,FSHHAV,POINT,E,50000,4 +60,FSHHAV,POINT,C,200000,10 +72,HRBARE,AREA,F,20000,1 +72,HRBARE,AREA,E,50000,3 +73,HRBFAC,POINT,F,20000,1 +73,HRBFAC,AREA,F,20000,1 +78,ITDARE,AREA,F,20000,40 +78,ITDARE,AREA,E,50000,15 +78,ITDARE,AREA,C,200000,14 +79,LAKARE,AREA,F,20000,1 +79,LAKARE,AREA,C,200000,2 +80,LAKSHR,LINE,F,20000,1 +80,LAKSHR,LINE,C,200000,2 +86,LIGHTS,POINT,F,20000,41 +86,LIGHTS,POINT,E,50000,35 +86,LIGHTS,POINT,C,200000,17 +86,LIGHTS,POINT,B,1000000,3 +81,LNDARE,AREA,F,20000,95 +81,LNDARE,AREA,E,50000,53 +81,LNDARE,AREA,C,200000,6 +81,LNDARE,AREA,B,1000000,2 +81,LNDARE,AREA,A,3000000,1 +81,LNDARE,AREA,Z,20000000,2 +95,MONUMT,POINT,F,20000,2 +95,MONUMT,POINT,E,50000,2 +96,MORFAC,POINT,E,50000,7 +96,MORFAC,AREA,F,20000,2 +210,M_PROD,AREA,F,20000,1 +210,M_PROD,AREA,E,50000,1 +210,M_PROD,AREA,D,100000,1 +210,M_PROD,AREA,C,200000,1 +210,M_PROD,AREA,B,1000000,1 +210,M_PROD,AREA,A,3000000,1 +210,M_PROD,AREA,Z,20000000,1 +97,NATARE,AREA,F,20000,1 +97,NATARE,AREA,C,200000,1 +97,NATARE,AREA,B,1000000,1 +99,OBSTRN,POINT,F,20000,2 +99,OBSTRN,POINT,E,50000,3 +99,OBSTRN,POINT,C,200000,1 +99,OBSTRN,AREA,F,20000,41 +99,OBSTRN,AREA,E,50000,16 +99,OBSTRN,AREA,C,200000,11 +99,OBSTRN,AREA,B,1000000,2 +104,PILBOP,POINT,F,20000,2 +104,PILBOP,POINT,E,50000,1 +103,PILPNT,POINT,F,20000,7 +103,PILPNT,POINT,E,50000,12 +103,PILPNT,POINT,C,200000,1 +106,PIPOHD,LINE,F,20000,2 +107,PIPSOL,LINE,F,20000,1 +107,PIPSOL,LINE,E,50000,1 +111,PRDINS,POINT,F,20000,12 +111,PRDINS,AREA,F,20000,15 +112,PYLONS,POINT,E,50000,2 +130,RIVBNK,LINE,F,20000,4 +130,RIVBNK,LINE,C,200000,3 +129,RIVERS,AREA,F,20000,2 +129,RIVERS,AREA,C,200000,3 +127,RSCSTA,POINT,F,20000,1 +118,RTPBCN,POINT,E,50000,1 +138,SBDARE,POINT,F,20000,211 +138,SBDARE,POINT,E,50000,67 +138,SBDARE,POINT,C,200000,9 +138,SBDARE,AREA,F,20000,7 +138,SBDARE,AREA,E,50000,1 +138,SBDARE,AREA,C,200000,1 +136,SEAARE,AREA,C,200000,2 +142,SILBUI,POINT,F,20000,2 +142,SILBUI,POINT,E,50000,3 +142,SILBUI,AREA,F,20000,1 +140,SISTAT,POINT,F,20000,2 +140,SISTAT,POINT,E,50000,2 +141,SISTAW,POINT,F,20000,1 +139,SLCONS,LINE,F,20000,107 +139,SLCONS,LINE,E,50000,46 +139,SLCONS,LINE,C,200000,41 +139,SLCONS,LINE,B,1000000,15 +139,SLCONS,AREA,F,20000,94 +139,SLCONS,AREA,E,50000,25 +143,SLIPWY,AREA,F,20000,1 +143,SLIPWY,AREA,E,50000,2 +147,SOUNDG,SOUNDING,F,20000,1 +147,SOUNDG,SOUNDING,E,50000,1 +147,SOUNDG,SOUNDING,C,200000,1 +147,SOUNDG,SOUNDING,B,1000000,1 +154,TELPHC,LINE,F,20000,2 +154,TELPHC,LINE,E,50000,3 +155,TESARE,AREA,F,20000,1 +155,TESARE,AREA,C,200000,1 +155,TESARE,AREA,B,1000000,1 +153,TNKCON,POINT,F,20000,10 +153,TNKCON,POINT,E,50000,36 +153,TNKCON,AREA,E,50000,11 +158,TOWERS,POINT,F,20000,21 +158,TOWERS,POINT,E,50000,24 +158,TOWERS,POINT,C,200000,8 +158,TOWERS,POINT,B,1000000,1 +168,UWTROC,POINT,F,20000,96 +168,UWTROC,POINT,E,50000,27 +168,UWTROC,POINT,C,200000,50 +168,UWTROC,POINT,B,1000000,3 +176,WRECKS,POINT,F,20000,467 +176,WRECKS,POINT,E,50000,10 +176,WRECKS,POINT,C,200000,3 +176,WRECKS,AREA,F,20000,1 +177,ZEMCNT,LINE,F,20000,42 +177,ZEMCNT,LINE,E,50000,28 +177,ZEMCNT,LINE,C,200000,14 +201,_extgn,POINT,F,20000,22 +201,_extgn,POINT,E,50000,20 +217,_m_sor,META,F,20000,1 +217,_m_sor,META,E,50000,1 +217,_m_sor,META,C,200000,1 +217,_m_sor,META,B,1000000,1 +217,_m_sor,META,A,3000000,1 +217,_m_sor,META,Z,20000000,1 +198,_texto,POINT,F,20000,67 +198,_texto,POINT,E,50000,27 +198,_texto,POINT,C,200000,15 +198,_texto,POINT,B,1000000,3 +198,_texto,POINT,A,3000000,1 diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象类别汇总_v1.csv b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象类别汇总_v1.csv new file mode 100644 index 0000000..819840c --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/对象类别汇总_v1.csv @@ -0,0 +1,81 @@ +object_class_id,object_class,geometry_type,feature_count,cell_count,min_native_scale,max_native_scale,repaired_count,issue_count,dictionary_geometry_code,dictionary_display_code,description +176,WRECKS,POINT,480,3,20000,200000,0,0,PA,8,Wreck +45,DEPCNT,LINE,451,6,20000,20000000,0,0,L,7,Depth contour +44,DEPARE,AREA,414,6,20000,20000000,1,0,A,1,Depth area +138,SBDARE,POINT,287,3,20000,200000,0,0,PA,6,Seabed area +139,SLCONS,LINE,209,4,20000,1000000,0,0,LA,7,Shoreline construction +168,UWTROC,POINT,176,4,20000,1000000,0,0,P,8,Underwater rock +35,COALNE,LINE,171,6,20000,20000000,0,0,L,7,Coastline +81,LNDARE,AREA,159,6,20000,20000000,0,0,PA,1,Land area +139,SLCONS,AREA,119,2,20000,50000,0,0,LA,7,Shoreline construction +198,_texto,POINT,113,5,20000,3000000,0,0,P,8,Text +86,LIGHTS,POINT,96,4,20000,1000000,0,0,P,8,Light +10,BRTFAC,POINT,89,2,20000,50000,0,0,PLA,6,Berthing facility +177,ZEMCNT,LINE,84,3,20000,200000,0,0,L,7,Zero meter contour +99,OBSTRN,AREA,70,4,20000,1000000,0,0,PA,6,Obstruction +78,ITDARE,AREA,69,3,20000,200000,0,0,PLA,1,Intertidal area +158,TOWERS,POINT,54,4,20000,1000000,0,0,PA,6,Tower +153,TNKCON,POINT,46,2,20000,50000,0,0,PA,6,Tank +201,_extgn,POINT,42,2,20000,50000,0,0,P,8,"Extended navigational aid, generic" +14,BUAARE,POINT,35,3,20000,1000000,0,0,PA,6,Built-up area +33,CHIMNY,POINT,35,3,20000,200000,0,0,PA,6,Chimney +13,BUISGL,AREA,20,1,20000,20000,0,0,PA,6,"Building, single" +103,PILPNT,POINT,20,3,20000,200000,0,0,P,8,Pile +60,FSHHAV,POINT,18,3,20000,200000,0,0,PA,6,Fish haven +11,BRIDGE,AREA,17,3,20000,200000,0,0,PLA,6,Bridge +29,CTNARE,AREA,16,4,20000,1000000,0,0,PA,6,Caution area +193,$LINES,LINE,15,2,20000,50000,0,0,L,7,Cartographic line +7,BCNLAT,POINT,15,3,20000,200000,0,0,P,8,"Beacon, lateral" +39,CRANES,POINT,15,2,20000,50000,0,0,PA,6,Crane +111,PRDINS,AREA,15,1,20000,20000,0,0,PA,6,Production installation +50,DRGARE,AREA,14,1,50000,50000,0,0,A,5,Dredged area +29,CTNARE,POINT,13,2,20000,50000,0,0,PA,6,Caution area +9,BCNSPP,POINT,12,4,20000,1000000,0,0,P,8,"Beacon, special purpose" +13,BUISGL,POINT,12,3,20000,200000,0,0,PA,6,"Building, single" +22,CBLSUB,LINE,12,3,20000,200000,0,0,L,7,"Cable, submarine" +111,PRDINS,POINT,12,1,20000,20000,0,0,PA,6,Production installation +194,$AREAS,AREA,11,3,20000,200000,0,0,A,5,Cartographic area +153,TNKCON,AREA,11,1,50000,50000,0,0,PA,6,Tank +138,SBDARE,AREA,9,3,20000,200000,0,0,PA,6,Seabed area +20,BOYSPP,POINT,8,2,20000,50000,0,0,P,8,"Buoy, special purpose" +96,MORFAC,POINT,7,1,50000,50000,0,0,PA,6,Mooring/Warping facility +210,M_PROD,AREA,7,7,20000,20000000,0,0,A,0,Production information +130,RIVBNK,LINE,7,2,20000,200000,0,0,L,7,River bank +38,CTRPNT,POINT,6,2,20000,50000,0,0,P,8,Control point +99,OBSTRN,POINT,6,3,20000,200000,0,0,PA,6,Obstruction +217,_m_sor,META,6,6,20000,20000000,0,0,A,0,Source of data +191,$COMPS,POINT,5,2,20000,50000,0,0,P,8,Compass +12,BUIREL,POINT,5,2,20000,50000,0,0,PA,6,"Building, religious" +21,CBLOHD,LINE,5,2,20000,50000,0,0,L,7,"Cable, overhead" +57,FAIRWY,AREA,5,2,20000,50000,0,0,A,5,Fairway +129,RIVERS,AREA,5,2,20000,200000,0,0,LA,1,River +142,SILBUI,POINT,5,2,20000,50000,0,0,PA,6,Silo +154,TELPHC,LINE,5,2,20000,50000,0,0,L,7,Telepheric +11,BRIDGE,LINE,4,2,20000,200000,0,0,PLA,6,Bridge +72,HRBARE,AREA,4,2,20000,50000,0,0,A,5,Harbour area (administrative) +95,MONUMT,POINT,4,2,20000,50000,0,0,P,8,Monument +140,SISTAT,POINT,4,2,20000,50000,0,0,P,8,"Signal station, traffic" +147,SOUNDG,SOUNDING,4,4,20000,1000000,0,0,S,7,Spot soundings +1,AIRARE,POINT,3,2,20000,200000,0,0,PA,6,Airport area +14,BUAARE,AREA,3,1,200000,200000,0,0,PA,6,Built-up area +79,LAKARE,AREA,3,2,20000,200000,0,0,A,1,Lake +80,LAKSHR,LINE,3,2,20000,200000,0,0,L,7,Lake shore +97,NATARE,AREA,3,3,20000,1000000,0,0,A,5,National territorial area +104,PILBOP,POINT,3,2,20000,50000,0,0,PA,8,Pilot boarding place +143,SLIPWY,AREA,3,2,20000,50000,0,0,LA,6,Slipway +155,TESARE,AREA,3,3,20000,1000000,0,0,A,5,Territorial sea area +4,ACHARE,AREA,2,2,20000,50000,0,0,PA,6,Anchorage area +36,CONZNE,AREA,2,2,200000,1000000,0,0,A,5,Contiguous zone +56,EXEZNE,AREA,2,2,200000,1000000,0,0,A,5,Exclusive economic zone +96,MORFAC,AREA,2,1,20000,20000,0,0,PA,6,Mooring/Warping facility +106,PIPOHD,LINE,2,1,20000,20000,0,0,L,7,"Pipeline, overhead" +107,PIPSOL,LINE,2,2,20000,50000,0,0,L,7,"Pipeline, submarine/on land" +112,PYLONS,POINT,2,1,50000,50000,0,0,PA,6,Pylon +136,SEAARE,AREA,2,1,200000,200000,0,0,A,5,Sea area +73,HRBFAC,POINT,1,1,20000,20000,0,0,PA,6,Harbour facility +73,HRBFAC,AREA,1,1,20000,20000,0,0,PA,6,Harbour facility +127,RSCSTA,POINT,1,1,20000,20000,0,0,P,8,Rescue station +118,RTPBCN,POINT,1,1,50000,50000,0,0,P,8,Radar transponder beacon +142,SILBUI,AREA,1,1,20000,20000,0,0,PA,6,Silo +141,SISTAW,POINT,1,1,20000,20000,0,0,P,8,"Signal station, warning" +176,WRECKS,AREA,1,1,20000,20000,0,0,PA,8,Wreck diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性值域汇总_v1.csv b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性值域汇总_v1.csv new file mode 100644 index 0000000..9c9e73b --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性值域汇总_v1.csv @@ -0,0 +1,681 @@ +object_class_id,object_class,geometry_type,attribute_id,attribute_name,value_type,rank,value,count,total_distinct_values +194,$AREAS,AREA,129,$SCODE,STRING,1,II25,11,1 +191,$COMPS,POINT,128,$ANNCH,STRING,1,00.00 E,4,2 +191,$COMPS,POINT,128,$ANNCH,STRING,2,01.00 W,1,2 +191,$COMPS,POINT,127,$CYEAR,REAL,1,2012,4,2 +191,$COMPS,POINT,127,$CYEAR,REAL,2,2002,1,2 +191,$COMPS,POINT,126,$VARIA,STRING,1,08.25 W,5,1 +193,$LINES,LINE,129,$SCODE,STRING,1,IH40,6,3 +193,$LINES,LINE,129,$SCODE,STRING,2,IH41,6,3 +193,$LINES,LINE,129,$SCODE,STRING,3,IK1,3,3 +4,ACHARE,AREA,3,CATACH,LIST,1,[5],2,1 +1,AIRARE,POINT,80,OBJNAM,STRING,1,Hachinohe Airfield,1,1 +7,BCNLAT,POINT,103,BCNSHP,BYTE,1,3,4,1 +7,BCNLAT,POINT,24,CATLAM,BYTE,1,2,15,1 +7,BCNLAT,POINT,60,COLMAR,BYTE,1,3,15,1 +7,BCNLAT,POINT,78,INFORM,STRING,1,Concrete,3,3 +7,BCNLAT,POINT,78,INFORM,STRING,2,Metal,2,3 +7,BCNLAT,POINT,78,INFORM,STRING,3,Metal|Framework tower,1,3 +7,BCNLAT,POINT,108,SORIND,STRING,1,"GB,UKHO,graph,LL M-6623",2,11 +7,BCNLAT,POINT,108,SORIND,STRING,2,"GB,UKHO,graph,LL M-6624.8",2,11 +7,BCNLAT,POINT,108,SORIND,STRING,3,"GB,UKHO,graph,LL M-6624.7",2,11 +7,BCNLAT,POINT,108,SORIND,STRING,4,"GB,UKHO,graph,LL M-6624",2,11 +7,BCNLAT,POINT,108,SORIND,STRING,5,"GB,UKHO,graph,LL M-6619",1,11 +7,BCNLAT,POINT,108,SORIND,STRING,6,"GB,MDHS,graph,LL F-6623",1,11 +7,BCNLAT,POINT,108,SORIND,STRING,7,"GB,MDHS,graph,LL F-6623.6",1,11 +7,BCNLAT,POINT,108,SORIND,STRING,8,"GB,MDHS,graph,LL F-6624.8",1,11 +7,BCNLAT,POINT,108,SORIND,STRING,9,"GB,MDHS,graph,LL F-6624.7",1,11 +7,BCNLAT,POINT,108,SORIND,STRING,10,"GB,MDHS,graph,LL F-6624",1,11 +7,BCNLAT,POINT,108,SORIND,STRING,11,"GB,UKHO,graph,LL M-6623.6",1,11 +7,BCNLAT,POINT,122,VERLEN,REAL,1,10,6,4 +7,BCNLAT,POINT,122,VERLEN,REAL,2,9,5,4 +7,BCNLAT,POINT,122,VERLEN,REAL,3,16,3,4 +7,BCNLAT,POINT,122,VERLEN,REAL,4,6,1,4 +9,BCNSPP,POINT,51,CATSPM,BYTE,1,6,4,2 +9,BCNSPP,POINT,51,CATSPM,BYTE,2,27,1,2 +9,BCNSPP,POINT,60,COLMAR,BYTE,1,5,2,1 +9,BCNSPP,POINT,78,INFORM,STRING,1,Metal,4,1 +9,BCNSPP,POINT,108,SORIND,STRING,1,"GB,UKHO,graph,LL M-6625",2,3 +9,BCNSPP,POINT,108,SORIND,STRING,2,"GB,UKHO,graph,LL M-6626",2,3 +9,BCNSPP,POINT,108,SORIND,STRING,3,"GB,UKHO,graph,LL M-6623.2",2,3 +9,BCNSPP,POINT,122,VERLEN,REAL,1,43,2,2 +9,BCNSPP,POINT,122,VERLEN,REAL,2,9,2,2 +20,BOYSPP,POINT,105,BOYSHP,BYTE,1,1,5,2 +20,BOYSPP,POINT,105,BOYSHP,BYTE,2,4,3,2 +20,BOYSPP,POINT,51,CATSPM,BYTE,1,27,3,3 +20,BOYSPP,POINT,51,CATSPM,BYTE,2,10,1,3 +20,BOYSPP,POINT,51,CATSPM,BYTE,3,13,1,3 +20,BOYSPP,POINT,60,COLMAR,BYTE,1,4,8,1 +20,BOYSPP,POINT,78,INFORM,STRING,1,Private mark|Wave recorder,1,1 +20,BOYSPP,POINT,109,STATUS,LIST,1,[8],6,1 +11,BRIDGE,AREA,4,CATBRG,LIST,1,[1],2,1 +11,BRIDGE,AREA,78,INFORM,STRING,1,Vertical Datum: Nearly highest high water|Vertical clearance 4.5m - 5.5m,2,2 +11,BRIDGE,AREA,78,INFORM,STRING,2,Vertical Datum: Nearly highest high water,1,2 +11,BRIDGE,AREA,80,OBJNAM,STRING,1,Hachinohe Bridge,1,7 +11,BRIDGE,AREA,80,OBJNAM,STRING,2,Hattaro Bridge,1,7 +11,BRIDGE,AREA,80,OBJNAM,STRING,3,The Numadate Bridge,1,7 +11,BRIDGE,AREA,80,OBJNAM,STRING,4,The Shin-O-Hashi Bridge,1,7 +11,BRIDGE,AREA,80,OBJNAM,STRING,5,Seagull Bridge,1,7 +11,BRIDGE,AREA,80,OBJNAM,STRING,6,Minato Bridge,1,7 +11,BRIDGE,AREA,80,OBJNAM,STRING,7,Ichikawa Bridge,1,7 +11,BRIDGE,AREA,117,VERCLR,REAL,1,4.5,2,3 +11,BRIDGE,AREA,117,VERCLR,REAL,2,31,2,3 +11,BRIDGE,AREA,117,VERCLR,REAL,3,5.30000019073486,1,3 +10,BRTFAC,POINT,80,OBJNAM,STRING,1,2,8,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,2,1,6,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,3,3,6,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,4,4,6,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,5,A,6,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,6,B,6,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,7,C,6,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,8,5,4,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,9,6,4,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,10,D,4,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,11,F,4,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,12,G,4,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,13,7,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,14,8,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,15,9,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,16,E,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,17,H,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,18,I,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,19,J,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,20,L,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,21,M,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,22,N,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,23,O,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,24,10,2,25 +10,BRTFAC,POINT,80,OBJNAM,STRING,25,P,1,25 +14,BUAARE,POINT,80,OBJNAM,STRING,1,Hachinohe,2,33 +14,BUAARE,POINT,80,OBJNAM,STRING,2,Hashimukai,2,33 +14,BUAARE,POINT,80,OBJNAM,STRING,3,Misawa,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,4,Same,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,5,Okuki,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,6,Minato,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,7,Mikawame,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,8,Shirahama,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,9,Hitokawame,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,10,Oirase Town,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,11,Tate,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,12,Osawa,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,13,Hinode,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,14,Toyosu,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,15,Hattaro,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,16,Hasunuma,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,17,Kawaragi,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,18,Kitanuma,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,19,Numadate,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,20,Sunamori,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,21,Tatehana,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,22,Uenoyama,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,23,Kami-Same,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,24,Hikagezawa,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,25,Shinminato,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,26,Uheikawara,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,27,Senzogakubo,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,28,Hamana-Yachi,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,29,Shimo-Oyachi,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,30,Minami-Oyachi,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,31,Toyama-Shinden,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,32,Shimo-Matsunaeba,1,33 +14,BUAARE,POINT,80,OBJNAM,STRING,33,Shimo-Mekurakubo,1,33 +14,BUAARE,AREA,80,OBJNAM,STRING,1,Hachinohe,1,2 +14,BUAARE,AREA,80,OBJNAM,STRING,2,Misawa,1,2 +12,BUIREL,POINT,41,CATREB,BYTE,1,6,2,3 +12,BUIREL,POINT,41,CATREB,BYTE,2,7,2,3 +12,BUIREL,POINT,41,CATREB,BYTE,3,4,1,3 +13,BUISGL,POINT,104,BUISHP,BYTE,1,4,1,1 +13,BUISGL,POINT,49,CATBUI,LIST,1,[6],5,5 +13,BUISGL,POINT,49,CATBUI,LIST,2,[2],1,5 +13,BUISGL,POINT,49,CATBUI,LIST,3,[3],1,5 +13,BUISGL,POINT,49,CATBUI,LIST,4,[17],1,5 +13,BUISGL,POINT,49,CATBUI,LIST,5,[5],1,5 +13,BUISGL,POINT,65,CONVIS,BYTE,1,2,2,1 +13,BUISGL,POINT,78,INFORM,STRING,1,Light support|Not in use,1,1 +13,BUISGL,POINT,80,OBJNAM,STRING,1,Tohoku Electric Power Thermal Power Plants,1,2 +13,BUISGL,POINT,80,OBJNAM,STRING,2,Japan Maritime Self Defense Force Air Base,1,2 +13,BUISGL,POINT,91,QUAPOS,BYTE,1,4,2,1 +13,BUISGL,AREA,49,CATBUI,LIST,1,[19],7,4 +13,BUISGL,AREA,49,CATBUI,LIST,2,[13],1,4 +13,BUISGL,AREA,49,CATBUI,LIST,3,"[3,2]",1,4 +13,BUISGL,AREA,49,CATBUI,LIST,4,[10],1,4 +13,BUISGL,AREA,78,INFORM,STRING,1,Port Management Office,1,7 +13,BUISGL,AREA,78,INFORM,STRING,2,Fisheries High School,1,7 +13,BUISGL,AREA,78,INFORM,STRING,3,Fishery Hall,1,7 +13,BUISGL,AREA,78,INFORM,STRING,4,Fisheries Laboratory,1,7 +13,BUISGL,AREA,78,INFORM,STRING,5,Coast Guard Office|Marine Procedure Commission Agent Office,1,7 +13,BUISGL,AREA,78,INFORM,STRING,6,Fishing Harbor Development Office,1,7 +13,BUISGL,AREA,78,INFORM,STRING,7,"Regional Development Bureau,Port And Airport Office",1,7 +13,BUISGL,AREA,80,OBJNAM,STRING,1,Tohoku Electric Power Electric Substation,1,7 +13,BUISGL,AREA,80,OBJNAM,STRING,2,No.1 Fish Market,1,7 +13,BUISGL,AREA,80,OBJNAM,STRING,3,No.2 Fish Market,1,7 +13,BUISGL,AREA,80,OBJNAM,STRING,4,No.3 Fish Market,1,7 +13,BUISGL,AREA,80,OBJNAM,STRING,5,Maritime Office,1,7 +13,BUISGL,AREA,80,OBJNAM,STRING,6,Construction Office,1,7 +13,BUISGL,AREA,80,OBJNAM,STRING,7,Fisherman's Union,1,7 +21,CBLOHD,LINE,6,CATCBL,BYTE,1,1,5,1 +21,CBLOHD,LINE,93,QUAVEM,BYTE,1,1,1,1 +21,CBLOHD,LINE,117,VERCLR,REAL,1,12,1,1 +22,CBLSUB,LINE,6,CATCBL,BYTE,1,1,2,1 +22,CBLSUB,LINE,109,STATUS,LIST,1,[4],3,1 +33,CHIMNY,POINT,59,COLOUR,LIST,1,"[3,1]",2,1 +33,CHIMNY,POINT,65,CONVIS,BYTE,1,2,8,2 +33,CHIMNY,POINT,65,CONVIS,BYTE,2,1,1,2 +33,CHIMNY,POINT,73,HEIGHT,REAL,1,123,2,7 +33,CHIMNY,POINT,73,HEIGHT,REAL,2,30,2,7 +33,CHIMNY,POINT,73,HEIGHT,REAL,3,27,1,7 +33,CHIMNY,POINT,73,HEIGHT,REAL,4,81,1,7 +33,CHIMNY,POINT,73,HEIGHT,REAL,5,40,1,7 +33,CHIMNY,POINT,73,HEIGHT,REAL,6,71,1,7 +33,CHIMNY,POINT,73,HEIGHT,REAL,7,82,1,7 +33,CHIMNY,POINT,78,INFORM,STRING,1,3 CHYS,1,1 +35,COALNE,LINE,147,CATCOA,BYTE,1,1,8,1 +36,CONZNE,AREA,78,INFORM,STRING,1,"Jeppesen adopts ""International Boundaries and National Limits"" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.",2,1 +36,CONZNE,AREA,81,NATION,STRING,1,JP,2,1 +36,CONZNE,AREA,108,SORIND,STRING,1,"CM,PAD,graph,B3900420",1,1 +39,CRANES,POINT,10,CATCRN,BYTE,1,4,9,2 +39,CRANES,POINT,10,CATCRN,BYTE,2,2,2,2 +29,CTNARE,POINT,78,INFORM,STRING,1,Works in progress|Source date: 2005,2,12 +29,CTNARE,POINT,78,INFORM,STRING,2,FOUL,1,12 +29,CTNARE,POINT,78,INFORM,STRING,3,Marked by buoys,1,12 +29,CTNARE,POINT,78,INFORM,STRING,4,(liable to shoal),1,12 +29,CTNARE,POINT,78,INFORM,STRING,5,WORKS IN PROGRESS (1998),1,12 +29,CTNARE,POINT,78,INFORM,STRING,6,Works in progress|Source date: 2000,1,12 +29,CTNARE,POINT,78,INFORM,STRING,7,Works in progress|Source date: 2002,1,12 +29,CTNARE,POINT,78,INFORM,STRING,8,Ebb stream|Orientation: 130 Deg|Current velocity: 0.2kn,1,12 +29,CTNARE,POINT,78,INFORM,STRING,9,Flood stream|Orientation: 290 Deg|Current velocity: 0.3kn,1,12 +29,CTNARE,POINT,78,INFORM,STRING,10,Slipway,1,12 +29,CTNARE,POINT,78,INFORM,STRING,11,Ebb stream|Orientation: 133 Deg|Current velocity: 0.3kn,1,12 +29,CTNARE,POINT,78,INFORM,STRING,12,Flood stream|Orientation: 299 Deg|Current velocity: 0.3kn,1,12 +29,CTNARE,AREA,78,INFORM,STRING,1,Caisson Temporary Storage Area,3,12 +29,CTNARE,AREA,78,INFORM,STRING,2,"The contents of the charts affected by earthquakes etc. occured offshore Pacific Ocean in Tohoku region in Japan.|By earthquakes and tsunami occured offshore Pacific Ocean in Tohoku region in Japan on 11th March 2011, damages of breakwaters, quays, etc. and existance of foul bottoms (i.e. houses and vehicles) on the seafloor which were pushed and flowed from land area in the east coast of Honshu and each ports and harbours. Users are aware that contents of the charts may be different from existing situations. Notices to Mariners about these matters will be issued as soon as survey results are received.Notices to Mariners address http://www1.kaiho.mlit.go.jp/TUHO/tuho_db/tuhoserch.html",2,12 +29,CTNARE,AREA,78,INFORM,STRING,3,Unassessed. Surveys before the earthquake (11th Mar. 2011),2,12 +29,CTNARE,AREA,78,INFORM,STRING,4,"Caution|Undiscovered shoals may exist around charted shoals. Mariners are advised to exercise caution.|Caution|Only the principal lights are shown on this chart. For the details of these and other lights, the larger scale charts and the List of Lights should be consulted.|Note|The straight baselines and the limits of the territorial sea shown on this chart are based on the provisions of Japanese Law No.30 of 1977 on the Territorial Sea and the Contiguous Zone and the Enforcement Order No.210 of 1977 of Japanese Law No.30 of 1977 on the Territorial Sea and the Contiguous Zone.|Note|Owing to scale, only major points of the straight baselines given in the Enforcement Order are shown.|Caution|As submarine cables are not shown on this chart, take care with regard to the fishing industry, submarine exploration etc. For submarine cable information, refer to JP charts with scales of larger than 1:750,000 or the JP chart with scale 1:3,500,000.",1,12 +29,CTNARE,AREA,78,INFORM,STRING,5,Jeppesen digital nautical charts do not reflect all soundings present on the official paper charts published by Japan Hydrographic and Oceanographic Department. This product is not an Electronic Navigational Chart. Mariners are required to use official paper charts for navigational judgements.,1,12 +29,CTNARE,AREA,78,INFORM,STRING,6,"CAUTION|As undiscovered shoals may exist around charted shoals, mariners are warned to excercise cautions.|NOTE|The straight baselines and the limits of the territorial sea shown on this chart are based on the provisions of the Law No.30 of 1977 on the Territorial Sea and the Contiguous Zone and the Enforcement Order No.210 of 1977 of the Law No.30 of 1977 on the Territorial Sea and the Contiguous Zone.|NOTE|Of all the base points of the straight baselines given in the Enforcement Order, only major points are shown on this chart due to its small scale.",1,12 +29,CTNARE,AREA,78,INFORM,STRING,7,"CABLES|1. Submarine and overhead cables may conduct high voltages; contact with or proximity to these poses an extreme danger and mariners may risk prosecution if damage is caused.|2. Anchoring or trawling in the vicinity of submarine cables should be avoided. Seabed mobility may leave a cable spanning undulations and cause fishing gear to become irrecoverably snagged, putting a vessel in severe danger. If a cable is snagged, care must be taken not to sever it.|3. Sufficient clearance must be allowed under overhead cables.|4. Some cables, particularly those installed since this edition was published, may not be charted.|5. For further information, see The Mariner's Handbook.",1,12 +29,CTNARE,AREA,78,INFORM,STRING,8,Dredged to 7.5m|Source date: 1994,1,12 +29,CTNARE,AREA,78,INFORM,STRING,9,Caution|Undiscovered shoals may exist around charted shoals. Mariners are advised to exercise caution. |Caution|Depths are very changeable at the entrance to river mouths. Mariners are advised to exercise caution.,1,12 +29,CTNARE,AREA,78,INFORM,STRING,10,Section 3,1,12 +29,CTNARE,AREA,78,INFORM,STRING,11,Section 2,1,12 +29,CTNARE,AREA,78,INFORM,STRING,12,Section 1,1,12 +38,CTRPNT,POINT,9,CATCTR,BYTE,1,1,4,2 +38,CTRPNT,POINT,9,CATCTR,BYTE,2,4,2,2 +38,CTRPNT,POINT,80,OBJNAM,STRING,1,Monomiiwa,1,1 +44,DEPARE,AREA,66,DRVAL1,REAL,1,2,188,7 +44,DEPARE,AREA,66,DRVAL1,REAL,2,0,117,7 +44,DEPARE,AREA,66,DRVAL1,REAL,3,5,81,7 +44,DEPARE,AREA,66,DRVAL1,REAL,4,10,18,7 +44,DEPARE,AREA,66,DRVAL1,REAL,5,20,5,7 +44,DEPARE,AREA,66,DRVAL1,REAL,6,200,4,7 +44,DEPARE,AREA,66,DRVAL1,REAL,7,30,1,7 +44,DEPARE,AREA,67,DRVAL2,REAL,1,5,203,8 +44,DEPARE,AREA,67,DRVAL2,REAL,2,2,96,8 +44,DEPARE,AREA,67,DRVAL2,REAL,3,10,84,8 +44,DEPARE,AREA,67,DRVAL2,REAL,4,20,18,8 +44,DEPARE,AREA,67,DRVAL2,REAL,5,200,4,8 +44,DEPARE,AREA,67,DRVAL2,REAL,6,50,4,8 +44,DEPARE,AREA,67,DRVAL2,REAL,7,30,1,8 +44,DEPARE,AREA,67,DRVAL2,REAL,8,2000,1,8 +45,DEPCNT,LINE,91,QUAPOS,BYTE,1,4,1,1 +45,DEPCNT,LINE,113,VALDCO,REAL,1,5,230,6 +45,DEPCNT,LINE,113,VALDCO,REAL,2,2,102,6 +45,DEPCNT,LINE,113,VALDCO,REAL,3,10,100,6 +45,DEPCNT,LINE,113,VALDCO,REAL,4,20,14,6 +45,DEPCNT,LINE,113,VALDCO,REAL,5,200,4,6 +45,DEPCNT,LINE,113,VALDCO,REAL,6,30,1,6 +50,DRGARE,AREA,66,DRVAL1,REAL,1,7.5,5,6 +50,DRGARE,AREA,66,DRVAL1,REAL,2,13,4,6 +50,DRGARE,AREA,66,DRVAL1,REAL,3,14,1,6 +50,DRGARE,AREA,66,DRVAL1,REAL,4,12,1,6 +50,DRGARE,AREA,66,DRVAL1,REAL,5,9.59999942779541,1,6 +50,DRGARE,AREA,66,DRVAL1,REAL,6,10,1,6 +50,DRGARE,AREA,78,INFORM,STRING,1,(1981-2000),4,7 +50,DRGARE,AREA,78,INFORM,STRING,2,Source date: 1990,2,7 +50,DRGARE,AREA,78,INFORM,STRING,3,(1995-2000),1,7 +50,DRGARE,AREA,78,INFORM,STRING,4,Source date: 1991,1,7 +50,DRGARE,AREA,78,INFORM,STRING,5,1980,1,7 +50,DRGARE,AREA,78,INFORM,STRING,6,1994,1,7 +50,DRGARE,AREA,78,INFORM,STRING,7,Source date: 1977,1,7 +56,EXEZNE,AREA,78,INFORM,STRING,1,"Jeppesen adopts ""International Boundaries and National Limits"" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.",2,1 +56,EXEZNE,AREA,81,NATION,STRING,1,JP,2,1 +56,EXEZNE,AREA,108,SORIND,STRING,1,"CM,PAD,graph,B3900420",1,1 +57,FAIRWY,AREA,80,OBJNAM,STRING,1,East Fairway,1,4 +57,FAIRWY,AREA,80,OBJNAM,STRING,2,West Fairway,1,4 +57,FAIRWY,AREA,80,OBJNAM,STRING,3,East Passage,1,4 +57,FAIRWY,AREA,80,OBJNAM,STRING,4,West Passage,1,4 +60,FSHHAV,POINT,78,INFORM,STRING,1,Always under water/submerged,18,1 +72,HRBARE,AREA,80,OBJNAM,STRING,1,No 3 Area,1,3 +72,HRBARE,AREA,80,OBJNAM,STRING,2,No 2 Area,1,3 +72,HRBARE,AREA,80,OBJNAM,STRING,3,No1 Area,1,3 +73,HRBFAC,POINT,80,OBJNAM,STRING,1,Tohoku Grain Terminal,1,1 +73,HRBFAC,AREA,20,CATHAF,LIST,1,[9],1,1 +78,ITDARE,AREA,82,NATSUR,LIST,1,[9],25,4 +78,ITDARE,AREA,82,NATSUR,LIST,2,[56],5,4 +78,ITDARE,AREA,82,NATSUR,LIST,3,[1],4,4 +78,ITDARE,AREA,82,NATSUR,LIST,4,[4],4,4 +79,LAKARE,AREA,80,OBJNAM,STRING,1,Ane Lake,1,1 +86,LIGHTS,POINT,25,CATLIT,BYTE,1,5,5,4 +86,LIGHTS,POINT,25,CATLIT,BYTE,2,8,2,4 +86,LIGHTS,POINT,25,CATLIT,BYTE,3,6,1,4 +86,LIGHTS,POINT,25,CATLIT,BYTE,4,11,1,4 +86,LIGHTS,POINT,59,COLOUR,LIST,1,[6],28,6 +86,LIGHTS,POINT,59,COLOUR,LIST,2,[4],23,6 +86,LIGHTS,POINT,59,COLOUR,LIST,3,[3],23,6 +86,LIGHTS,POINT,59,COLOUR,LIST,4,[1],15,6 +86,LIGHTS,POINT,59,COLOUR,LIST,5,"[1,1,4]",2,6 +86,LIGHTS,POINT,59,COLOUR,LIST,6,"[1,4]",2,6 +86,LIGHTS,POINT,73,HEIGHT,REAL,1,12,10,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,2,14,6,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,3,57,4,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,4,11,4,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,5,5,4,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,6,9,3,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,7,17,3,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,8,22,3,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,9,69,2,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,10,79,2,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,11,7,2,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,12,16,2,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,13,4,2,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,14,8,1,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,15,31,1,16 +86,LIGHTS,POINT,73,HEIGHT,REAL,16,10,1,16 +86,LIGHTS,POINT,78,INFORM,STRING,1,2 fl in 3s,4,5 +86,LIGHTS,POINT,78,INFORM,STRING,2,The white light can be apparent on 8M,2,5 +86,LIGHTS,POINT,78,INFORM,STRING,3,Illuminates Hinode Iwa 430m NNW,2,5 +86,LIGHTS,POINT,78,INFORM,STRING,4,FW spotlight illuminates Hinode Iwa.,1,5 +86,LIGHTS,POINT,78,INFORM,STRING,5,More than one,1,5 +86,LIGHTS,POINT,58,LITCHR,BYTE,1,2,35,4 +86,LIGHTS,POINT,58,LITCHR,BYTE,2,7,13,4 +86,LIGHTS,POINT,58,LITCHR,BYTE,3,1,6,4 +86,LIGHTS,POINT,58,LITCHR,BYTE,4,19,4,4 +86,LIGHTS,POINT,80,OBJNAM,STRING,1,C1,2,6 +86,LIGHTS,POINT,80,OBJNAM,STRING,2,C2,1,6 +86,LIGHTS,POINT,80,OBJNAM,STRING,3,R1,1,6 +86,LIGHTS,POINT,80,OBJNAM,STRING,4,R2,1,6 +86,LIGHTS,POINT,80,OBJNAM,STRING,5,L1,1,6 +86,LIGHTS,POINT,80,OBJNAM,STRING,6,L2,1,6 +86,LIGHTS,POINT,93,QUAVEM,BYTE,1,1,12,1 +86,LIGHTS,POINT,100,SECTR1,WORD10,1,228,3,2 +86,LIGHTS,POINT,100,SECTR1,WORD10,2,48,3,2 +86,LIGHTS,POINT,101,SECTR2,WORD10,1,48,3,2 +86,LIGHTS,POINT,101,SECTR2,WORD10,2,228,3,2 +86,LIGHTS,POINT,72,SIGGRP,STRING,1,(1),38,2 +86,LIGHTS,POINT,72,SIGGRP,STRING,2,(2),14,2 +86,LIGHTS,POINT,86,SIGPER,WORD10,1,3,10,7 +86,LIGHTS,POINT,86,SIGPER,WORD10,2,6,10,7 +86,LIGHTS,POINT,86,SIGPER,WORD10,3,4,7,7 +86,LIGHTS,POINT,86,SIGPER,WORD10,4,9,6,7 +86,LIGHTS,POINT,86,SIGPER,WORD10,5,5,5,7 +86,LIGHTS,POINT,86,SIGPER,WORD10,6,10,4,7 +86,LIGHTS,POINT,86,SIGPER,WORD10,7,8,4,7 +86,LIGHTS,POINT,108,SORIND,STRING,1,"GB,MDHS,graph,LL F-6624.7.C",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,2,"GB,MDHS,graph,LL F-6624.7.D",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,3,"GB,MDHS,graph,LL F-6624.7.E",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,4,"GB,MDHS,graph,LL F-6624.7.F",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,5,"GB,MDHS,graph,LL F-6624.7.A",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,6,"GB,MDHS,graph,LL F-6624.7.B",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,7,"GB,MDHS,graph,LL F-6623.2.A",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,8,"GB,UKHO,graph,LL M-6624.62",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,9,"GB,UKHO,graph,LL M-6624.621",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,10,"GB,UKHO,graph,LL M-6624.64",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,11,"GB,UKHO,graph,LL M-6624.641",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,12,"GB,UKHO,graph,LL M-6624.63",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,13,"GB,UKHO,graph,LL M-6624.631",1,14 +86,LIGHTS,POINT,108,SORIND,STRING,14,"GB,UKHO,graph,LL M-6624.5",1,14 +86,LIGHTS,POINT,109,STATUS,LIST,1,[8],26,1 +86,LIGHTS,POINT,115,VALNMR,WORD10,1,4,16,7 +86,LIGHTS,POINT,115,VALNMR,WORD10,2,6,7,7 +86,LIGHTS,POINT,115,VALNMR,WORD10,3,3,7,7 +86,LIGHTS,POINT,115,VALNMR,WORD10,4,5,7,7 +86,LIGHTS,POINT,115,VALNMR,WORD10,5,19,4,7 +86,LIGHTS,POINT,115,VALNMR,WORD10,6,7,3,7 +86,LIGHTS,POINT,115,VALNMR,WORD10,7,2,1,7 +81,LNDARE,AREA,80,OBJNAM,STRING,1,Honshu,1,3 +81,LNDARE,AREA,80,OBJNAM,STRING,2,Todo Shima,1,3 +81,LNDARE,AREA,80,OBJNAM,STRING,3,Hinode Iwa,1,3 +95,MONUMT,POINT,65,CONVIS,BYTE,1,2,2,1 +96,MORFAC,POINT,29,CATMOR,BYTE,1,1,7,1 +96,MORFAC,POINT,78,INFORM,STRING,1,Always dry,1,1 +96,MORFAC,AREA,29,CATMOR,BYTE,1,1,2,1 +96,MORFAC,AREA,78,INFORM,STRING,1,Always dry,2,1 +210,M_PROD,AREA,150,CPDATE,STRING,1,20080102,2,5 +210,M_PROD,AREA,150,CPDATE,STRING,2,20060322,2,5 +210,M_PROD,AREA,150,CPDATE,STRING,3,20141006,1,5 +210,M_PROD,AREA,150,CPDATE,STRING,4,20140602,1,5 +210,M_PROD,AREA,150,CPDATE,STRING,5,20140505,1,5 +97,NATARE,AREA,78,INFORM,STRING,1,"Jeppesen adopts ""International Boundaries and National Limits"" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.",3,1 +97,NATARE,AREA,81,NATION,STRING,1,JP,3,1 +99,OBSTRN,POINT,69,EXPSOU,BYTE,1,2,1,1 +99,OBSTRN,POINT,78,INFORM,STRING,1,Wave Meter,2,1 +99,OBSTRN,POINT,116,VALSOU,WORD10,1,25,2,4 +99,OBSTRN,POINT,116,VALSOU,WORD10,2,1.5,2,4 +99,OBSTRN,POINT,116,VALSOU,WORD10,3,1.2,1,4 +99,OBSTRN,POINT,116,VALSOU,WORD10,4,4.9,1,4 +99,OBSTRN,POINT,124,WATLEV,BYTE,1,3,6,1 +99,OBSTRN,AREA,78,INFORM,STRING,1,Crib|Caissons,2,2 +99,OBSTRN,AREA,78,INFORM,STRING,2,Crib|Caisson Area,1,2 +99,OBSTRN,AREA,116,VALSOU,WORD10,1,4.9,1,3 +99,OBSTRN,AREA,116,VALSOU,WORD10,2,1.2,1,3 +99,OBSTRN,AREA,116,VALSOU,WORD10,3,1.5,1,3 +99,OBSTRN,AREA,124,WATLEV,BYTE,1,3,70,1 +103,PILPNT,POINT,78,INFORM,STRING,1,Always dry,8,2 +103,PILPNT,POINT,78,INFORM,STRING,2,Private,1,2 +107,PIPSOL,LINE,35,CATPIP,BYTE,1,1,2,1 +107,PIPSOL,LINE,78,INFORM,STRING,1,"PIPELINES|Mariners are advised not to anchor or trawl in the vicinity of pipelines. Gas from a damaged oil or gas pipeline could cause an explosion, loss of a vessels buoyancy or other serious hazard. Pipelines are not always buried and may effectively reduce the charted depth by up to 2 metres. They may also span seabed undulations and cause fishing gear to become irrecoverably snagged, putting a vessel in severe danger. See Annual Notice to Mariners No 24 and The Mariners Handbook.",1,1 +107,PIPSOL,LINE,89,PRODCT,LIST,1,[1],1,2 +107,PIPSOL,LINE,89,PRODCT,LIST,2,[2],1,2 +111,PRDINS,POINT,78,INFORM,STRING,1,Production area,12,1 +111,PRDINS,POINT,80,OBJNAM,STRING,1,"Pacific Metals CO., LTD.",2,11 +111,PRDINS,POINT,80,OBJNAM,STRING,2,"Tozai Oilterminal Co.,Ltd.",1,11 +111,PRDINS,POINT,80,OBJNAM,STRING,3,Tohoku Satetsu,1,11 +111,PRDINS,POINT,80,OBJNAM,STRING,4,"MRC Unitec Co., Ltd.",1,11 +111,PRDINS,POINT,80,OBJNAM,STRING,5,Toshin Steel Industry,1,11 +111,PRDINS,POINT,80,OBJNAM,STRING,6,"Hachinohe Gas Co., Ltd.",1,11 +111,PRDINS,POINT,80,OBJNAM,STRING,7,"Koshuha Foundry Co., Ltd.",1,11 +111,PRDINS,POINT,80,OBJNAM,STRING,8,"Sumimetal Mining Co., Ltd.",1,11 +111,PRDINS,POINT,80,OBJNAM,STRING,9,"Hachinohe Smelting Co., Ltd.",1,11 +111,PRDINS,POINT,80,OBJNAM,STRING,10,"Kitanihon Shipbuilding Co., Ltd.",1,11 +111,PRDINS,POINT,80,OBJNAM,STRING,11,JX Nippon Oil & Energy Corporation,1,11 +111,PRDINS,POINT,89,PRODCT,LIST,1,[1],1,2 +111,PRDINS,POINT,89,PRODCT,LIST,2,[2],1,2 +111,PRDINS,POINT,91,QUAPOS,BYTE,1,4,11,1 +111,PRDINS,AREA,78,INFORM,STRING,1,Tank farm,9,4 +111,PRDINS,AREA,78,INFORM,STRING,2,Production area,3,4 +111,PRDINS,AREA,78,INFORM,STRING,3,Production area|Silo farm,2,4 +111,PRDINS,AREA,78,INFORM,STRING,4,Tank farm|Oil Tank Yard,1,4 +111,PRDINS,AREA,80,OBJNAM,STRING,1,Mitsubishi Paper Mills Limited,1,3 +111,PRDINS,AREA,80,OBJNAM,STRING,2,"Tokyotekko Co., Ltd.",1,3 +111,PRDINS,AREA,80,OBJNAM,STRING,3,Yoshida Sangyo Corporation,1,3 +111,PRDINS,AREA,89,PRODCT,LIST,1,[1],1,1 +112,PYLONS,POINT,78,INFORM,STRING,1,Power transmission pylon/pole,2,1 +129,RIVERS,AREA,80,OBJNAM,STRING,1,Mabechi River,1,3 +129,RIVERS,AREA,80,OBJNAM,STRING,2,Oirase River,1,3 +129,RIVERS,AREA,80,OBJNAM,STRING,3,Gonohe Kawa,1,3 +118,RTPBCN,POINT,38,CATRTB,BYTE,1,1,1,1 +118,RTPBCN,POINT,108,SORIND,STRING,1,"GB,MDHS,graph,LL F-6620.A",1,1 +138,SBDARE,POINT,90,NATQUA,LIST,1,[1],144,2 +138,SBDARE,POINT,90,NATQUA,LIST,2,[3],1,2 +138,SBDARE,POINT,82,NATSUR,LIST,1,[4],176,11 +138,SBDARE,POINT,82,NATSUR,LIST,2,[1],54,11 +138,SBDARE,POINT,82,NATSUR,LIST,3,[9],15,11 +138,SBDARE,POINT,82,NATSUR,LIST,4,[5],14,11 +138,SBDARE,POINT,82,NATSUR,LIST,5,"[4,17]",9,11 +138,SBDARE,POINT,82,NATSUR,LIST,6,"[1,4]",8,11 +138,SBDARE,POINT,82,NATSUR,LIST,7,"[4,1]",7,11 +138,SBDARE,POINT,82,NATSUR,LIST,8,"[6,17,61]",1,11 +138,SBDARE,POINT,82,NATSUR,LIST,9,"[1,4,17]",1,11 +138,SBDARE,POINT,82,NATSUR,LIST,10,"[1,6]",1,11 +138,SBDARE,POINT,82,NATSUR,LIST,11,"[1,4,5]",1,11 +138,SBDARE,AREA,82,NATSUR,LIST,1,[9],5,3 +138,SBDARE,AREA,82,NATSUR,LIST,2,[4],3,3 +138,SBDARE,AREA,82,NATSUR,LIST,3,[5],1,3 +136,SEAARE,AREA,80,OBJNAM,STRING,1,North Pacific Ocean,1,2 +136,SEAARE,AREA,80,OBJNAM,STRING,2,Hamanaka,1,2 +142,SILBUI,POINT,78,INFORM,STRING,1,More than one,1,3 +142,SILBUI,POINT,78,INFORM,STRING,2,more than one,1,3 +142,SILBUI,POINT,78,INFORM,STRING,3,SILOS,1,3 +142,SILBUI,POINT,91,QUAPOS,BYTE,1,4,2,1 +140,SISTAT,POINT,47,CATSIT,LIST,1,[2],2,1 +141,SISTAW,POINT,48,CATSIW,LIST,1,[10],1,1 +139,SLCONS,LINE,46,CATSLC,BYTE,1,6,3,1 +139,SLCONS,LINE,63,CONDTN,BYTE,1,2,5,1 +139,SLCONS,LINE,78,INFORM,STRING,1,Land Area,2,1 +139,SLCONS,LINE,80,OBJNAM,STRING,1,No 3,1,3 +139,SLCONS,LINE,80,OBJNAM,STRING,2,Kawaragi No 1,1,3 +139,SLCONS,LINE,80,OBJNAM,STRING,3,Kawaragi No 2,1,3 +139,SLCONS,LINE,124,WATLEV,BYTE,1,2,204,1 +139,SLCONS,AREA,46,CATSLC,BYTE,1,1,34,3 +139,SLCONS,AREA,46,CATSLC,BYTE,2,6,10,3 +139,SLCONS,AREA,46,CATSLC,BYTE,3,4,4,3 +139,SLCONS,AREA,63,CONDTN,BYTE,1,2,8,2 +139,SLCONS,AREA,63,CONDTN,BYTE,2,3,1,2 +139,SLCONS,AREA,78,INFORM,STRING,1,Source date: 2005,1,1 +139,SLCONS,AREA,83,NATCON,LIST,1,[3],78,1 +139,SLCONS,AREA,80,OBJNAM,STRING,1,Hattaro North Breakwater,3,25 +139,SLCONS,AREA,80,OBJNAM,STRING,2,Middle Breakwater,2,25 +139,SLCONS,AREA,80,OBJNAM,STRING,3,Hattaro East Breakwater,2,25 +139,SLCONS,AREA,80,OBJNAM,STRING,4,West Breakwater,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,5,Grain Terminal,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,6,No 4 Wharf,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,7,No 3 Wharf,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,8,No 1 Wharf,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,9,No 2 Wharf,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,10,Kawaragi No 2 Wharf,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,11,No 2 Middle Breakwater,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,12,Shirogane West Breakwater,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,13,Japan Maritime Self Defense Force Quay,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,14,Ichikawa East Breakwater,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,15,Shirogane North Breakwater,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,16,Grain Terminal Pier,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,17,Ichikawa North Breakwater,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,18,Ferry Wharf,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,19,Mitsubishi Paper Mills Limited Quay,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,20,Kabu Island Breakwater,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,21,Shirogane Wharf,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,22,Kawaragi South Breakwater,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,23,Kawaragi West Breakwater,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,24,Hachinohe Smelting Quay,1,25 +139,SLCONS,AREA,80,OBJNAM,STRING,25,Kawaragi Breakwater,1,25 +139,SLCONS,AREA,124,WATLEV,BYTE,1,2,100,3 +139,SLCONS,AREA,124,WATLEV,BYTE,2,4,9,3 +139,SLCONS,AREA,124,WATLEV,BYTE,3,3,1,3 +143,SLIPWY,AREA,80,OBJNAM,STRING,1,Ichikawa Slipway,1,1 +143,SLIPWY,AREA,124,WATLEV,BYTE,1,4,2,2 +143,SLIPWY,AREA,124,WATLEV,BYTE,2,2,1,2 +155,TESARE,AREA,78,INFORM,STRING,1,"Jeppesen adopts ""International Boundaries and National Limits"" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation.",3,1 +155,TESARE,AREA,81,NATION,STRING,1,JP,3,1 +158,TOWERS,POINT,52,CATTOW,BYTE,1,1,22,3 +158,TOWERS,POINT,52,CATTOW,BYTE,2,3,19,3 +158,TOWERS,POINT,52,CATTOW,BYTE,3,2,10,3 +158,TOWERS,POINT,59,COLOUR,LIST,1,[1],22,1 +158,TOWERS,POINT,65,CONVIS,BYTE,1,1,23,2 +158,TOWERS,POINT,65,CONVIS,BYTE,2,2,4,2 +158,TOWERS,POINT,73,HEIGHT,REAL,1,51,1,2 +158,TOWERS,POINT,73,HEIGHT,REAL,2,53,1,2 +158,TOWERS,POINT,78,INFORM,STRING,1,Radio,4,3 +158,TOWERS,POINT,78,INFORM,STRING,2,Ice Supply Tower,2,3 +158,TOWERS,POINT,78,INFORM,STRING,3,Framework tower,1,3 +158,TOWERS,POINT,83,NATCON,LIST,1,[2],12,1 +158,TOWERS,POINT,91,QUAPOS,BYTE,1,4,6,1 +158,TOWERS,POINT,108,SORIND,STRING,1,"GB,UKHO,graph,LL M-6620",3,17 +158,TOWERS,POINT,108,SORIND,STRING,2,"GB,UKHO,graph,LL M-6621",2,17 +158,TOWERS,POINT,108,SORIND,STRING,3,"GB,UKHO,graph,LL M-6625.5",2,17 +158,TOWERS,POINT,108,SORIND,STRING,4,"GB,UKHO,graph,LL M-6624.86",2,17 +158,TOWERS,POINT,108,SORIND,STRING,5,"GB,UKHO,graph,LL M-6619.5",1,17 +158,TOWERS,POINT,108,SORIND,STRING,6,"GB,UKHO,graph,LL M-6618.4",1,17 +158,TOWERS,POINT,108,SORIND,STRING,7,"GB,UKHO,graph,LL M-6625.7",1,17 +158,TOWERS,POINT,108,SORIND,STRING,8,"GB,UKHO,graph,LL M-6624.85",1,17 +158,TOWERS,POINT,108,SORIND,STRING,9,"GB,MDHS,graph,LL F-6623.2",1,17 +158,TOWERS,POINT,108,SORIND,STRING,10,"GB,MDHS,graph,LL F-6621",1,17 +158,TOWERS,POINT,108,SORIND,STRING,11,"GB,MDHS,graph,LL F-6622",1,17 +158,TOWERS,POINT,108,SORIND,STRING,12,"GB,MDHS,graph,LL F-6625.5",1,17 +158,TOWERS,POINT,108,SORIND,STRING,13,"GB,MDHS,graph,LL F-6620",1,17 +158,TOWERS,POINT,108,SORIND,STRING,14,"GB,MDHS,graph,LL F-6624.4",1,17 +158,TOWERS,POINT,108,SORIND,STRING,15,"GB,MDHS,graph,LL F-6624.85",1,17 +158,TOWERS,POINT,108,SORIND,STRING,16,"GB,UKHO,graph,LL M-6622",1,17 +158,TOWERS,POINT,108,SORIND,STRING,17,"GB,UKHO,graph,LL M-6624.4",1,17 +158,TOWERS,POINT,122,VERLEN,REAL,1,9,7,7 +158,TOWERS,POINT,122,VERLEN,REAL,2,23,4,7 +158,TOWERS,POINT,122,VERLEN,REAL,3,10,4,7 +158,TOWERS,POINT,122,VERLEN,REAL,4,5,3,7 +158,TOWERS,POINT,122,VERLEN,REAL,5,16,2,7 +158,TOWERS,POINT,122,VERLEN,REAL,6,6,1,7 +158,TOWERS,POINT,122,VERLEN,REAL,7,8,1,7 +168,UWTROC,POINT,69,EXPSOU,BYTE,1,2,3,1 +168,UWTROC,POINT,116,VALSOU,WORD10,1,15,5,69 +168,UWTROC,POINT,116,VALSOU,WORD10,2,9.9,4,69 +168,UWTROC,POINT,116,VALSOU,WORD10,3,2.6,4,69 +168,UWTROC,POINT,116,VALSOU,WORD10,4,4.4,4,69 +168,UWTROC,POINT,116,VALSOU,WORD10,5,2,4,69 +168,UWTROC,POINT,116,VALSOU,WORD10,6,17,3,69 +168,UWTROC,POINT,116,VALSOU,WORD10,7,18,3,69 +168,UWTROC,POINT,116,VALSOU,WORD10,8,19,3,69 +168,UWTROC,POINT,116,VALSOU,WORD10,9,21,3,69 +168,UWTROC,POINT,116,VALSOU,WORD10,10,0.3,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,11,1.7,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,12,2.2,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,13,4.1,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,14,0.7,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,15,2.3,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,16,7.7,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,17,7.8,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,18,8.8,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,19,16,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,20,20,2,69 +168,UWTROC,POINT,116,VALSOU,WORD10,21,0.5,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,22,0.8,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,23,1.4,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,24,1.6,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,25,2.5,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,26,2.7,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,27,3.1,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,28,4,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,29,4.7,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,30,4.8,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,31,5.7,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,32,5.9,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,33,6.2,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,34,6.3,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,35,6.5,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,36,6.8,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,37,6.9,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,38,7,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,39,7.3,1,69 +168,UWTROC,POINT,116,VALSOU,WORD10,40,7.4,1,69 +168,UWTROC,POINT,124,WATLEV,BYTE,1,3,110,3 +168,UWTROC,POINT,124,WATLEV,BYTE,2,2,56,3 +168,UWTROC,POINT,124,WATLEV,BYTE,3,4,10,3 +176,WRECKS,POINT,57,CATWRK,BYTE,1,3,477,2 +176,WRECKS,POINT,57,CATWRK,BYTE,2,2,2,2 +176,WRECKS,POINT,116,VALSOU,WORD10,1,11.2,7,103 +176,WRECKS,POINT,116,VALSOU,WORD10,2,12.2,5,103 +176,WRECKS,POINT,116,VALSOU,WORD10,3,12.6,5,103 +176,WRECKS,POINT,116,VALSOU,WORD10,4,9.6,4,103 +176,WRECKS,POINT,116,VALSOU,WORD10,5,10.2,4,103 +176,WRECKS,POINT,116,VALSOU,WORD10,6,11.1,4,103 +176,WRECKS,POINT,116,VALSOU,WORD10,7,12,4,103 +176,WRECKS,POINT,116,VALSOU,WORD10,8,12.5,4,103 +176,WRECKS,POINT,116,VALSOU,WORD10,9,6.3,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,10,7,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,11,7.3,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,12,8.3,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,13,9,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,14,9.5,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,15,11.4,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,16,11.9,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,17,12.3,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,18,12.7,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,19,13,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,20,13.1,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,21,13.4,3,103 +176,WRECKS,POINT,116,VALSOU,WORD10,22,23.5,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,23,21.5,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,24,3,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,25,3.7,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,26,4.3,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,27,5,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,28,5.1,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,29,5.7,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,30,6,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,31,6.2,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,32,6.9,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,33,7.8,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,34,8.1,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,35,8.5,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,36,8.7,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,37,9.1,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,38,9.4,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,39,9.9,2,103 +176,WRECKS,POINT,116,VALSOU,WORD10,40,10.3,2,103 +176,WRECKS,POINT,124,WATLEV,BYTE,1,3,480,1 +176,WRECKS,AREA,57,CATWRK,BYTE,1,2,1,1 +176,WRECKS,AREA,116,VALSOU,WORD10,1,7,1,1 +176,WRECKS,AREA,124,WATLEV,BYTE,1,3,1,1 +201,_extgn,POINT,60,COLMAR,BYTE,1,11,1,1 +201,_extgn,POINT,78,INFORM,STRING,1,Height: 123m|Chimney|Visually conspicuous,1,1 +217,_m_sor,META,151,CSCALE,LONG,1,3000000,1,6 +217,_m_sor,META,151,CSCALE,LONG,2,1200000,1,6 +217,_m_sor,META,151,CSCALE,LONG,3,250000,1,6 +217,_m_sor,META,151,CSCALE,LONG,4,20000,1,6 +217,_m_sor,META,151,CSCALE,LONG,5,12000,1,6 +217,_m_sor,META,151,CSCALE,LONG,6,20000000,1,6 +217,_m_sor,META,75,HORDAT,BYTE,1,2,6,1 +217,_m_sor,META,84,MARSYS,BYTE,1,2,4,2 +217,_m_sor,META,84,MARSYS,BYTE,2,1,2,2 +217,_m_sor,META,156,NMDATE,STRING,1,20021101,2,5 +217,_m_sor,META,156,NMDATE,STRING,2,20140926,1,5 +217,_m_sor,META,156,NMDATE,STRING,3,20140523,1,5 +217,_m_sor,META,156,NMDATE,STRING,4,20060323,1,5 +217,_m_sor,META,156,NMDATE,STRING,5,20140328,1,5 +217,_m_sor,META,96,RECDAT,STRING,1,20080102,2,5 +217,_m_sor,META,96,RECDAT,STRING,2,20141006,1,5 +217,_m_sor,META,96,RECDAT,STRING,3,20140602,1,5 +217,_m_sor,META,96,RECDAT,STRING,4,20060322,1,5 +217,_m_sor,META,96,RECDAT,STRING,5,20140505,1,5 +217,_m_sor,META,108,SORIND,STRING,1,"IT,CMAP,graph,W-135",1,6 +217,_m_sor,META,108,SORIND,STRING,2,"JP,JHOD,graph,W1154",1,6 +217,_m_sor,META,108,SORIND,STRING,3,"JP,JHOD,graph,W53",1,6 +217,_m_sor,META,108,SORIND,STRING,4,"GB,MDHS,graph,2959B",1,6 +217,_m_sor,META,108,SORIND,STRING,5,"JP,JHOD,graph,W65",1,6 +217,_m_sor,META,108,SORIND,STRING,6,"IT,CMAP,graph,W-14",1,6 +217,_m_sor,META,121,VERDAT,BYTE,1,11,3,2 +217,_m_sor,META,121,VERDAT,BYTE,2,10,1,2 +217,_m_sor,META,173,_chcod,STRING,1,90-01520,1,6 +217,_m_sor,META,173,_chcod,STRING,2,31-0F270,1,6 +217,_m_sor,META,173,_chcod,STRING,3,31-0F710,1,6 +217,_m_sor,META,173,_chcod,STRING,4,31-0684B,1,6 +217,_m_sor,META,173,_chcod,STRING,5,31-0F700,1,6 +217,_m_sor,META,173,_chcod,STRING,6,90-00310,1,6 +217,_m_sor,META,174,_dgdat,STRING,1,20000101,2,5 +217,_m_sor,META,174,_dgdat,STRING,2,20081003,1,5 +217,_m_sor,META,174,_dgdat,STRING,3,20070914,1,5 +217,_m_sor,META,174,_dgdat,STRING,4,20030320,1,5 +217,_m_sor,META,174,_dgdat,STRING,5,20120313,1,5 +217,_m_sor,META,180,_hvdat,BYTE,1,3,3,2 +217,_m_sor,META,180,_hvdat,BYTE,2,21,1,2 +217,_m_sor,META,175,_quart,BYTE,1,4,6,1 +217,_m_sor,META,177,_sorhd,BYTE,1,2,6,1 +217,_m_sor,META,178,_wgsox,REAL,1,0,6,1 +217,_m_sor,META,179,_wgsoy,REAL,1,0,6,1 +198,_texto,POINT,139,_texta,COMPLEX,1,"{""prefix"":[0,12,0],""text"":""Same Kado""}",3,104 +198,_texto,POINT,139,_texta,COMPLEX,2,"{""prefix"":[0,12,0],""text"":""Hachinohe""}",3,104 +198,_texto,POINT,139,_texta,COMPLEX,3,"{""prefix"":[0,12,0],""text"":""Hachinohe Fishing Harbour""}",3,104 +198,_texto,POINT,139,_texta,COMPLEX,4,"{""prefix"":[0,12,0],""text"":""Misawa""}",2,104 +198,_texto,POINT,139,_texta,COMPLEX,5,"{""prefix"":[0,12,0],""text"":""Hamanaka""}",2,104 +198,_texto,POINT,139,_texta,COMPLEX,6,"{""prefix"":[0,12,0],""text"":""Hashimukai""}",2,104 +198,_texto,POINT,139,_texta,COMPLEX,7,"{""prefix"":[128,12,0],""text"":""HACHINOHE""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,8,"{""prefix"":[0,12,0],""text"":""AOMORI""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,9,"{""prefix"":[0,12,0],""text"":""Hachinohe Ko""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,10,"{""prefix"":[0,12,0],""text"":""Kabayama Reef""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,11,"{""prefix"":[0,12,0],""text"":""Hitokawame""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,12,"{""prefix"":[0,12,0],""text"":""Mikawame""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,13,"{""prefix"":[0,12,0],""text"":""Minato""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,14,"{""prefix"":[0,12,0],""text"":""Oirase Town""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,15,"{""prefix"":[0,12,0],""text"":""Okuki""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,16,"{""prefix"":[0,12,0],""text"":""Same""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,17,"{""prefix"":[0,12,0],""text"":""Shirahama""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,18,"{""prefix"":[0,12,0],""text"":""CONVEYOR""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,19,"{""prefix"":[0,12,0],""text"":""H A C H I T A R O""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,20,"{""prefix"":[0,12,0],""text"":""HACHINOHE""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,21,"{""prefix"":[16,12,0],""text"":""HACHINOHE""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,22,"{""prefix"":[0,12,0],""text"":""HINODE IWA(ILLUM)""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,23,"{""prefix"":[0,12,0],""text"":""HOUSE""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,24,"{""prefix"":[0,12,0],""text"":""K A W A R A G I""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,25,"{""prefix"":[0,12,0],""text"":""KABAYAMA NE""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,26,"{""prefix"":[0,12,0],""text"":""KABU SH.""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,27,"{""prefix"":[0,12,0],""text"":""KO NE""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,28,"{""prefix"":[0,12,0],""text"":""MABECHI KAWA""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,29,"{""prefix"":[0,12,0],""text"":""MITSUBUSHI JETTY""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,30,"{""prefix"":[0,12,0],""text"":""MONOMIWA""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,31,"{""prefix"":[0,12,0],""text"":""N. BREAKWATER""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,32,"{""prefix"":[0,12,0],""text"":""NIIDA KAWA""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,33,"{""prefix"":[0,12,0],""text"":""No 1 WHARF""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,34,"{""prefix"":[0,12,0],""text"":""No 2 WHARF""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,35,"{""prefix"":[0,12,0],""text"":""No 4 WHARF""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,36,"{""prefix"":[0,12,0],""text"":""O SAKI""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,37,"{""prefix"":[0,12,0],""text"":""OGOMUNE""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,38,"{""prefix"":[0,12,0],""text"":""SAME KADO""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,39,"{""prefix"":[0,12,0],""text"":""SHIROGANE WHARF""}",1,104 +198,_texto,POINT,139,_texta,COMPLEX,40,"{""prefix"":[0,12,0],""text"":""SILOS""}",1,104 diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性字典_v1.csv b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性字典_v1.csv new file mode 100644 index 0000000..6f00631 --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性字典_v1.csv @@ -0,0 +1,73 @@ +attribute_id,attribute_name,source_type_name,decoder_type,min_value,max_value,raw_line +3,CATACH,aLIST,L,1.0,9.0,CATACH|3|aLIST|1|9 +4,CATBRG,aLIST,L,1.0,9.0,CATBRG|4|aLIST|1|9 +6,CATCBL,aBYTE,B,1.0,3.0,CATCBL|6|aBYTE|1|3 +9,CATCTR,aBYTE,B,1.0,5.0,CATCTR|9|aBYTE|1|5 +10,CATCRN,aBYTE,B,1.0,4.0,CATCRN|10|aBYTE|1|4 +20,CATHAF,aLIST,L,1.0,10.0,CATHAF|20|aLIST|1|10 +24,CATLAM,aBYTE,B,1.0,4.0,CATLAM|24|aBYTE|1|4 +25,CATLIT,aBYTE,B,1.0,11.0,CATLIT|25|aBYTE|1|11 +29,CATMOR,aBYTE,B,1.0,3.0,CATMOR|29|aBYTE|1|3 +35,CATPIP,aBYTE,B,1.0,4.0,CATPIP|35|aBYTE|1|4 +38,CATRTB,aBYTE,B,1.0,2.0,CATRTB|38|aBYTE|1|2 +41,CATREB,aBYTE,B,1.0,9.0,CATREB|41|aBYTE|1|9 +46,CATSLC,aBYTE,B,1.0,10.0,CATSLC|46|aBYTE|1|10 +47,CATSIT,aLIST,L,1.0,9.0,CATSIT|47|aLIST|1|9 +48,CATSIW,aLIST,L,1.0,13.0,CATSIW|48|aLIST|1|13 +49,CATBUI,aLIST,L,1.0,21.0,CATBUI|49|aLIST|1|21 +51,CATSPM,aBYTE,B,1.0,38.0,CATSPM|51|aBYTE|1|38 +52,CATTOW,aBYTE,B,1.0,7.0,CATTOW|52|aBYTE|1|7 +57,CATWRK,aBYTE,B,1.0,5.0,CATWRK|57|aBYTE|1|5 +58,LITCHR,aBYTE,B,1.0,27.0,LITCHR|58|aBYTE|1|27 +59,COLOUR,aLIST,L,1.0,55.0,COLOUR|59|aLIST|1|55 +60,COLMAR,aBYTE,B,1.0,18.0,COLMAR|60|aBYTE|1|18 +63,CONDTN,aBYTE,B,1.0,5.0,CONDTN|63|aBYTE|1|5 +65,CONVIS,aBYTE,B,1.0,2.0,CONVIS|65|aBYTE|1|2 +66,DRVAL1,aFLOAT,R,0.0,12000.0,DRVAL1|66|aFLOAT|0.0|12000.0 +67,DRVAL2,aFLOAT,R,0.0,12000.0,DRVAL2|67|aFLOAT|0.0|12000.0 +69,EXPSOU,aBYTE,B,1.0,3.0,EXPSOU|69|aBYTE|1|3 +72,SIGGRP,aSTRING,S,,,SIGGRP|72|aSTRING +73,HEIGHT,aFLOAT,R,-500.0,8900.0,HEIGHT|73|aFLOAT|-500.0|8900.0 +75,HORDAT,aBYTE,B,0.0,221.0,HORDAT|75|aBYTE|0|221 +78,INFORM,aSTRING,S,,,INFORM|78|aSTRING +80,OBJNAM,aSTRING,S,,,OBJNAM|80|aSTRING +81,NATION,aSTRING,S,,,NATION|81|aSTRING +82,NATSUR,aLIST,L,1.0,88.0,NATSUR|82|aLIST|1|88 +83,NATCON,aLIST,L,1.0,7.0,NATCON|83|aLIST|1|7 +84,MARSYS,aBYTE,B,1.0,8.0,MARSYS|84|aBYTE|1|8 +86,SIGPER,aWORD10,W,0.0,1000.0,SIGPER|86|aWORD10|0.0|1000.0 +89,PRODCT,aLIST,L,1.0,6.0,PRODCT|89|aLIST|1|6 +90,NATQUA,aLIST,L,1.0,60.0,NATQUA|90|aLIST|1|60 +91,QUAPOS,aBYTE,B,1.0,8.0,QUAPOS|91|aBYTE|1|8 +93,QUAVEM,aBYTE,B,1.0,2.0,QUAVEM|93|aBYTE|1|2 +96,RECDAT,aSTRING,S,,,RECDAT|96|aSTRING +100,SECTR1,aWORD10,W,0.0,360.0,SECTR1|100|aWORD10|0.0|360.0 +101,SECTR2,aWORD10,W,0.0,360.0,SECTR2|101|aWORD10|0.0|360.0 +103,BCNSHP,aBYTE,B,1.0,4.0,BCNSHP|103|aBYTE|1|4 +104,BUISHP,aBYTE,B,1.0,6.0,BUISHP|104|aBYTE|1|6 +105,BOYSHP,aBYTE,B,1.0,8.0,BOYSHP|105|aBYTE|1|8 +108,SORIND,aSTRING,S,,,SORIND|108|aSTRING +109,STATUS,aLIST,L,1.0,11.0,STATUS|109|aLIST|1|11 +113,VALDCO,aFLOAT,R,0.0,12000.0,VALDCO|113|aFLOAT|0.0|12000.0 +115,VALNMR,aWORD10,W,0.0,400.0,VALNMR|115|aWORD10|0.0|400.0 +116,VALSOU,aWORD10,W,0.0,12000.0,VALSOU|116|aWORD10|0|12000.0 +117,VERCLR,aFLOAT,R,0.0,10000.0,VERCLR|117|aFLOAT|0.0|10000.0 +121,VERDAT,aBYTE,B,1.0,59.0,VERDAT|121|aBYTE|1|59 +122,VERLEN,aFLOAT,R,0.0,10000.0,VERLEN|122|aFLOAT|0.0|10000.0 +124,WATLEV,aBYTE,B,1.0,5.0,WATLEV|124|aBYTE|1|5 +126,$VARIA,aSTRING,S,,,$VARIA|126|aSTRING +127,$CYEAR,aFLOAT,R,0.0,3000.0,$CYEAR|127|aFLOAT|0.0|3000.0 +128,$ANNCH,aSTRING,S,,,$ANNCH|128|aSTRING +129,$SCODE,aSTRING,S,,,$SCODE|129|aSTRING +139,_texta,aCMPLX,C,,,_texta|139|aCMPLX +147,CATCOA,aBYTE,B,1.0,9.0,CATCOA|147|aBYTE|1|9 +150,CPDATE,aSTRING,S,,,CPDATE|150|aSTRING +151,CSCALE,aLONG,G,0.0,20000000.0,CSCALE|151|aLONG|0|20000000 +156,NMDATE,aSTRING,S,,,NMDATE|156|aSTRING +173,_chcod,aSTRING,S,,,_chcod|173|aSTRING +174,_dgdat,aSTRING,S,,,_dgdat|174|aSTRING +175,_quart,aBYTE,B,1.0,6.0,_quart|175|aBYTE|1|6 +177,_sorhd,aBYTE,B,0.0,221.0,_sorhd|177|aBYTE|0|221 +178,_wgsox,aFLOAT,R,-5000.0,5000.0,_wgsox|178|aFLOAT|-5000.0|5000.0 +179,_wgsoy,aFLOAT,R,-5000.0,5000.0,_wgsoy|179|aFLOAT|-5000.0|5000.0 +180,_hvdat,aBYTE,B,1.0,59.0,_hvdat|180|aBYTE|1|59 diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性字段汇总_v1.csv b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性字段汇总_v1.csv new file mode 100644 index 0000000..5a85572 --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/属性字段汇总_v1.csv @@ -0,0 +1,178 @@ +object_class_id,object_class,geometry_type,attribute_id,attribute_name,value_type,occurrence_count,distinct_value_count,native_scales,top_values +194,$AREAS,AREA,129,$SCODE,STRING,11,1,"[20000, 50000, 200000]","[{""value"": ""II25"", ""count"": 11}]" +191,$COMPS,POINT,128,$ANNCH,STRING,5,2,"[20000, 50000]","[{""value"": ""00.00 E"", ""count"": 4}, {""value"": ""01.00 W"", ""count"": 1}]" +191,$COMPS,POINT,127,$CYEAR,REAL,5,2,"[20000, 50000]","[{""value"": ""2012"", ""count"": 4}, {""value"": ""2002"", ""count"": 1}]" +191,$COMPS,POINT,126,$VARIA,STRING,5,1,"[20000, 50000]","[{""value"": ""08.25 W"", ""count"": 5}]" +193,$LINES,LINE,129,$SCODE,STRING,15,3,"[20000, 50000]","[{""value"": ""IH40"", ""count"": 6}, {""value"": ""IH41"", ""count"": 6}, {""value"": ""IK1"", ""count"": 3}]" +4,ACHARE,AREA,3,CATACH,LIST,2,1,"[20000, 50000]","[{""value"": ""[5]"", ""count"": 2}]" +1,AIRARE,POINT,80,OBJNAM,STRING,1,1,[20000],"[{""value"": ""Hachinohe Airfield"", ""count"": 1}]" +7,BCNLAT,POINT,103,BCNSHP,BYTE,4,1,[50000],"[{""value"": ""3"", ""count"": 4}]" +7,BCNLAT,POINT,24,CATLAM,BYTE,15,1,"[20000, 50000, 200000]","[{""value"": ""2"", ""count"": 15}]" +7,BCNLAT,POINT,60,COLMAR,BYTE,15,1,"[20000, 50000, 200000]","[{""value"": ""3"", ""count"": 15}]" +7,BCNLAT,POINT,78,INFORM,STRING,6,3,"[20000, 50000, 200000]","[{""value"": ""Concrete"", ""count"": 3}, {""value"": ""Metal"", ""count"": 2}, {""value"": ""Metal|Framework tower"", ""count"": 1}]" +7,BCNLAT,POINT,108,SORIND,STRING,15,11,"[20000, 50000, 200000]","[{""value"": ""GB,UKHO,graph,LL M-6623"", ""count"": 2}, {""value"": ""GB,UKHO,graph,LL M-6624.8"", ""count"": 2}, {""value"": ""GB,UKHO,graph,LL M-6624.7"", ""count"": 2}, {""value"": ""GB,UKHO,graph,LL M-6624"", ""count"": 2}, {""value"": ""GB,UKHO,graph,LL M-6619"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6623"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6623.6"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6624.8"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6624.7"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6624"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6623.6"", ""count"": 1}]" +7,BCNLAT,POINT,122,VERLEN,REAL,15,4,"[20000, 50000, 200000]","[{""value"": ""10"", ""count"": 6}, {""value"": ""9"", ""count"": 5}, {""value"": ""16"", ""count"": 3}, {""value"": ""6"", ""count"": 1}]" +9,BCNSPP,POINT,51,CATSPM,BYTE,5,2,"[20000, 50000, 1000000]","[{""value"": ""6"", ""count"": 4}, {""value"": ""27"", ""count"": 1}]" +9,BCNSPP,POINT,60,COLMAR,BYTE,2,1,"[20000, 200000]","[{""value"": ""5"", ""count"": 2}]" +9,BCNSPP,POINT,78,INFORM,STRING,4,1,"[200000, 1000000]","[{""value"": ""Metal"", ""count"": 4}]" +9,BCNSPP,POINT,108,SORIND,STRING,6,3,"[20000, 200000, 1000000]","[{""value"": ""GB,UKHO,graph,LL M-6625"", ""count"": 2}, {""value"": ""GB,UKHO,graph,LL M-6626"", ""count"": 2}, {""value"": ""GB,UKHO,graph,LL M-6623.2"", ""count"": 2}]" +9,BCNSPP,POINT,122,VERLEN,REAL,4,2,"[20000, 200000, 1000000]","[{""value"": ""43"", ""count"": 2}, {""value"": ""9"", ""count"": 2}]" +20,BOYSPP,POINT,105,BOYSHP,BYTE,8,2,"[20000, 50000]","[{""value"": ""1"", ""count"": 5}, {""value"": ""4"", ""count"": 3}]" +20,BOYSPP,POINT,51,CATSPM,BYTE,5,3,"[20000, 50000]","[{""value"": ""27"", ""count"": 3}, {""value"": ""10"", ""count"": 1}, {""value"": ""13"", ""count"": 1}]" +20,BOYSPP,POINT,60,COLMAR,BYTE,8,1,"[20000, 50000]","[{""value"": ""4"", ""count"": 8}]" +20,BOYSPP,POINT,78,INFORM,STRING,1,1,[50000],"[{""value"": ""Private mark|Wave recorder"", ""count"": 1}]" +20,BOYSPP,POINT,109,STATUS,LIST,6,1,[20000],"[{""value"": ""[8]"", ""count"": 6}]" +11,BRIDGE,AREA,4,CATBRG,LIST,2,1,[50000],"[{""value"": ""[1]"", ""count"": 2}]" +11,BRIDGE,AREA,78,INFORM,STRING,3,2,[20000],"[{""value"": ""Vertical Datum: Nearly highest high water|Vertical clearance 4.5m - 5.5m"", ""count"": 2}, {""value"": ""Vertical Datum: Nearly highest high water"", ""count"": 1}]" +11,BRIDGE,AREA,80,OBJNAM,STRING,7,7,[20000],"[{""value"": ""Hachinohe Bridge"", ""count"": 1}, {""value"": ""Hattaro Bridge"", ""count"": 1}, {""value"": ""The Numadate Bridge"", ""count"": 1}, {""value"": ""The Shin-O-Hashi Bridge"", ""count"": 1}, {""value"": ""Seagull Bridge"", ""count"": 1}, {""value"": ""Minato Bridge"", ""count"": 1}, {""value"": ""Ichikawa Bridge"", ""count"": 1}]" +11,BRIDGE,AREA,117,VERCLR,REAL,5,3,"[20000, 50000]","[{""value"": ""4.5"", ""count"": 2}, {""value"": ""31"", ""count"": 2}, {""value"": ""5.30000019073486"", ""count"": 1}]" +10,BRTFAC,POINT,80,OBJNAM,STRING,89,25,"[20000, 50000]","[{""value"": ""2"", ""count"": 8}, {""value"": ""1"", ""count"": 6}, {""value"": ""3"", ""count"": 6}, {""value"": ""4"", ""count"": 6}, {""value"": ""A"", ""count"": 6}, {""value"": ""B"", ""count"": 6}, {""value"": ""C"", ""count"": 6}, {""value"": ""5"", ""count"": 4}, {""value"": ""6"", ""count"": 4}, {""value"": ""D"", ""count"": 4}, {""value"": ""F"", ""count"": 4}, {""value"": ""G"", ""count"": 4}, {""value"": ""7"", ""count"": 2}, {""value"": ""8"", ""count"": 2}, {""value"": ""9"", ""count"": 2}, {""value"": ""E"", ""count"": 2}, {""value"": ""H"", ""count"": 2}, {""value"": ""I"", ""count"": 2}, {""value"": ""J"", ""count"": 2}, {""value"": ""L"", ""count"": 2}, {""value"": ""M"", ""count"": 2}, {""value"": ""N"", ""count"": 2}, {""value"": ""O"", ""count"": 2}, {""value"": ""10"", ""count"": 2}, {""value"": ""P"", ""count"": 1}]" +14,BUAARE,AREA,80,OBJNAM,STRING,2,2,[200000],"[{""value"": ""Hachinohe"", ""count"": 1}, {""value"": ""Misawa"", ""count"": 1}]" +14,BUAARE,POINT,80,OBJNAM,STRING,35,33,"[20000, 200000, 1000000]","[{""value"": ""Hachinohe"", ""count"": 2}, {""value"": ""Hashimukai"", ""count"": 2}, {""value"": ""Misawa"", ""count"": 1}, {""value"": ""Same"", ""count"": 1}, {""value"": ""Okuki"", ""count"": 1}, {""value"": ""Minato"", ""count"": 1}, {""value"": ""Mikawame"", ""count"": 1}, {""value"": ""Shirahama"", ""count"": 1}, {""value"": ""Hitokawame"", ""count"": 1}, {""value"": ""Oirase Town"", ""count"": 1}, {""value"": ""Tate"", ""count"": 1}, {""value"": ""Osawa"", ""count"": 1}, {""value"": ""Hinode"", ""count"": 1}, {""value"": ""Toyosu"", ""count"": 1}, {""value"": ""Hattaro"", ""count"": 1}, {""value"": ""Hasunuma"", ""count"": 1}, {""value"": ""Kawaragi"", ""count"": 1}, {""value"": ""Kitanuma"", ""count"": 1}, {""value"": ""Numadate"", ""count"": 1}, {""value"": ""Sunamori"", ""count"": 1}, {""value"": ""Tatehana"", ""count"": 1}, {""value"": ""Uenoyama"", ""count"": 1}, {""value"": ""Kami-Same"", ""count"": 1}, {""value"": ""Hikagezawa"", ""count"": 1}, {""value"": ""Shinminato"", ""count"": 1}, {""value"": ""Uheikawara"", ""count"": 1}, {""value"": ""Senzogakubo"", ""count"": 1}, {""value"": ""Hamana-Yachi"", ""count"": 1}, {""value"": ""Shimo-Oyachi"", ""count"": 1}, {""value"": ""Minami-Oyachi"", ""count"": 1}, {""value"": ""Toyama-Shinden"", ""count"": 1}, {""value"": ""Shimo-Matsunaeba"", ""count"": 1}, {""value"": ""Shimo-Mekurakubo"", ""count"": 1}]" +12,BUIREL,POINT,41,CATREB,BYTE,5,3,"[20000, 50000]","[{""value"": ""6"", ""count"": 2}, {""value"": ""7"", ""count"": 2}, {""value"": ""4"", ""count"": 1}]" +13,BUISGL,AREA,49,CATBUI,LIST,10,4,[20000],"[{""value"": ""[19]"", ""count"": 7}, {""value"": ""[13]"", ""count"": 1}, {""value"": ""[3,2]"", ""count"": 1}, {""value"": ""[10]"", ""count"": 1}]" +13,BUISGL,AREA,78,INFORM,STRING,7,7,[20000],"[{""value"": ""Port Management Office"", ""count"": 1}, {""value"": ""Fisheries High School"", ""count"": 1}, {""value"": ""Fishery Hall"", ""count"": 1}, {""value"": ""Fisheries Laboratory"", ""count"": 1}, {""value"": ""Coast Guard Office|Marine Procedure Commission Agent Office"", ""count"": 1}, {""value"": ""Fishing Harbor Development Office"", ""count"": 1}, {""value"": ""Regional Development Bureau,Port And Airport Office"", ""count"": 1}]" +13,BUISGL,AREA,80,OBJNAM,STRING,7,7,[20000],"[{""value"": ""Tohoku Electric Power Electric Substation"", ""count"": 1}, {""value"": ""No.1 Fish Market"", ""count"": 1}, {""value"": ""No.2 Fish Market"", ""count"": 1}, {""value"": ""No.3 Fish Market"", ""count"": 1}, {""value"": ""Maritime Office"", ""count"": 1}, {""value"": ""Construction Office"", ""count"": 1}, {""value"": ""Fisherman's Union"", ""count"": 1}]" +13,BUISGL,POINT,104,BUISHP,BYTE,1,1,[200000],"[{""value"": ""4"", ""count"": 1}]" +13,BUISGL,POINT,49,CATBUI,LIST,9,5,"[20000, 50000]","[{""value"": ""[6]"", ""count"": 5}, {""value"": ""[2]"", ""count"": 1}, {""value"": ""[3]"", ""count"": 1}, {""value"": ""[17]"", ""count"": 1}, {""value"": ""[5]"", ""count"": 1}]" +13,BUISGL,POINT,65,CONVIS,BYTE,2,1,"[20000, 200000]","[{""value"": ""2"", ""count"": 2}]" +13,BUISGL,POINT,78,INFORM,STRING,1,1,[20000],"[{""value"": ""Light support|Not in use"", ""count"": 1}]" +13,BUISGL,POINT,80,OBJNAM,STRING,2,2,[20000],"[{""value"": ""Tohoku Electric Power Thermal Power Plants"", ""count"": 1}, {""value"": ""Japan Maritime Self Defense Force Air Base"", ""count"": 1}]" +13,BUISGL,POINT,91,QUAPOS,BYTE,2,1,[20000],"[{""value"": ""4"", ""count"": 2}]" +21,CBLOHD,LINE,6,CATCBL,BYTE,5,1,"[20000, 50000]","[{""value"": ""1"", ""count"": 5}]" +21,CBLOHD,LINE,93,QUAVEM,BYTE,1,1,[50000],"[{""value"": ""1"", ""count"": 1}]" +21,CBLOHD,LINE,117,VERCLR,REAL,1,1,[50000],"[{""value"": ""12"", ""count"": 1}]" +22,CBLSUB,LINE,6,CATCBL,BYTE,2,1,"[20000, 50000]","[{""value"": ""1"", ""count"": 2}]" +22,CBLSUB,LINE,109,STATUS,LIST,3,1,"[20000, 50000]","[{""value"": ""[4]"", ""count"": 3}]" +33,CHIMNY,POINT,59,COLOUR,LIST,2,1,[50000],"[{""value"": ""[3,1]"", ""count"": 2}]" +33,CHIMNY,POINT,65,CONVIS,BYTE,9,2,"[20000, 50000, 200000]","[{""value"": ""2"", ""count"": 8}, {""value"": ""1"", ""count"": 1}]" +33,CHIMNY,POINT,73,HEIGHT,REAL,9,7,"[20000, 200000]","[{""value"": ""123"", ""count"": 2}, {""value"": ""30"", ""count"": 2}, {""value"": ""27"", ""count"": 1}, {""value"": ""81"", ""count"": 1}, {""value"": ""40"", ""count"": 1}, {""value"": ""71"", ""count"": 1}, {""value"": ""82"", ""count"": 1}]" +33,CHIMNY,POINT,78,INFORM,STRING,1,1,[50000],"[{""value"": ""3 CHYS"", ""count"": 1}]" +35,COALNE,LINE,147,CATCOA,BYTE,8,1,[20000],"[{""value"": ""1"", ""count"": 8}]" +36,CONZNE,AREA,78,INFORM,STRING,2,1,"[200000, 1000000]","[{""value"": ""Jeppesen adopts \""International Boundaries and National Limits\"" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation."", ""count"": 2}]" +36,CONZNE,AREA,81,NATION,STRING,2,1,"[200000, 1000000]","[{""value"": ""JP"", ""count"": 2}]" +36,CONZNE,AREA,108,SORIND,STRING,1,1,[200000],"[{""value"": ""CM,PAD,graph,B3900420"", ""count"": 1}]" +39,CRANES,POINT,10,CATCRN,BYTE,11,2,"[20000, 50000]","[{""value"": ""4"", ""count"": 9}, {""value"": ""2"", ""count"": 2}]" +29,CTNARE,AREA,78,INFORM,STRING,16,12,"[20000, 50000, 200000, 1000000]","[{""value"": ""Caisson Temporary Storage Area"", ""count"": 3}, {""value"": ""The contents of the charts affected by earthquakes etc. occured offshore Pacific Ocean in Tohoku region in Japan.|By earthquakes and tsunami occured offshore Pacific Ocean in Tohoku region in Japan on 11th March 2011, damages of breakwaters, quays, etc. and existance of foul bottoms (i.e. houses and vehicles) on the seafloor which were pushed and flowed from land area in the east coast of Honshu and each ports and harbours. Users are aware that contents of the charts may be different from existing situations. Notices to Mariners about these matters will be issued as soon as survey results are received.Notices to Mariners address http://www1.kaiho.mlit.go.jp/TUHO/tuho_db/tuhoserch.html"", ""count"": 2}, {""value"": ""Unassessed. Surveys before the earthquake (11th Mar. 2011)"", ""count"": 2}, {""value"": ""Caution|Undiscovered shoals may exist around charted shoals. Mariners are advised to exercise caution.|Caution|Only the principal lights are shown on this chart. For the details of these and other lights, the larger scale charts and the List of Lights should be consulted.|Note|The straight baselines and the limits of the territorial sea shown on this chart are based on the provisions of Japanese Law No.30 of 1977 on the Territorial Sea and the Contiguous Zone and the Enforcement Order No.210 of 1977 of Japanese Law No.30 of 1977 on the Territorial Sea and the Contiguous Zone.|Note|Owing to scale, only major points of the straight baselines given in the Enforcement Order are shown.|Caution|As submarine cables are not shown on this chart, take care with regard to the fishing industry, submarine exploration etc. For submarine cable information, refer to JP charts with scales of larger than 1:750,000 or the JP chart with scale 1:3,500,000."", ""count"": 1}, {""value"": ""Jeppesen digital nautical charts do not reflect all soundings present on the official paper charts published by Japan Hydrographic and Oceanographic Department. This product is not an Electronic Navigational Chart. Mariners are required to use official paper charts for navigational judgements."", ""count"": 1}, {""value"": ""CAUTION|As undiscovered shoals may exist around charted shoals, mariners are warned to excercise cautions.|NOTE|The straight baselines and the limits of the territorial sea shown on this chart are based on the provisions of the Law No.30 of 1977 on the Territorial Sea and the Contiguous Zone and the Enforcement Order No.210 of 1977 of the Law No.30 of 1977 on the Territorial Sea and the Contiguous Zone.|NOTE|Of all the base points of the straight baselines given in the Enforcement Order, only major points are shown on this chart due to its small scale."", ""count"": 1}, {""value"": ""CABLES|1. Submarine and overhead cables may conduct high voltages; contact with or proximity to these poses an extreme danger and mariners may risk prosecution if damage is caused.|2. Anchoring or trawling in the vicinity of submarine cables should be avoided. Seabed mobility may leave a cable spanning undulations and cause fishing gear to become irrecoverably snagged, putting a vessel in severe danger. If a cable is snagged, care must be taken not to sever it.|3. Sufficient clearance must be allowed under overhead cables.|4. Some cables, particularly those installed since this edition was published, may not be charted.|5. For further information, see The Mariner's Handbook."", ""count"": 1}, {""value"": ""Dredged to 7.5m|Source date: 1994"", ""count"": 1}, {""value"": ""Caution|Undiscovered shoals may exist around charted shoals. Mariners are advised to exercise caution. |Caution|Depths are very changeable at the entrance to river mouths. Mariners are advised to exercise caution."", ""count"": 1}, {""value"": ""Section 3"", ""count"": 1}, {""value"": ""Section 2"", ""count"": 1}, {""value"": ""Section 1"", ""count"": 1}]" +29,CTNARE,POINT,78,INFORM,STRING,13,12,"[20000, 50000]","[{""value"": ""Works in progress|Source date: 2005"", ""count"": 2}, {""value"": ""FOUL"", ""count"": 1}, {""value"": ""Marked by buoys"", ""count"": 1}, {""value"": ""(liable to shoal)"", ""count"": 1}, {""value"": ""WORKS IN PROGRESS (1998)"", ""count"": 1}, {""value"": ""Works in progress|Source date: 2000"", ""count"": 1}, {""value"": ""Works in progress|Source date: 2002"", ""count"": 1}, {""value"": ""Ebb stream|Orientation: 130 Deg|Current velocity: 0.2kn"", ""count"": 1}, {""value"": ""Flood stream|Orientation: 290 Deg|Current velocity: 0.3kn"", ""count"": 1}, {""value"": ""Slipway"", ""count"": 1}, {""value"": ""Ebb stream|Orientation: 133 Deg|Current velocity: 0.3kn"", ""count"": 1}, {""value"": ""Flood stream|Orientation: 299 Deg|Current velocity: 0.3kn"", ""count"": 1}]" +38,CTRPNT,POINT,9,CATCTR,BYTE,6,2,"[20000, 50000]","[{""value"": ""1"", ""count"": 4}, {""value"": ""4"", ""count"": 2}]" +38,CTRPNT,POINT,80,OBJNAM,STRING,1,1,[20000],"[{""value"": ""Monomiiwa"", ""count"": 1}]" +44,DEPARE,AREA,66,DRVAL1,REAL,414,7,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""2"", ""count"": 188}, {""value"": ""0"", ""count"": 117}, {""value"": ""5"", ""count"": 81}, {""value"": ""10"", ""count"": 18}, {""value"": ""20"", ""count"": 5}, {""value"": ""200"", ""count"": 4}, {""value"": ""30"", ""count"": 1}]" +44,DEPARE,AREA,67,DRVAL2,REAL,411,8,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""5"", ""count"": 203}, {""value"": ""2"", ""count"": 96}, {""value"": ""10"", ""count"": 84}, {""value"": ""20"", ""count"": 18}, {""value"": ""200"", ""count"": 4}, {""value"": ""50"", ""count"": 4}, {""value"": ""30"", ""count"": 1}, {""value"": ""2000"", ""count"": 1}]" +45,DEPCNT,LINE,91,QUAPOS,BYTE,1,1,[50000],"[{""value"": ""4"", ""count"": 1}]" +45,DEPCNT,LINE,113,VALDCO,REAL,451,6,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""5"", ""count"": 230}, {""value"": ""2"", ""count"": 102}, {""value"": ""10"", ""count"": 100}, {""value"": ""20"", ""count"": 14}, {""value"": ""200"", ""count"": 4}, {""value"": ""30"", ""count"": 1}]" +50,DRGARE,AREA,66,DRVAL1,REAL,13,6,[50000],"[{""value"": ""7.5"", ""count"": 5}, {""value"": ""13"", ""count"": 4}, {""value"": ""14"", ""count"": 1}, {""value"": ""12"", ""count"": 1}, {""value"": ""9.59999942779541"", ""count"": 1}, {""value"": ""10"", ""count"": 1}]" +50,DRGARE,AREA,78,INFORM,STRING,11,7,[50000],"[{""value"": ""(1981-2000)"", ""count"": 4}, {""value"": ""Source date: 1990"", ""count"": 2}, {""value"": ""(1995-2000)"", ""count"": 1}, {""value"": ""Source date: 1991"", ""count"": 1}, {""value"": ""1980"", ""count"": 1}, {""value"": ""1994"", ""count"": 1}, {""value"": ""Source date: 1977"", ""count"": 1}]" +56,EXEZNE,AREA,78,INFORM,STRING,2,1,"[200000, 1000000]","[{""value"": ""Jeppesen adopts \""International Boundaries and National Limits\"" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation."", ""count"": 2}]" +56,EXEZNE,AREA,81,NATION,STRING,2,1,"[200000, 1000000]","[{""value"": ""JP"", ""count"": 2}]" +56,EXEZNE,AREA,108,SORIND,STRING,1,1,[200000],"[{""value"": ""CM,PAD,graph,B3900420"", ""count"": 1}]" +57,FAIRWY,AREA,80,OBJNAM,STRING,4,4,"[20000, 50000]","[{""value"": ""East Fairway"", ""count"": 1}, {""value"": ""West Fairway"", ""count"": 1}, {""value"": ""East Passage"", ""count"": 1}, {""value"": ""West Passage"", ""count"": 1}]" +60,FSHHAV,POINT,78,INFORM,STRING,18,1,"[20000, 50000, 200000]","[{""value"": ""Always under water/submerged"", ""count"": 18}]" +72,HRBARE,AREA,80,OBJNAM,STRING,3,3,[50000],"[{""value"": ""No 3 Area"", ""count"": 1}, {""value"": ""No 2 Area"", ""count"": 1}, {""value"": ""No1 Area"", ""count"": 1}]" +73,HRBFAC,AREA,20,CATHAF,LIST,1,1,[20000],"[{""value"": ""[9]"", ""count"": 1}]" +73,HRBFAC,POINT,80,OBJNAM,STRING,1,1,[20000],"[{""value"": ""Tohoku Grain Terminal"", ""count"": 1}]" +78,ITDARE,AREA,82,NATSUR,LIST,38,4,"[20000, 50000]","[{""value"": ""[9]"", ""count"": 25}, {""value"": ""[56]"", ""count"": 5}, {""value"": ""[1]"", ""count"": 4}, {""value"": ""[4]"", ""count"": 4}]" +79,LAKARE,AREA,80,OBJNAM,STRING,1,1,[200000],"[{""value"": ""Ane Lake"", ""count"": 1}]" +86,LIGHTS,POINT,25,CATLIT,BYTE,9,4,"[20000, 50000, 200000, 1000000]","[{""value"": ""5"", ""count"": 5}, {""value"": ""8"", ""count"": 2}, {""value"": ""6"", ""count"": 1}, {""value"": ""11"", ""count"": 1}]" +86,LIGHTS,POINT,59,COLOUR,LIST,93,6,"[20000, 50000, 200000, 1000000]","[{""value"": ""[6]"", ""count"": 28}, {""value"": ""[4]"", ""count"": 23}, {""value"": ""[3]"", ""count"": 23}, {""value"": ""[1]"", ""count"": 15}, {""value"": ""[1,1,4]"", ""count"": 2}, {""value"": ""[1,4]"", ""count"": 2}]" +86,LIGHTS,POINT,73,HEIGHT,REAL,50,16,"[20000, 50000, 200000, 1000000]","[{""value"": ""12"", ""count"": 10}, {""value"": ""14"", ""count"": 6}, {""value"": ""57"", ""count"": 4}, {""value"": ""11"", ""count"": 4}, {""value"": ""5"", ""count"": 4}, {""value"": ""9"", ""count"": 3}, {""value"": ""17"", ""count"": 3}, {""value"": ""22"", ""count"": 3}, {""value"": ""69"", ""count"": 2}, {""value"": ""79"", ""count"": 2}, {""value"": ""7"", ""count"": 2}, {""value"": ""16"", ""count"": 2}, {""value"": ""4"", ""count"": 2}, {""value"": ""8"", ""count"": 1}, {""value"": ""31"", ""count"": 1}, {""value"": ""10"", ""count"": 1}]" +86,LIGHTS,POINT,78,INFORM,STRING,10,5,"[20000, 50000, 200000, 1000000]","[{""value"": ""2 fl in 3s"", ""count"": 4}, {""value"": ""The white light can be apparent on 8M"", ""count"": 2}, {""value"": ""Illuminates Hinode Iwa 430m NNW"", ""count"": 2}, {""value"": ""FW spotlight illuminates Hinode Iwa."", ""count"": 1}, {""value"": ""More than one"", ""count"": 1}]" +86,LIGHTS,POINT,58,LITCHR,BYTE,58,4,"[20000, 50000, 200000, 1000000]","[{""value"": ""2"", ""count"": 35}, {""value"": ""7"", ""count"": 13}, {""value"": ""1"", ""count"": 6}, {""value"": ""19"", ""count"": 4}]" +86,LIGHTS,POINT,80,OBJNAM,STRING,7,6,[20000],"[{""value"": ""C1"", ""count"": 2}, {""value"": ""C2"", ""count"": 1}, {""value"": ""R1"", ""count"": 1}, {""value"": ""R2"", ""count"": 1}, {""value"": ""L1"", ""count"": 1}, {""value"": ""L2"", ""count"": 1}]" +86,LIGHTS,POINT,93,QUAVEM,BYTE,12,1,[50000],"[{""value"": ""1"", ""count"": 12}]" +86,LIGHTS,POINT,100,SECTR1,WORD10,6,2,[20000],"[{""value"": ""228"", ""count"": 3}, {""value"": ""48"", ""count"": 3}]" +86,LIGHTS,POINT,101,SECTR2,WORD10,6,2,[20000],"[{""value"": ""48"", ""count"": 3}, {""value"": ""228"", ""count"": 3}]" +86,LIGHTS,POINT,72,SIGGRP,STRING,52,2,"[20000, 50000, 200000, 1000000]","[{""value"": ""(1)"", ""count"": 38}, {""value"": ""(2)"", ""count"": 14}]" +86,LIGHTS,POINT,86,SIGPER,WORD10,46,7,"[20000, 50000, 200000, 1000000]","[{""value"": ""3"", ""count"": 10}, {""value"": ""6"", ""count"": 10}, {""value"": ""4"", ""count"": 7}, {""value"": ""9"", ""count"": 6}, {""value"": ""5"", ""count"": 5}, {""value"": ""10"", ""count"": 4}, {""value"": ""8"", ""count"": 4}]" +86,LIGHTS,POINT,108,SORIND,STRING,14,14,"[20000, 50000]","[{""value"": ""GB,MDHS,graph,LL F-6624.7.C"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6624.7.D"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6624.7.E"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6624.7.F"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6624.7.A"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6624.7.B"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6623.2.A"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6624.62"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6624.621"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6624.64"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6624.641"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6624.63"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6624.631"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6624.5"", ""count"": 1}]" +86,LIGHTS,POINT,109,STATUS,LIST,26,1,"[20000, 50000]","[{""value"": ""[8]"", ""count"": 26}]" +86,LIGHTS,POINT,115,VALNMR,WORD10,45,7,"[20000, 50000, 200000, 1000000]","[{""value"": ""4"", ""count"": 16}, {""value"": ""6"", ""count"": 7}, {""value"": ""3"", ""count"": 7}, {""value"": ""5"", ""count"": 7}, {""value"": ""19"", ""count"": 4}, {""value"": ""7"", ""count"": 3}, {""value"": ""2"", ""count"": 1}]" +81,LNDARE,AREA,80,OBJNAM,STRING,3,3,"[20000, 1000000]","[{""value"": ""Honshu"", ""count"": 1}, {""value"": ""Todo Shima"", ""count"": 1}, {""value"": ""Hinode Iwa"", ""count"": 1}]" +95,MONUMT,POINT,65,CONVIS,BYTE,2,1,[20000],"[{""value"": ""2"", ""count"": 2}]" +96,MORFAC,AREA,29,CATMOR,BYTE,2,1,[20000],"[{""value"": ""1"", ""count"": 2}]" +96,MORFAC,AREA,78,INFORM,STRING,2,1,[20000],"[{""value"": ""Always dry"", ""count"": 2}]" +96,MORFAC,POINT,29,CATMOR,BYTE,7,1,[50000],"[{""value"": ""1"", ""count"": 7}]" +96,MORFAC,POINT,78,INFORM,STRING,1,1,[50000],"[{""value"": ""Always dry"", ""count"": 1}]" +210,M_PROD,AREA,150,CPDATE,STRING,7,5,"[20000, 50000, 100000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""20080102"", ""count"": 2}, {""value"": ""20060322"", ""count"": 2}, {""value"": ""20141006"", ""count"": 1}, {""value"": ""20140602"", ""count"": 1}, {""value"": ""20140505"", ""count"": 1}]" +97,NATARE,AREA,78,INFORM,STRING,3,1,"[20000, 200000, 1000000]","[{""value"": ""Jeppesen adopts \""International Boundaries and National Limits\"" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation."", ""count"": 3}]" +97,NATARE,AREA,81,NATION,STRING,3,1,"[20000, 200000, 1000000]","[{""value"": ""JP"", ""count"": 3}]" +99,OBSTRN,AREA,78,INFORM,STRING,3,2,[50000],"[{""value"": ""Crib|Caissons"", ""count"": 2}, {""value"": ""Crib|Caisson Area"", ""count"": 1}]" +99,OBSTRN,AREA,116,VALSOU,WORD10,3,3,[50000],"[{""value"": ""4.9"", ""count"": 1}, {""value"": ""1.2"", ""count"": 1}, {""value"": ""1.5"", ""count"": 1}]" +99,OBSTRN,AREA,124,WATLEV,BYTE,70,1,"[20000, 50000, 200000, 1000000]","[{""value"": ""3"", ""count"": 70}]" +99,OBSTRN,POINT,69,EXPSOU,BYTE,1,1,[20000],"[{""value"": ""2"", ""count"": 1}]" +99,OBSTRN,POINT,78,INFORM,STRING,2,1,"[20000, 200000]","[{""value"": ""Wave Meter"", ""count"": 2}]" +99,OBSTRN,POINT,116,VALSOU,WORD10,6,4,"[20000, 50000, 200000]","[{""value"": ""25"", ""count"": 2}, {""value"": ""1.5"", ""count"": 2}, {""value"": ""1.2"", ""count"": 1}, {""value"": ""4.9"", ""count"": 1}]" +99,OBSTRN,POINT,124,WATLEV,BYTE,6,1,"[20000, 50000, 200000]","[{""value"": ""3"", ""count"": 6}]" +103,PILPNT,POINT,78,INFORM,STRING,9,2,"[20000, 50000]","[{""value"": ""Always dry"", ""count"": 8}, {""value"": ""Private"", ""count"": 1}]" +107,PIPSOL,LINE,35,CATPIP,BYTE,2,1,"[20000, 50000]","[{""value"": ""1"", ""count"": 2}]" +107,PIPSOL,LINE,78,INFORM,STRING,1,1,[50000],"[{""value"": ""PIPELINES|Mariners are advised not to anchor or trawl in the vicinity of pipelines. Gas from a damaged oil or gas pipeline could cause an explosion, loss of a vessels buoyancy or other serious hazard. Pipelines are not always buried and may effectively reduce the charted depth by up to 2 metres. They may also span seabed undulations and cause fishing gear to become irrecoverably snagged, putting a vessel in severe danger. See Annual Notice to Mariners No 24 and The Mariners Handbook."", ""count"": 1}]" +107,PIPSOL,LINE,89,PRODCT,LIST,2,2,"[20000, 50000]","[{""value"": ""[1]"", ""count"": 1}, {""value"": ""[2]"", ""count"": 1}]" +111,PRDINS,AREA,78,INFORM,STRING,15,4,[20000],"[{""value"": ""Tank farm"", ""count"": 9}, {""value"": ""Production area"", ""count"": 3}, {""value"": ""Production area|Silo farm"", ""count"": 2}, {""value"": ""Tank farm|Oil Tank Yard"", ""count"": 1}]" +111,PRDINS,AREA,80,OBJNAM,STRING,3,3,[20000],"[{""value"": ""Mitsubishi Paper Mills Limited"", ""count"": 1}, {""value"": ""Tokyotekko Co., Ltd."", ""count"": 1}, {""value"": ""Yoshida Sangyo Corporation"", ""count"": 1}]" +111,PRDINS,AREA,89,PRODCT,LIST,1,1,[20000],"[{""value"": ""[1]"", ""count"": 1}]" +111,PRDINS,POINT,78,INFORM,STRING,12,1,[20000],"[{""value"": ""Production area"", ""count"": 12}]" +111,PRDINS,POINT,80,OBJNAM,STRING,12,11,[20000],"[{""value"": ""Pacific Metals CO., LTD."", ""count"": 2}, {""value"": ""Tozai Oilterminal Co.,Ltd."", ""count"": 1}, {""value"": ""Tohoku Satetsu"", ""count"": 1}, {""value"": ""MRC Unitec Co., Ltd."", ""count"": 1}, {""value"": ""Toshin Steel Industry"", ""count"": 1}, {""value"": ""Hachinohe Gas Co., Ltd."", ""count"": 1}, {""value"": ""Koshuha Foundry Co., Ltd."", ""count"": 1}, {""value"": ""Sumimetal Mining Co., Ltd."", ""count"": 1}, {""value"": ""Hachinohe Smelting Co., Ltd."", ""count"": 1}, {""value"": ""Kitanihon Shipbuilding Co., Ltd."", ""count"": 1}, {""value"": ""JX Nippon Oil & Energy Corporation"", ""count"": 1}]" +111,PRDINS,POINT,89,PRODCT,LIST,2,2,[20000],"[{""value"": ""[1]"", ""count"": 1}, {""value"": ""[2]"", ""count"": 1}]" +111,PRDINS,POINT,91,QUAPOS,BYTE,11,1,[20000],"[{""value"": ""4"", ""count"": 11}]" +112,PYLONS,POINT,78,INFORM,STRING,2,1,[50000],"[{""value"": ""Power transmission pylon/pole"", ""count"": 2}]" +129,RIVERS,AREA,80,OBJNAM,STRING,3,3,"[20000, 200000]","[{""value"": ""Mabechi River"", ""count"": 1}, {""value"": ""Oirase River"", ""count"": 1}, {""value"": ""Gonohe Kawa"", ""count"": 1}]" +118,RTPBCN,POINT,38,CATRTB,BYTE,1,1,[50000],"[{""value"": ""1"", ""count"": 1}]" +118,RTPBCN,POINT,108,SORIND,STRING,1,1,[50000],"[{""value"": ""GB,MDHS,graph,LL F-6620.A"", ""count"": 1}]" +138,SBDARE,AREA,82,NATSUR,LIST,9,3,"[20000, 50000, 200000]","[{""value"": ""[9]"", ""count"": 5}, {""value"": ""[4]"", ""count"": 3}, {""value"": ""[5]"", ""count"": 1}]" +138,SBDARE,POINT,90,NATQUA,LIST,145,2,"[20000, 50000, 200000]","[{""value"": ""[1]"", ""count"": 144}, {""value"": ""[3]"", ""count"": 1}]" +138,SBDARE,POINT,82,NATSUR,LIST,287,11,"[20000, 50000, 200000]","[{""value"": ""[4]"", ""count"": 176}, {""value"": ""[1]"", ""count"": 54}, {""value"": ""[9]"", ""count"": 15}, {""value"": ""[5]"", ""count"": 14}, {""value"": ""[4,17]"", ""count"": 9}, {""value"": ""[1,4]"", ""count"": 8}, {""value"": ""[4,1]"", ""count"": 7}, {""value"": ""[6,17,61]"", ""count"": 1}, {""value"": ""[1,4,17]"", ""count"": 1}, {""value"": ""[1,6]"", ""count"": 1}, {""value"": ""[1,4,5]"", ""count"": 1}]" +136,SEAARE,AREA,80,OBJNAM,STRING,2,2,[200000],"[{""value"": ""North Pacific Ocean"", ""count"": 1}, {""value"": ""Hamanaka"", ""count"": 1}]" +142,SILBUI,POINT,78,INFORM,STRING,3,3,[50000],"[{""value"": ""More than one"", ""count"": 1}, {""value"": ""more than one"", ""count"": 1}, {""value"": ""SILOS"", ""count"": 1}]" +142,SILBUI,POINT,91,QUAPOS,BYTE,2,1,[50000],"[{""value"": ""4"", ""count"": 2}]" +140,SISTAT,POINT,47,CATSIT,LIST,2,1,[20000],"[{""value"": ""[2]"", ""count"": 2}]" +141,SISTAW,POINT,48,CATSIW,LIST,1,1,[20000],"[{""value"": ""[10]"", ""count"": 1}]" +139,SLCONS,AREA,46,CATSLC,BYTE,48,3,"[20000, 50000]","[{""value"": ""1"", ""count"": 34}, {""value"": ""6"", ""count"": 10}, {""value"": ""4"", ""count"": 4}]" +139,SLCONS,AREA,63,CONDTN,BYTE,9,2,"[20000, 50000]","[{""value"": ""2"", ""count"": 8}, {""value"": ""3"", ""count"": 1}]" +139,SLCONS,AREA,78,INFORM,STRING,1,1,[50000],"[{""value"": ""Source date: 2005"", ""count"": 1}]" +139,SLCONS,AREA,83,NATCON,LIST,78,1,"[20000, 50000]","[{""value"": ""[3]"", ""count"": 78}]" +139,SLCONS,AREA,80,OBJNAM,STRING,29,25,"[20000, 50000]","[{""value"": ""Hattaro North Breakwater"", ""count"": 3}, {""value"": ""Middle Breakwater"", ""count"": 2}, {""value"": ""Hattaro East Breakwater"", ""count"": 2}, {""value"": ""West Breakwater"", ""count"": 1}, {""value"": ""Grain Terminal"", ""count"": 1}, {""value"": ""No 4 Wharf"", ""count"": 1}, {""value"": ""No 3 Wharf"", ""count"": 1}, {""value"": ""No 1 Wharf"", ""count"": 1}, {""value"": ""No 2 Wharf"", ""count"": 1}, {""value"": ""Kawaragi No 2 Wharf"", ""count"": 1}, {""value"": ""No 2 Middle Breakwater"", ""count"": 1}, {""value"": ""Shirogane West Breakwater"", ""count"": 1}, {""value"": ""Japan Maritime Self Defense Force Quay"", ""count"": 1}, {""value"": ""Ichikawa East Breakwater"", ""count"": 1}, {""value"": ""Shirogane North Breakwater"", ""count"": 1}, {""value"": ""Grain Terminal Pier"", ""count"": 1}, {""value"": ""Ichikawa North Breakwater"", ""count"": 1}, {""value"": ""Ferry Wharf"", ""count"": 1}, {""value"": ""Mitsubishi Paper Mills Limited Quay"", ""count"": 1}, {""value"": ""Kabu Island Breakwater"", ""count"": 1}, {""value"": ""Shirogane Wharf"", ""count"": 1}, {""value"": ""Kawaragi South Breakwater"", ""count"": 1}, {""value"": ""Kawaragi West Breakwater"", ""count"": 1}, {""value"": ""Hachinohe Smelting Quay"", ""count"": 1}, {""value"": ""Kawaragi Breakwater"", ""count"": 1}]" +139,SLCONS,AREA,124,WATLEV,BYTE,110,3,"[20000, 50000]","[{""value"": ""2"", ""count"": 100}, {""value"": ""4"", ""count"": 9}, {""value"": ""3"", ""count"": 1}]" +139,SLCONS,LINE,46,CATSLC,BYTE,3,1,[50000],"[{""value"": ""6"", ""count"": 3}]" +139,SLCONS,LINE,63,CONDTN,BYTE,5,1,"[20000, 200000]","[{""value"": ""2"", ""count"": 5}]" +139,SLCONS,LINE,78,INFORM,STRING,2,1,[50000],"[{""value"": ""Land Area"", ""count"": 2}]" +139,SLCONS,LINE,80,OBJNAM,STRING,3,3,[50000],"[{""value"": ""No 3"", ""count"": 1}, {""value"": ""Kawaragi No 1"", ""count"": 1}, {""value"": ""Kawaragi No 2"", ""count"": 1}]" +139,SLCONS,LINE,124,WATLEV,BYTE,204,1,"[20000, 50000, 200000, 1000000]","[{""value"": ""2"", ""count"": 204}]" +143,SLIPWY,AREA,80,OBJNAM,STRING,1,1,[20000],"[{""value"": ""Ichikawa Slipway"", ""count"": 1}]" +143,SLIPWY,AREA,124,WATLEV,BYTE,3,2,"[20000, 50000]","[{""value"": ""4"", ""count"": 2}, {""value"": ""2"", ""count"": 1}]" +155,TESARE,AREA,78,INFORM,STRING,3,1,"[20000, 200000, 1000000]","[{""value"": ""Jeppesen adopts \""International Boundaries and National Limits\"" as defined by international standards from sources, such as government provided official charts and other official documents. Due to the resolution of information provided, as well as the age of underlying surveys or publication dates, the reference datum used or its conversion, inaccuracies in the position or the form of these boundaries and limits may exist and as such may not be relied on as a primary source of information. Therefore Jeppesen cannot accept any liability regarding the use of this data for navigation."", ""count"": 3}]" +155,TESARE,AREA,81,NATION,STRING,3,1,"[20000, 200000, 1000000]","[{""value"": ""JP"", ""count"": 3}]" +158,TOWERS,POINT,52,CATTOW,BYTE,51,3,"[20000, 50000, 200000, 1000000]","[{""value"": ""1"", ""count"": 22}, {""value"": ""3"", ""count"": 19}, {""value"": ""2"", ""count"": 10}]" +158,TOWERS,POINT,59,COLOUR,LIST,22,1,"[20000, 50000, 200000, 1000000]","[{""value"": ""[1]"", ""count"": 22}]" +158,TOWERS,POINT,65,CONVIS,BYTE,27,2,"[20000, 50000, 200000, 1000000]","[{""value"": ""1"", ""count"": 23}, {""value"": ""2"", ""count"": 4}]" +158,TOWERS,POINT,73,HEIGHT,REAL,2,2,[20000],"[{""value"": ""51"", ""count"": 1}, {""value"": ""53"", ""count"": 1}]" +158,TOWERS,POINT,78,INFORM,STRING,7,3,"[20000, 50000]","[{""value"": ""Radio"", ""count"": 4}, {""value"": ""Ice Supply Tower"", ""count"": 2}, {""value"": ""Framework tower"", ""count"": 1}]" +158,TOWERS,POINT,83,NATCON,LIST,12,1,"[20000, 50000, 200000, 1000000]","[{""value"": ""[2]"", ""count"": 12}]" +158,TOWERS,POINT,91,QUAPOS,BYTE,6,1,"[20000, 50000]","[{""value"": ""4"", ""count"": 6}]" +158,TOWERS,POINT,108,SORIND,STRING,22,17,"[20000, 50000, 200000, 1000000]","[{""value"": ""GB,UKHO,graph,LL M-6620"", ""count"": 3}, {""value"": ""GB,UKHO,graph,LL M-6621"", ""count"": 2}, {""value"": ""GB,UKHO,graph,LL M-6625.5"", ""count"": 2}, {""value"": ""GB,UKHO,graph,LL M-6624.86"", ""count"": 2}, {""value"": ""GB,UKHO,graph,LL M-6619.5"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6618.4"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6625.7"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6624.85"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6623.2"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6621"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6622"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6625.5"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6620"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6624.4"", ""count"": 1}, {""value"": ""GB,MDHS,graph,LL F-6624.85"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6622"", ""count"": 1}, {""value"": ""GB,UKHO,graph,LL M-6624.4"", ""count"": 1}]" +158,TOWERS,POINT,122,VERLEN,REAL,22,7,"[20000, 50000, 200000, 1000000]","[{""value"": ""9"", ""count"": 7}, {""value"": ""23"", ""count"": 4}, {""value"": ""10"", ""count"": 4}, {""value"": ""5"", ""count"": 3}, {""value"": ""16"", ""count"": 2}, {""value"": ""6"", ""count"": 1}, {""value"": ""8"", ""count"": 1}]" +168,UWTROC,POINT,69,EXPSOU,BYTE,3,1,[50000],"[{""value"": ""2"", ""count"": 3}]" +168,UWTROC,POINT,116,VALSOU,WORD10,104,69,"[20000, 50000, 200000]","[{""value"": ""15"", ""count"": 5}, {""value"": ""9.9"", ""count"": 4}, {""value"": ""2.6"", ""count"": 4}, {""value"": ""4.4"", ""count"": 4}, {""value"": ""2"", ""count"": 4}, {""value"": ""17"", ""count"": 3}, {""value"": ""18"", ""count"": 3}, {""value"": ""19"", ""count"": 3}, {""value"": ""21"", ""count"": 3}, {""value"": ""0.3"", ""count"": 2}, {""value"": ""1.7"", ""count"": 2}, {""value"": ""2.2"", ""count"": 2}, {""value"": ""4.1"", ""count"": 2}, {""value"": ""0.7"", ""count"": 2}, {""value"": ""2.3"", ""count"": 2}, {""value"": ""7.7"", ""count"": 2}, {""value"": ""7.8"", ""count"": 2}, {""value"": ""8.8"", ""count"": 2}, {""value"": ""16"", ""count"": 2}, {""value"": ""20"", ""count"": 2}, {""value"": ""0.5"", ""count"": 1}, {""value"": ""0.8"", ""count"": 1}, {""value"": ""1.4"", ""count"": 1}, {""value"": ""1.6"", ""count"": 1}, {""value"": ""2.5"", ""count"": 1}, {""value"": ""2.7"", ""count"": 1}, {""value"": ""3.1"", ""count"": 1}, {""value"": ""4"", ""count"": 1}, {""value"": ""4.7"", ""count"": 1}, {""value"": ""4.8"", ""count"": 1}, {""value"": ""5.7"", ""count"": 1}, {""value"": ""5.9"", ""count"": 1}, {""value"": ""6.2"", ""count"": 1}, {""value"": ""6.3"", ""count"": 1}, {""value"": ""6.5"", ""count"": 1}, {""value"": ""6.8"", ""count"": 1}, {""value"": ""6.9"", ""count"": 1}, {""value"": ""7"", ""count"": 1}, {""value"": ""7.3"", ""count"": 1}, {""value"": ""7.4"", ""count"": 1}]" +168,UWTROC,POINT,124,WATLEV,BYTE,176,3,"[20000, 50000, 200000, 1000000]","[{""value"": ""3"", ""count"": 110}, {""value"": ""2"", ""count"": 56}, {""value"": ""4"", ""count"": 10}]" +176,WRECKS,AREA,57,CATWRK,BYTE,1,1,[20000],"[{""value"": ""2"", ""count"": 1}]" +176,WRECKS,AREA,116,VALSOU,WORD10,1,1,[20000],"[{""value"": ""7"", ""count"": 1}]" +176,WRECKS,AREA,124,WATLEV,BYTE,1,1,[20000],"[{""value"": ""3"", ""count"": 1}]" +176,WRECKS,POINT,57,CATWRK,BYTE,479,2,"[20000, 50000, 200000]","[{""value"": ""3"", ""count"": 477}, {""value"": ""2"", ""count"": 2}]" +176,WRECKS,POINT,116,VALSOU,WORD10,188,103,"[20000, 50000, 200000]","[{""value"": ""11.2"", ""count"": 7}, {""value"": ""12.2"", ""count"": 5}, {""value"": ""12.6"", ""count"": 5}, {""value"": ""9.6"", ""count"": 4}, {""value"": ""10.2"", ""count"": 4}, {""value"": ""11.1"", ""count"": 4}, {""value"": ""12"", ""count"": 4}, {""value"": ""12.5"", ""count"": 4}, {""value"": ""6.3"", ""count"": 3}, {""value"": ""7"", ""count"": 3}, {""value"": ""7.3"", ""count"": 3}, {""value"": ""8.3"", ""count"": 3}, {""value"": ""9"", ""count"": 3}, {""value"": ""9.5"", ""count"": 3}, {""value"": ""11.4"", ""count"": 3}, {""value"": ""11.9"", ""count"": 3}, {""value"": ""12.3"", ""count"": 3}, {""value"": ""12.7"", ""count"": 3}, {""value"": ""13"", ""count"": 3}, {""value"": ""13.1"", ""count"": 3}, {""value"": ""13.4"", ""count"": 3}, {""value"": ""23.5"", ""count"": 2}, {""value"": ""21.5"", ""count"": 2}, {""value"": ""3"", ""count"": 2}, {""value"": ""3.7"", ""count"": 2}, {""value"": ""4.3"", ""count"": 2}, {""value"": ""5"", ""count"": 2}, {""value"": ""5.1"", ""count"": 2}, {""value"": ""5.7"", ""count"": 2}, {""value"": ""6"", ""count"": 2}, {""value"": ""6.2"", ""count"": 2}, {""value"": ""6.9"", ""count"": 2}, {""value"": ""7.8"", ""count"": 2}, {""value"": ""8.1"", ""count"": 2}, {""value"": ""8.5"", ""count"": 2}, {""value"": ""8.7"", ""count"": 2}, {""value"": ""9.1"", ""count"": 2}, {""value"": ""9.4"", ""count"": 2}, {""value"": ""9.9"", ""count"": 2}, {""value"": ""10.3"", ""count"": 2}]" +176,WRECKS,POINT,124,WATLEV,BYTE,480,1,"[20000, 50000, 200000]","[{""value"": ""3"", ""count"": 480}]" +201,_extgn,POINT,60,COLMAR,BYTE,1,1,[50000],"[{""value"": ""11"", ""count"": 1}]" +201,_extgn,POINT,78,INFORM,STRING,1,1,[50000],"[{""value"": ""Height: 123m|Chimney|Visually conspicuous"", ""count"": 1}]" +217,_m_sor,META,151,CSCALE,LONG,6,6,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""3000000"", ""count"": 1}, {""value"": ""1200000"", ""count"": 1}, {""value"": ""250000"", ""count"": 1}, {""value"": ""20000"", ""count"": 1}, {""value"": ""12000"", ""count"": 1}, {""value"": ""20000000"", ""count"": 1}]" +217,_m_sor,META,75,HORDAT,BYTE,6,1,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""2"", ""count"": 6}]" +217,_m_sor,META,84,MARSYS,BYTE,6,2,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""2"", ""count"": 4}, {""value"": ""1"", ""count"": 2}]" +217,_m_sor,META,156,NMDATE,STRING,6,5,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""20021101"", ""count"": 2}, {""value"": ""20140926"", ""count"": 1}, {""value"": ""20140523"", ""count"": 1}, {""value"": ""20060323"", ""count"": 1}, {""value"": ""20140328"", ""count"": 1}]" +217,_m_sor,META,96,RECDAT,STRING,6,5,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""20080102"", ""count"": 2}, {""value"": ""20141006"", ""count"": 1}, {""value"": ""20140602"", ""count"": 1}, {""value"": ""20060322"", ""count"": 1}, {""value"": ""20140505"", ""count"": 1}]" +217,_m_sor,META,108,SORIND,STRING,6,6,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""IT,CMAP,graph,W-135"", ""count"": 1}, {""value"": ""JP,JHOD,graph,W1154"", ""count"": 1}, {""value"": ""JP,JHOD,graph,W53"", ""count"": 1}, {""value"": ""GB,MDHS,graph,2959B"", ""count"": 1}, {""value"": ""JP,JHOD,graph,W65"", ""count"": 1}, {""value"": ""IT,CMAP,graph,W-14"", ""count"": 1}]" +217,_m_sor,META,121,VERDAT,BYTE,4,2,"[20000, 50000, 200000, 1000000]","[{""value"": ""11"", ""count"": 3}, {""value"": ""10"", ""count"": 1}]" +217,_m_sor,META,173,_chcod,STRING,6,6,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""90-01520"", ""count"": 1}, {""value"": ""31-0F270"", ""count"": 1}, {""value"": ""31-0F710"", ""count"": 1}, {""value"": ""31-0684B"", ""count"": 1}, {""value"": ""31-0F700"", ""count"": 1}, {""value"": ""90-00310"", ""count"": 1}]" +217,_m_sor,META,174,_dgdat,STRING,6,5,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""20000101"", ""count"": 2}, {""value"": ""20081003"", ""count"": 1}, {""value"": ""20070914"", ""count"": 1}, {""value"": ""20030320"", ""count"": 1}, {""value"": ""20120313"", ""count"": 1}]" +217,_m_sor,META,180,_hvdat,BYTE,4,2,"[20000, 50000, 200000, 1000000]","[{""value"": ""3"", ""count"": 3}, {""value"": ""21"", ""count"": 1}]" +217,_m_sor,META,175,_quart,BYTE,6,1,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""4"", ""count"": 6}]" +217,_m_sor,META,177,_sorhd,BYTE,6,1,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""2"", ""count"": 6}]" +217,_m_sor,META,178,_wgsox,REAL,6,1,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""0"", ""count"": 6}]" +217,_m_sor,META,179,_wgsoy,REAL,6,1,"[20000, 50000, 200000, 1000000, 3000000, 20000000]","[{""value"": ""0"", ""count"": 6}]" +198,_texto,POINT,139,_texta,COMPLEX,113,104,"[20000, 50000, 200000, 1000000, 3000000]","[{""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Same Kado\""}"", ""count"": 3}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Hachinohe\""}"", ""count"": 3}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Hachinohe Fishing Harbour\""}"", ""count"": 3}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Misawa\""}"", ""count"": 2}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Hamanaka\""}"", ""count"": 2}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Hashimukai\""}"", ""count"": 2}, {""value"": ""{\""prefix\"":[128,12,0],\""text\"":\""HACHINOHE\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""AOMORI\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Hachinohe Ko\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Kabayama Reef\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Hitokawame\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Mikawame\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Minato\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Oirase Town\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Okuki\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Same\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""Shirahama\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""CONVEYOR\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""H A C H I T A R O\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""HACHINOHE\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[16,12,0],\""text\"":\""HACHINOHE\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""HINODE IWA(ILLUM)\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""HOUSE\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""K A W A R A G I\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""KABAYAMA NE\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""KABU SH.\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""KO NE\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""MABECHI KAWA\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""MITSUBUSHI JETTY\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""MONOMIWA\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""N. BREAKWATER\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""NIIDA KAWA\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""No 1 WHARF\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""No 2 WHARF\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""No 4 WHARF\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""O SAKI\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""OGOMUNE\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""SAME KADO\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""SHIROGANE WHARF\""}"", ""count"": 1}, {""value"": ""{\""prefix\"":[0,12,0],\""text\"":\""SILOS\""}"", ""count"": 1}]" diff --git a/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/摘要_v1.txt b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/摘要_v1.txt new file mode 100644 index 0000000..125ecbe --- /dev/null +++ b/cm95_selected_aoi_mapping_audit_dataset_1_20260903_083030/摘要_v1.txt @@ -0,0 +1,23 @@ +CM95 选定 AOI → NavSea PBF 映射输入审计 v2 +==================================================================================== +Dataset ID : 1 +Tile : z10/914/385 +BBox WGS84 : 141.3281250000,40.4469470596 → 141.6796875000,40.7139558263 + +AOI cells : 7 +AOI spatial features : 3605 +Object class/geom groups : 80 +Attribute groups : 177 +Feature samples : 600 +Related samples : 0 + +Geometry counts: + POINT 1632 + LINE 970 + AREA 993 + SOUNDING 4 + META 6 + +NEXT: + 上传本脚本生成的 ZIP。 + 下一步直接生成 cm95_to_navsea_v1.yaml 初版并标注 UNMAPPED / hard_gate 缺口。 \ No newline at end of file diff --git a/config/mappings/cm95_gap_disposition_japan_dataset_1_v1.yaml b/config/mappings/cm95_gap_disposition_japan_dataset_1_v1.yaml new file mode 100644 index 0000000..a93c37c --- /dev/null +++ b/config/mappings/cm95_gap_disposition_japan_dataset_1_v1.yaml @@ -0,0 +1,1502 @@ +schema: navsea.cm95.gap-disposition/v1 +version: v1.4.5-japan-dataset-1 +dataset_id: 1 +source_audit: build/production/cm95_global_mapping_gap_audit_dataset_1.json +policy: 正确 Japan Dataset 1 的显式 gap 分类。所有当前观察到的 gap variant 必须有明确 disposition;pending 仅表示明确的工程/语义 backlog,绝非静默丢弃。 +summary: + observed_gap_variants: 165 + unclassified_variants: 0 + delivery_mapped_v1_4_3: 0 + existing_explicit_non_delivery: 28 + pending_semantic_review: 137 + delivery_mapped_v1_4_3_feature_rows: 0 + existing_explicit_non_delivery_feature_rows: 127265 + pending_semantic_review_feature_rows: 90009 + new_japan_variants_classified: 25 + new_japan_variant_feature_rows: 869 +variants: +- object_class_id: 198 + object_class: _texto + geometry_type: POINT + feature_count: 58838 + dictionary_description: Text + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_CONDITIONAL + safety_class: normal + disposition: EXISTING_REVIEW_CONDITIONAL + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 193 + object_class: $LINES + geometry_type: LINE + feature_count: 22513 + dictionary_description: Cartographic line + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 129 + object_class: RIVERS + geometry_type: LINE + feature_count: 17615 + dictionary_description: River + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 157 + object_class: TOPMAR + geometry_type: POINT + feature_count: 11166 + dictionary_description: Top mark + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 29 + object_class: CTNARE + geometry_type: POINT + feature_count: 8566 + dictionary_description: Caution area + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_CONDITIONAL + safety_class: important + disposition: EXISTING_REVIEW_CONDITIONAL + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 144 + object_class: SLOTOP + geometry_type: LINE + feature_count: 7552 + dictionary_description: Slope topline + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 18 + object_class: BOYLAT + geometry_type: POINT + feature_count: 5565 + dictionary_description: Buoy, lateral + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 82 + object_class: LNDELV + geometry_type: POINT + feature_count: 5418 + dictionary_description: Land elevation + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 145 + object_class: SLOGRD + geometry_type: AREA + feature_count: 5181 + dictionary_description: Sloping ground + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 29 + object_class: CTNARE + geometry_type: AREA + feature_count: 4739 + dictionary_description: Caution area + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_CONDITIONAL + safety_class: important + disposition: EXISTING_REVIEW_CONDITIONAL + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 14 + object_class: BUAARE + geometry_type: AREA + feature_count: 4713 + dictionary_description: Built-up area + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 201 + object_class: _extgn + geometry_type: POINT + feature_count: 3962 + dictionary_description: Extended navigational aid, generic + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: important + disposition: EXISTING_ENGINEERING_COMPONENT + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 83 + object_class: LNDRGN + geometry_type: AREA + feature_count: 3624 + dictionary_description: Land region + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 194 + object_class: $AREAS + geometry_type: AREA + feature_count: 3192 + dictionary_description: Cartographic area + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 38 + object_class: CTRPNT + geometry_type: POINT + feature_count: 2508 + dictionary_description: Control point + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 13 + object_class: BUISGL + geometry_type: POINT + feature_count: 2096 + dictionary_description: Building, single + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_UNMAPPED_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 128 + object_class: RESARE + geometry_type: AREA + feature_count: 1986 + dictionary_description: Restricted area + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 153 + object_class: TNKCON + geometry_type: POINT + feature_count: 1868 + dictionary_description: Tank + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 112 + object_class: PYLONS + geometry_type: POINT + feature_count: 1667 + dictionary_description: Pylon + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 92 + object_class: MARCUL + geometry_type: AREA + feature_count: 1590 + dictionary_description: Marine farm/culture + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 162 + object_class: TSSLPT + geometry_type: AREA + feature_count: 1560 + dictionary_description: Traffic separation scheme lane part + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 97 + object_class: NATARE + geometry_type: AREA + feature_count: 1516 + dictionary_description: National territorial area + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 12 + object_class: BUIREL + geometry_type: POINT + feature_count: 1505 + dictionary_description: Building, religious + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 191 + object_class: $COMPS + geometry_type: POINT + feature_count: 1494 + dictionary_description: Compass + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 210 + object_class: M_PROD + geometry_type: AREA + feature_count: 1492 + dictionary_description: Production information + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 172 + object_class: WEDKLP + geometry_type: POINT + feature_count: 1469 + dictionary_description: Weed/Kelp + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 132 + object_class: ROADPT + geometry_type: LINE + feature_count: 1408 + dictionary_description: Road part + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 72 + object_class: HRBARE + geometry_type: AREA + feature_count: 1385 + dictionary_description: Harbour area (administrative) + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_CONDITIONAL + safety_class: normal + disposition: EXISTING_REVIEW_CONDITIONAL + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 171 + object_class: WATTUR + geometry_type: POINT + feature_count: 1372 + dictionary_description: Water turbulence + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 116 + object_class: RADRFL + geometry_type: POINT + feature_count: 1368 + dictionary_description: Radar reflector + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 120 + object_class: RDOSTA + geometry_type: POINT + feature_count: 1212 + dictionary_description: Radio station + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 62 + object_class: FSHFAC + geometry_type: LINE + feature_count: 1201 + dictionary_description: Fishing facility + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 125 + object_class: RECTRC + geometry_type: LINE + feature_count: 1197 + dictionary_description: Recommended track + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 41 + object_class: DAMCON + geometry_type: AREA + feature_count: 1083 + dictionary_description: Dam + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 39 + object_class: CRANES + geometry_type: POINT + feature_count: 1051 + dictionary_description: Crane + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 155 + object_class: TESARE + geometry_type: AREA + feature_count: 1017 + dictionary_description: Territorial sea area + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 109 + object_class: PONTON + geometry_type: AREA + feature_count: 1011 + dictionary_description: Pontoon + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 169 + object_class: VEGARE + geometry_type: AREA + feature_count: 895 + dictionary_description: Vegetation area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 160 + object_class: TSSBND + geometry_type: LINE + feature_count: 824 + dictionary_description: Traffic separation scheme boundary + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 98 + object_class: NAVLNE + geometry_type: LINE + feature_count: 815 + dictionary_description: Navigation line + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 15 + object_class: BOYCAR + geometry_type: POINT + feature_count: 692 + dictionary_description: Buoy, cardinal + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 3 + object_class: ACHBRT + geometry_type: POINT + feature_count: 651 + dictionary_description: Anchor berth + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 57 + object_class: FAIRWY + geometry_type: AREA + feature_count: 645 + dictionary_description: Fairway + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: important + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 143 + object_class: SLIPWY + geometry_type: LINE + feature_count: 616 + dictionary_description: Slipway + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 111 + object_class: PRDINS + geometry_type: POINT + feature_count: 605 + dictionary_description: Production installation + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 134 + object_class: SLTPAN + geometry_type: AREA + feature_count: 603 + dictionary_description: Salt pan + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 19 + object_class: BOYSAW + geometry_type: POINT + feature_count: 577 + dictionary_description: Buoy, safe water + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 67 + object_class: FOGSIG + geometry_type: POINT + feature_count: 540 + dictionary_description: Fog signal + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 6 + object_class: BCNISD + geometry_type: POINT + feature_count: 477 + dictionary_description: Beacon, isolated danger + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 121 + object_class: RAILWY + geometry_type: LINE + feature_count: 477 + dictionary_description: Railway + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 167 + object_class: TWRTPT + geometry_type: AREA + feature_count: 462 + dictionary_description: Two-way route part + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Two-way route part;交通流语义与航行安全相关。暂不臆造 delivery mapping,等待专用交通路线图层/样式审查。 +- object_class_id: 151 + object_class: STSLNE + geometry_type: LINE + feature_count: 460 + dictionary_description: Straight territorial sea baseline + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 171 + object_class: WATTUR + geometry_type: AREA + feature_count: 460 + dictionary_description: Water turbulence + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 70 + object_class: GATCON + geometry_type: LINE + feature_count: 393 + dictionary_description: Gate + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 51 + object_class: DRYDOC + geometry_type: AREA + feature_count: 361 + dictionary_description: Dry dock + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 4 + object_class: ACHARE + geometry_type: POINT + feature_count: 359 + dictionary_description: Anchorage area + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 141 + object_class: SISTAW + geometry_type: POINT + feature_count: 358 + dictionary_description: Signal station, warning + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: important + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 56 + object_class: EXEZNE + geometry_type: AREA + feature_count: 357 + dictionary_description: Exclusive economic zone + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 26 + object_class: CANBNK + geometry_type: LINE + feature_count: 356 + dictionary_description: Canal bank + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 5 + object_class: BCNCAR + geometry_type: POINT + feature_count: 326 + dictionary_description: Beacon, cardinal + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 36 + object_class: CONZNE + geometry_type: AREA + feature_count: 321 + dictionary_description: Contiguous zone + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 164 + object_class: TSEZNE + geometry_type: AREA + feature_count: 321 + dictionary_description: Traffic separation zone + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 10 + object_class: BRTFAC + geometry_type: LINE + feature_count: 311 + dictionary_description: Berthing facility + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 135 + object_class: SNDWAV + geometry_type: POINT + feature_count: 301 + dictionary_description: Sand waves + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 140 + object_class: SISTAT + geometry_type: POINT + feature_count: 278 + dictionary_description: Signal station, traffic + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: important + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 205 + object_class: LOCMAG + geometry_type: AREA + feature_count: 265 + dictionary_description: Local magnetic anomaly + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 62 + object_class: FSHFAC + geometry_type: AREA + feature_count: 261 + dictionary_description: Fishing facility + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 112 + object_class: PYLONS + geometry_type: AREA + feature_count: 239 + dictionary_description: Pylon + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 142 + object_class: SILBUI + geometry_type: POINT + feature_count: 236 + dictionary_description: Silo + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 62 + object_class: FSHFAC + geometry_type: POINT + feature_count: 232 + dictionary_description: Fishing facility + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 70 + object_class: GATCON + geometry_type: AREA + feature_count: 231 + dictionary_description: Gate + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 17 + object_class: BOYISD + geometry_type: POINT + feature_count: 227 + dictionary_description: Buoy, isolated danger + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 159 + object_class: TSELNE + geometry_type: LINE + feature_count: 207 + dictionary_description: Traffic separation line + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 92 + object_class: MARCUL + geometry_type: POINT + feature_count: 198 + dictionary_description: Marine farm/culture + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 59 + object_class: FERYRT + geometry_type: LINE + feature_count: 182 + dictionary_description: Ferry route + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 205 + object_class: LOCMAG + geometry_type: POINT + feature_count: 181 + dictionary_description: Local magnetic anomaly + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 110 + object_class: PRCARE + geometry_type: AREA + feature_count: 179 + dictionary_description: Precautionary area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 3 + object_class: ACHBRT + geometry_type: AREA + feature_count: 169 + dictionary_description: Anchor berth + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 39 + object_class: CRANES + geometry_type: AREA + feature_count: 158 + dictionary_description: Crane + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 25 + object_class: CANALS + geometry_type: AREA + feature_count: 156 + dictionary_description: Canal + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 148 + object_class: SPOGRD + geometry_type: AREA + feature_count: 149 + dictionary_description: Spoil ground + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 1 + object_class: AIRARE + geometry_type: POINT + feature_count: 146 + dictionary_description: Airport area + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 95 + object_class: MONUMT + geometry_type: POINT + feature_count: 146 + dictionary_description: Monument + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 172 + object_class: WEDKLP + geometry_type: AREA + feature_count: 144 + dictionary_description: Weed/Kelp + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 117 + object_class: RADSTA + geometry_type: POINT + feature_count: 139 + dictionary_description: Radar station + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 65 + object_class: FLASTK + geometry_type: POINT + feature_count: 138 + dictionary_description: Flare stack + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 52 + object_class: DMPGRD + geometry_type: AREA + feature_count: 137 + dictionary_description: Dumping ground + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 28 + object_class: CAUSWY + geometry_type: LINE + feature_count: 122 + dictionary_description: Causeway + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 2 + object_class: ACHPNT + geometry_type: POINT + feature_count: 121 + dictionary_description: Anchor + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 175 + object_class: WIMCON + geometry_type: POINT + feature_count: 121 + dictionary_description: Windmotor + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 93 + object_class: MSTCON + geometry_type: POINT + feature_count: 117 + dictionary_description: Mast + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 25 + object_class: CANALS + geometry_type: LINE + feature_count: 111 + dictionary_description: Canal + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 100 + object_class: OFSPLF + geometry_type: POINT + feature_count: 106 + dictionary_description: Offshore platform + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 28 + object_class: CAUSWY + geometry_type: AREA + feature_count: 104 + dictionary_description: Causeway + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 66 + object_class: FLODOC + geometry_type: AREA + feature_count: 95 + dictionary_description: Floating dock + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 132 + object_class: ROADPT + geometry_type: AREA + feature_count: 95 + dictionary_description: Road part + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 91 + object_class: LOGPON + geometry_type: AREA + feature_count: 90 + dictionary_description: Log pond + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 34 + object_class: CGUSTA + geometry_type: POINT + feature_count: 79 + dictionary_description: Coastguard station + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 85 + object_class: LNDSTS + geometry_type: AREA + feature_count: 78 + dictionary_description: Landing stairs + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 124 + object_class: RCRTCL + geometry_type: LINE + feature_count: 77 + dictionary_description: Recommended route centreline + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 52 + object_class: DMPGRD + geometry_type: POINT + feature_count: 76 + dictionary_description: Dumping ground + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 119 + object_class: RDOCAL + geometry_type: POINT + feature_count: 75 + dictionary_description: Radio calling-in point + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 135 + object_class: SNDWAV + geometry_type: AREA + feature_count: 74 + dictionary_description: Sand waves + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Sand waves;海底形态可能影响航行判断。暂不臆造 seabed/hazard delivery 语义。 +- object_class_id: 192 + object_class: $CSYMB + geometry_type: POINT + feature_count: 68 + dictionary_description: Cartographic symbol + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 64 + object_class: FLGSTF + geometry_type: POINT + feature_count: 63 + dictionary_description: Flagstaff/Flagpole + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 68 + object_class: FORSTC + geometry_type: POINT + feature_count: 62 + dictionary_description: Fortified structure + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 76 + object_class: ICEARE + geometry_type: AREA + feature_count: 59 + dictionary_description: Ice area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 55 + object_class: DYKCRW + geometry_type: LINE + feature_count: 52 + dictionary_description: Dyke crown + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 127 + object_class: RSCSTA + geometry_type: POINT + feature_count: 51 + dictionary_description: Rescue station + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: important + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 196 + object_class: $TEXTS + geometry_type: POINT + feature_count: 48 + dictionary_description: Text + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 16 + object_class: BOYINB + geometry_type: POINT + feature_count: 45 + dictionary_description: Buoy, installation + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 156 + object_class: TIDEWY + geometry_type: LINE + feature_count: 42 + dictionary_description: Tideway + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Tideway 线状几何;需要专用水道/潮流通道线型语义审查。 +- object_class_id: 46 + object_class: DIFFUS + geometry_type: AREA + feature_count: 36 + dictionary_description: Diffuser + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 23 + object_class: CBLARE + geometry_type: AREA + feature_count: 33 + dictionary_description: Cable area + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 89 + object_class: LITVES + geometry_type: POINT + feature_count: 33 + dictionary_description: Light vessel + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 8 + object_class: BCNSAW + geometry_type: POINT + feature_count: 32 + dictionary_description: Beacon, safe water + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 126 + object_class: RCTLPT + geometry_type: AREA + feature_count: 30 + dictionary_description: Recommended traffic lane part + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Recommended traffic lane part;推荐交通航道区域,需专用 traffic-lane mapping/style。 +- object_class_id: 70 + object_class: GATCON + geometry_type: POINT + feature_count: 28 + dictionary_description: Gate + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 102 + object_class: OILBAR + geometry_type: LINE + feature_count: 27 + dictionary_description: Oil barrier + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 75 + object_class: HULKES + geometry_type: AREA + feature_count: 25 + dictionary_description: Hulk + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 58 + object_class: FNCLNE + geometry_type: LINE + feature_count: 24 + dictionary_description: Fence + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 104 + object_class: PILBOP + geometry_type: AREA + feature_count: 23 + dictionary_description: Pilot boarding place + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 163 + object_class: TSSRON + geometry_type: AREA + feature_count: 22 + dictionary_description: Traffic separation scheme roundabout + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 46 + object_class: DIFFUS + geometry_type: POINT + feature_count: 20 + dictionary_description: Diffuser + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 42 + object_class: DWRTPT + geometry_type: AREA + feature_count: 20 + dictionary_description: Deep water route part + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Deep water route part;深水航路区域,需结合 route/depth 语义专门映射。 +- object_class_id: 165 + object_class: TREPNT + geometry_type: POINT + feature_count: 19 + dictionary_description: Tree + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 54 + object_class: DYKARE + geometry_type: AREA + feature_count: 15 + dictionary_description: Dyke area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 161 + object_class: TSSCRS + geometry_type: AREA + feature_count: 14 + dictionary_description: Traffic separation scheme crossing + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 12 + object_class: BUIREL + geometry_type: AREA + feature_count: 13 + dictionary_description: Building, religious + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 47 + object_class: DSHAER + geometry_type: POINT + feature_count: 13 + dictionary_description: Dish aerial + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 108 + object_class: PIPARE + geometry_type: AREA + feature_count: 13 + dictionary_description: Pipeline area + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 41 + object_class: DAMCON + geometry_type: LINE + feature_count: 12 + dictionary_description: Dam + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Dam 线状几何;可能构成岸线/阻挡结构,需专门 line mapping。 +- object_class_id: 91 + object_class: LOGPON + geometry_type: POINT + feature_count: 10 + dictionary_description: Log pond + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 170 + object_class: WATFAL + geometry_type: POINT + feature_count: 10 + dictionary_description: Waterfall + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 88 + object_class: LITFLT + geometry_type: POINT + feature_count: 9 + dictionary_description: Light float + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Light float;助航设施,需与 LIGHTS/关系组及图标组合语义一起审查。 +- object_class_id: 61 + object_class: FSHZNE + geometry_type: AREA + feature_count: 8 + dictionary_description: Fishery zone + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Fishery zone;样本含大量鱼具/鱼陷阱警告,需 restriction/caution area 语义审查。 +- object_class_id: 156 + object_class: TIDEWY + geometry_type: AREA + feature_count: 8 + dictionary_description: Tideway + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Tideway 面状几何;需要专用水道/潮流通道区域语义审查。 +- object_class_id: 158 + object_class: TOWERS + geometry_type: AREA + feature_count: 8 + dictionary_description: Tower + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 48 + object_class: DISMAR + geometry_type: POINT + feature_count: 6 + dictionary_description: Distance mark + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 74 + object_class: HILARE + geometry_type: AREA + feature_count: 5 + dictionary_description: Hill + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 90 + object_class: LOKBSN + geometry_type: AREA + feature_count: 5 + dictionary_description: Lock basin + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 10 + object_class: BRTFAC + geometry_type: AREA + feature_count: 4 + dictionary_description: Berthing facility + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 30 + object_class: CEMTRY + geometry_type: POINT + feature_count: 4 + dictionary_description: Cemetery + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 68 + object_class: FORSTC + geometry_type: AREA + feature_count: 4 + dictionary_description: Fortified structure + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 71 + object_class: GRIDRN + geometry_type: AREA + feature_count: 4 + dictionary_description: Gridiron + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 94 + object_class: MIPARE + geometry_type: AREA + feature_count: 4 + dictionary_description: Military practice area + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Military practice area;样本含潜艇演习警告,需 restriction-area 专用渲染。 +- object_class_id: 146 + object_class: SMCFAC + geometry_type: POINT + feature_count: 4 + dictionary_description: Small craft facility + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 149 + object_class: SPRING + geometry_type: POINT + feature_count: 4 + dictionary_description: Spring + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 1 + object_class: AIRARE + geometry_type: AREA + feature_count: 3 + dictionary_description: Airport area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 30 + object_class: CEMTRY + geometry_type: AREA + feature_count: 3 + dictionary_description: Cemetery + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 27 + object_class: CTSARE + geometry_type: AREA + feature_count: 3 + dictionary_description: Cargo transhipment area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 101 + object_class: OFSPRD + geometry_type: AREA + feature_count: 3 + dictionary_description: Offshore production area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 113 + object_class: RADDOM + geometry_type: POINT + feature_count: 3 + dictionary_description: Radar dome + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 171 + object_class: WATTUR + geometry_type: LINE + feature_count: 3 + dictionary_description: Water turbulence + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 31 + object_class: CHNWIR + geometry_type: LINE + feature_count: 2 + dictionary_description: Chain/Wire + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 49 + object_class: DOCARE + geometry_type: AREA + feature_count: 2 + dictionary_description: Dock area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 75 + object_class: HULKES + geometry_type: POINT + feature_count: 2 + dictionary_description: Hulk + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Hulk 点对象;潜在障碍/危险,需要 hazard symbol 语义审查。 +- object_class_id: 122 + object_class: RMPARE + geometry_type: AREA + feature_count: 2 + dictionary_description: Ramp + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 33 + object_class: CHIMNY + geometry_type: AREA + feature_count: 1 + dictionary_description: Chimney + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 66 + object_class: FLODOC + geometry_type: LINE + feature_count: 1 + dictionary_description: Floating dock + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 63 + object_class: FSHGRD + geometry_type: AREA + feature_count: 1 + dictionary_description: Fishing ground + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 146 + object_class: SMCFAC + geometry_type: AREA + feature_count: 1 + dictionary_description: Small craft facility + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 137 + object_class: SPLARE + geometry_type: AREA + feature_count: 1 + dictionary_description: Sea-plane landing area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 +- object_class_id: 148 + object_class: SPOGRD + geometry_type: POINT + feature_count: 1 + dictionary_description: Spoil ground + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 174 + object_class: WNDMIL + geometry_type: POINT + feature_count: 1 + dictionary_description: Windmill + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: 正确 Japan Dataset 新出现的 geometry variant;已显式登记, 在 class-specific mapping/style 审查完成前不臆造 delivery 语义。 diff --git a/config/mappings/cm95_gap_disposition_v1.yaml b/config/mappings/cm95_gap_disposition_v1.yaml new file mode 100644 index 0000000..79fc73d --- /dev/null +++ b/config/mappings/cm95_gap_disposition_v1.yaml @@ -0,0 +1,1284 @@ +schema: navsea.cm95.gap-disposition/v1 +version: v1.4.3 +dataset_id: 1 +source_audit: cm95_global_mapping_gap_audit_v1.json +policy: No observed gap variant may remain unclassified. Pending items are explicit engineering/review backlog, not silently + ignored. +summary: + observed_gap_variants: 141 + delivery_mapped_v1_4_3: 1 + existing_explicit_non_delivery: 28 + pending_semantic_review: 112 + delivery_mapped_v1_4_3_feature_rows: 51 + existing_explicit_non_delivery_feature_rows: 28564 + pending_semantic_review_feature_rows: 52828 +variants: +- object_class_id: 129 + object_class: RIVERS + geometry_type: LINE + feature_count: 17606 + dictionary_description: River + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 198 + object_class: _texto + geometry_type: POINT + feature_count: 13911 + dictionary_description: Text + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_CONDITIONAL + safety_class: normal + disposition: EXISTING_REVIEW_CONDITIONAL + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 144 + object_class: SLOTOP + geometry_type: LINE + feature_count: 7572 + dictionary_description: Slope topline + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 82 + object_class: LNDELV + geometry_type: POINT + feature_count: 5441 + dictionary_description: Land elevation + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 145 + object_class: SLOGRD + geometry_type: AREA + feature_count: 5181 + dictionary_description: Sloping ground + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 83 + object_class: LNDRGN + geometry_type: AREA + feature_count: 3041 + dictionary_description: Land region + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 193 + object_class: $LINES + geometry_type: LINE + feature_count: 2652 + dictionary_description: Cartographic line + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 29 + object_class: CTNARE + geometry_type: AREA + feature_count: 2546 + dictionary_description: Caution area + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_CONDITIONAL + safety_class: important + disposition: EXISTING_REVIEW_CONDITIONAL + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 29 + object_class: CTNARE + geometry_type: POINT + feature_count: 2262 + dictionary_description: Caution area + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_CONDITIONAL + safety_class: important + disposition: EXISTING_REVIEW_CONDITIONAL + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 14 + object_class: BUAARE + geometry_type: AREA + feature_count: 2046 + dictionary_description: Built-up area + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 157 + object_class: TOPMAR + geometry_type: POINT + feature_count: 1572 + dictionary_description: Top mark + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 132 + object_class: ROADPT + geometry_type: LINE + feature_count: 1408 + dictionary_description: Road part + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 172 + object_class: WEDKLP + geometry_type: POINT + feature_count: 1288 + dictionary_description: Weed/Kelp + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 169 + object_class: VEGARE + geometry_type: AREA + feature_count: 881 + dictionary_description: Vegetation area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 125 + object_class: RECTRC + geometry_type: LINE + feature_count: 807 + dictionary_description: Recommended track + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 210 + object_class: M_PROD + geometry_type: AREA + feature_count: 784 + dictionary_description: Production information + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 18 + object_class: BOYLAT + geometry_type: POINT + feature_count: 762 + dictionary_description: Buoy, lateral + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 128 + object_class: RESARE + geometry_type: AREA + feature_count: 671 + dictionary_description: Restricted area + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 191 + object_class: $COMPS + geometry_type: POINT + feature_count: 538 + dictionary_description: Compass + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 13 + object_class: BUISGL + geometry_type: POINT + feature_count: 516 + dictionary_description: Building, single + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_UNMAPPED_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 121 + object_class: RAILWY + geometry_type: LINE + feature_count: 477 + dictionary_description: Railway + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 171 + object_class: WATTUR + geometry_type: POINT + feature_count: 474 + dictionary_description: Water turbulence + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 201 + object_class: _extgn + geometry_type: POINT + feature_count: 462 + dictionary_description: Extended navigational aid, generic + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: important + disposition: EXISTING_ENGINEERING_COMPONENT + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 153 + object_class: TNKCON + geometry_type: POINT + feature_count: 426 + dictionary_description: Tank + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 194 + object_class: $AREAS + geometry_type: AREA + feature_count: 418 + dictionary_description: Cartographic area + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 3 + object_class: ACHBRT + geometry_type: POINT + feature_count: 408 + dictionary_description: Anchor berth + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 98 + object_class: NAVLNE + geometry_type: LINE + feature_count: 399 + dictionary_description: Navigation line + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 162 + object_class: TSSLPT + geometry_type: AREA + feature_count: 337 + dictionary_description: Traffic separation scheme lane part + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 97 + object_class: NATARE + geometry_type: AREA + feature_count: 315 + dictionary_description: National territorial area + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 10 + object_class: BRTFAC + geometry_type: LINE + feature_count: 311 + dictionary_description: Berthing facility + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 116 + object_class: RADRFL + geometry_type: POINT + feature_count: 280 + dictionary_description: Radar reflector + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 155 + object_class: TESARE + geometry_type: AREA + feature_count: 277 + dictionary_description: Territorial sea area + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 205 + object_class: LOCMAG + geometry_type: AREA + feature_count: 264 + dictionary_description: Local magnetic anomaly + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 12 + object_class: BUIREL + geometry_type: POINT + feature_count: 246 + dictionary_description: Building, religious + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 92 + object_class: MARCUL + geometry_type: AREA + feature_count: 234 + dictionary_description: Marine farm/culture + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 160 + object_class: TSSBND + geometry_type: LINE + feature_count: 233 + dictionary_description: Traffic separation scheme boundary + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 15 + object_class: BOYCAR + geometry_type: POINT + feature_count: 217 + dictionary_description: Buoy, cardinal + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 120 + object_class: RDOSTA + geometry_type: POINT + feature_count: 206 + dictionary_description: Radio station + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 72 + object_class: HRBARE + geometry_type: AREA + feature_count: 204 + dictionary_description: Harbour area (administrative) + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_CONDITIONAL + safety_class: normal + disposition: EXISTING_REVIEW_CONDITIONAL + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 171 + object_class: WATTUR + geometry_type: AREA + feature_count: 172 + dictionary_description: Water turbulence + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 39 + object_class: CRANES + geometry_type: POINT + feature_count: 167 + dictionary_description: Crane + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 57 + object_class: FAIRWY + geometry_type: AREA + feature_count: 157 + dictionary_description: Fairway + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: important + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 38 + object_class: CTRPNT + geometry_type: POINT + feature_count: 151 + dictionary_description: Control point + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 67 + object_class: FOGSIG + geometry_type: POINT + feature_count: 150 + dictionary_description: Fog signal + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 164 + object_class: TSEZNE + geometry_type: AREA + feature_count: 145 + dictionary_description: Traffic separation zone + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 151 + object_class: STSLNE + geometry_type: LINE + feature_count: 137 + dictionary_description: Straight territorial sea baseline + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 4 + object_class: ACHARE + geometry_type: POINT + feature_count: 134 + dictionary_description: Anchorage area + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 111 + object_class: PRDINS + geometry_type: POINT + feature_count: 131 + dictionary_description: Production installation + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 19 + object_class: BOYSAW + geometry_type: POINT + feature_count: 114 + dictionary_description: Buoy, safe water + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 25 + object_class: CANALS + geometry_type: LINE + feature_count: 111 + dictionary_description: Canal + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 28 + object_class: CAUSWY + geometry_type: LINE + feature_count: 99 + dictionary_description: Causeway + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 76 + object_class: ICEARE + geometry_type: AREA + feature_count: 97 + dictionary_description: Ice area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 132 + object_class: ROADPT + geometry_type: AREA + feature_count: 95 + dictionary_description: Road part + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 109 + object_class: PONTON + geometry_type: AREA + feature_count: 91 + dictionary_description: Pontoon + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 26 + object_class: CANBNK + geometry_type: LINE + feature_count: 81 + dictionary_description: Canal bank + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 52 + object_class: DMPGRD + geometry_type: AREA + feature_count: 73 + dictionary_description: Dumping ground + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 124 + object_class: RCRTCL + geometry_type: LINE + feature_count: 70 + dictionary_description: Recommended route centreline + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 56 + object_class: EXEZNE + geometry_type: AREA + feature_count: 64 + dictionary_description: Exclusive economic zone + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 62 + object_class: FSHFAC + geometry_type: LINE + feature_count: 64 + dictionary_description: Fishing facility + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 142 + object_class: SILBUI + geometry_type: POINT + feature_count: 60 + dictionary_description: Silo + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 141 + object_class: SISTAW + geometry_type: POINT + feature_count: 59 + dictionary_description: Signal station, warning + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: important + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 172 + object_class: WEDKLP + geometry_type: AREA + feature_count: 56 + dictionary_description: Weed/Kelp + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 41 + object_class: DAMCON + geometry_type: AREA + feature_count: 53 + dictionary_description: Dam + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 148 + object_class: SPOGRD + geometry_type: AREA + feature_count: 53 + dictionary_description: Spoil ground + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 205 + object_class: LOCMAG + geometry_type: POINT + feature_count: 52 + dictionary_description: Local magnetic anomaly + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 55 + object_class: DYKCRW + geometry_type: LINE + feature_count: 51 + dictionary_description: Dyke crown + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 60 + object_class: FSHHAV + geometry_type: AREA + feature_count: 51 + dictionary_description: Fish haven + gap_reason_v1: NO_EXACT_RULE_KNOWN_HARD_GATE_VARIANT + safety_class: hard_gate + disposition: DELIVERY_MAPPED_V1_4_3 + notes: Mapped to hard-gate fish-haven area in cm95_to_navsea_v1.yaml. +- object_class_id: 175 + object_class: WIMCON + geometry_type: POINT + feature_count: 51 + dictionary_description: Windmotor + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 100 + object_class: OFSPLF + geometry_type: POINT + feature_count: 49 + dictionary_description: Offshore platform + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 196 + object_class: $TEXTS + geometry_type: POINT + feature_count: 48 + dictionary_description: Text + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 93 + object_class: MSTCON + geometry_type: POINT + feature_count: 48 + dictionary_description: Mast + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 36 + object_class: CONZNE + geometry_type: AREA + feature_count: 47 + dictionary_description: Contiguous zone + gap_reason_v1: EXPLICIT_ENGINEERING_ONLY + safety_class: normal + disposition: EXISTING_ENGINEERING_ONLY + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 119 + object_class: RDOCAL + geometry_type: POINT + feature_count: 44 + dictionary_description: Radio calling-in point + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 140 + object_class: SISTAT + geometry_type: POINT + feature_count: 43 + dictionary_description: Signal station, traffic + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: important + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 17 + object_class: BOYISD + geometry_type: POINT + feature_count: 42 + dictionary_description: Buoy, isolated danger + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 159 + object_class: TSELNE + geometry_type: LINE + feature_count: 41 + dictionary_description: Traffic separation line + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 65 + object_class: FLASTK + geometry_type: POINT + feature_count: 39 + dictionary_description: Flare stack + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 25 + object_class: CANALS + geometry_type: AREA + feature_count: 34 + dictionary_description: Canal + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 112 + object_class: PYLONS + geometry_type: POINT + feature_count: 33 + dictionary_description: Pylon + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 134 + object_class: SLTPAN + geometry_type: AREA + feature_count: 32 + dictionary_description: Salt pan + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 66 + object_class: FLODOC + geometry_type: AREA + feature_count: 28 + dictionary_description: Floating dock + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 51 + object_class: DRYDOC + geometry_type: AREA + feature_count: 25 + dictionary_description: Dry dock + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 110 + object_class: PRCARE + geometry_type: AREA + feature_count: 22 + dictionary_description: Precautionary area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 95 + object_class: MONUMT + geometry_type: POINT + feature_count: 20 + dictionary_description: Monument + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 62 + object_class: FSHFAC + geometry_type: POINT + feature_count: 19 + dictionary_description: Fishing facility + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 117 + object_class: RADSTA + geometry_type: POINT + feature_count: 18 + dictionary_description: Radar station + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 163 + object_class: TSSRON + geometry_type: AREA + feature_count: 17 + dictionary_description: Traffic separation scheme roundabout + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 1 + object_class: AIRARE + geometry_type: POINT + feature_count: 16 + dictionary_description: Airport area + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: normal + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 92 + object_class: MARCUL + geometry_type: POINT + feature_count: 16 + dictionary_description: Marine farm/culture + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 54 + object_class: DYKARE + geometry_type: AREA + feature_count: 15 + dictionary_description: Dyke area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 52 + object_class: DMPGRD + geometry_type: POINT + feature_count: 14 + dictionary_description: Dumping ground + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 70 + object_class: GATCON + geometry_type: LINE + feature_count: 14 + dictionary_description: Gate + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 127 + object_class: RSCSTA + geometry_type: POINT + feature_count: 13 + dictionary_description: Rescue station + gap_reason_v1: NOT_DELIVERED_STATUS_REVIEW_STYLE_GAP + safety_class: important + disposition: EXISTING_REVIEW_STYLE_GAP + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 143 + object_class: SLIPWY + geometry_type: LINE + feature_count: 13 + dictionary_description: Slipway + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 135 + object_class: SNDWAV + geometry_type: POINT + feature_count: 13 + dictionary_description: Sand waves + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 70 + object_class: GATCON + geometry_type: AREA + feature_count: 12 + dictionary_description: Gate + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 58 + object_class: FNCLNE + geometry_type: LINE + feature_count: 11 + dictionary_description: Fence + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 91 + object_class: LOGPON + geometry_type: AREA + feature_count: 11 + dictionary_description: Log pond + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 108 + object_class: PIPARE + geometry_type: AREA + feature_count: 11 + dictionary_description: Pipeline area + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 104 + object_class: PILBOP + geometry_type: AREA + feature_count: 10 + dictionary_description: Pilot boarding place + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 6 + object_class: BCNISD + geometry_type: POINT + feature_count: 9 + dictionary_description: Beacon, isolated danger + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 34 + object_class: CGUSTA + geometry_type: POINT + feature_count: 9 + dictionary_description: Coastguard station + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 39 + object_class: CRANES + geometry_type: AREA + feature_count: 9 + dictionary_description: Crane + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 170 + object_class: WATFAL + geometry_type: POINT + feature_count: 9 + dictionary_description: Waterfall + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 5 + object_class: BCNCAR + geometry_type: POINT + feature_count: 8 + dictionary_description: Beacon, cardinal + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 62 + object_class: FSHFAC + geometry_type: AREA + feature_count: 8 + dictionary_description: Fishing facility + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 16 + object_class: BOYINB + geometry_type: POINT + feature_count: 7 + dictionary_description: Buoy, installation + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 46 + object_class: DIFFUS + geometry_type: AREA + feature_count: 7 + dictionary_description: Diffuser + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 47 + object_class: DSHAER + geometry_type: POINT + feature_count: 6 + dictionary_description: Dish aerial + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 102 + object_class: OILBAR + geometry_type: LINE + feature_count: 6 + dictionary_description: Oil barrier + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 112 + object_class: PYLONS + geometry_type: AREA + feature_count: 6 + dictionary_description: Pylon + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 12 + object_class: BUIREL + geometry_type: AREA + feature_count: 5 + dictionary_description: Building, religious + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 23 + object_class: CBLARE + geometry_type: AREA + feature_count: 5 + dictionary_description: Cable area + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 74 + object_class: HILARE + geometry_type: AREA + feature_count: 5 + dictionary_description: Hill + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 75 + object_class: HULKES + geometry_type: AREA + feature_count: 5 + dictionary_description: Hulk + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 89 + object_class: LITVES + geometry_type: POINT + feature_count: 5 + dictionary_description: Light vessel + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 161 + object_class: TSSCRS + geometry_type: AREA + feature_count: 5 + dictionary_description: Traffic separation scheme crossing + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 192 + object_class: $CSYMB + geometry_type: POINT + feature_count: 4 + dictionary_description: Cartographic symbol + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 3 + object_class: ACHBRT + geometry_type: AREA + feature_count: 4 + dictionary_description: Anchor berth + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 30 + object_class: CEMTRY + geometry_type: POINT + feature_count: 4 + dictionary_description: Cemetery + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 2 + object_class: ACHPNT + geometry_type: POINT + feature_count: 3 + dictionary_description: Anchor + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 28 + object_class: CAUSWY + geometry_type: AREA + feature_count: 3 + dictionary_description: Causeway + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 30 + object_class: CEMTRY + geometry_type: AREA + feature_count: 3 + dictionary_description: Cemetery + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 46 + object_class: DIFFUS + geometry_type: POINT + feature_count: 3 + dictionary_description: Diffuser + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 64 + object_class: FLGSTF + geometry_type: POINT + feature_count: 3 + dictionary_description: Flagstaff/Flagpole + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 171 + object_class: WATTUR + geometry_type: LINE + feature_count: 3 + dictionary_description: Water turbulence + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 31 + object_class: CHNWIR + geometry_type: LINE + feature_count: 2 + dictionary_description: Chain/Wire + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 27 + object_class: CTSARE + geometry_type: AREA + feature_count: 2 + dictionary_description: Cargo transhipment area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 101 + object_class: OFSPRD + geometry_type: AREA + feature_count: 2 + dictionary_description: Offshore production area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 122 + object_class: RMPARE + geometry_type: AREA + feature_count: 2 + dictionary_description: Ramp + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 1 + object_class: AIRARE + geometry_type: AREA + feature_count: 1 + dictionary_description: Airport area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 8 + object_class: BCNSAW + geometry_type: POINT + feature_count: 1 + dictionary_description: Beacon, safe water + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 49 + object_class: DOCARE + geometry_type: AREA + feature_count: 1 + dictionary_description: Dock area + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 59 + object_class: FERYRT + geometry_type: LINE + feature_count: 1 + dictionary_description: Ferry route + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 66 + object_class: FLODOC + geometry_type: LINE + feature_count: 1 + dictionary_description: Floating dock + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 63 + object_class: FSHGRD + geometry_type: AREA + feature_count: 1 + dictionary_description: Fishing ground + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 70 + object_class: GATCON + geometry_type: POINT + feature_count: 1 + dictionary_description: Gate + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 91 + object_class: LOGPON + geometry_type: POINT + feature_count: 1 + dictionary_description: Log pond + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 113 + object_class: RADDOM + geometry_type: POINT + feature_count: 1 + dictionary_description: Radar dome + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 148 + object_class: SPOGRD + geometry_type: POINT + feature_count: 1 + dictionary_description: Spoil ground + gap_reason_v1: NO_EXACT_RULE + safety_class: important + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. +- object_class_id: 149 + object_class: SPRING + geometry_type: POINT + feature_count: 1 + dictionary_description: Spring + gap_reason_v1: NO_EXACT_RULE + safety_class: normal + disposition: ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW + notes: Explicitly tracked; do not invent delivery semantics until class-specific mapping/style is reviewed. diff --git a/config/mappings/cm95_to_navsea_v1.yaml b/config/mappings/cm95_to_navsea_v1.yaml new file mode 100644 index 0000000..f25f220 --- /dev/null +++ b/config/mappings/cm95_to_navsea_v1.yaml @@ -0,0 +1,1522 @@ +schema: navsea.cm95.mapping/v1 +version: v1.4.3 +status: PRODUCTION_CLOSURE +generated_from: + cm95_dataset_id: 1 + cm95_aoi_tile: 10/914/385 + cm95_aoi_bbox_wgs84: + - 141.328125 + - 40.44694705960049 + - 141.6796875 + - 40.71395582628604 + cm95_aoi_spatial_features: 3605 + navsea_reference_tiles: + z10: 1 + z11: 4 + z12: 16 + navsea_reference_source_layers: 37 + style: style.navsea-delivery-full-semantic-unified-20260808.json +global_contract: + delivery_source_layers: existing NavSea source-layer names only + unmapped_engineering_layer: cm95_unmapped + stable_source_id_template: cm95:{dataset_id}:{source_relative_path}:{source_record_index}:{geometry_role} + feature_id_policy: do_not_use chart_feature.id; allocate deterministic stable fid manifest later + navigation_aid_composition: + primary_relation_key: + - cell_id + - attributes._cm93_relation20_raw + fallback: LIGHTS without relation20 are standalone; do not coordinate-merge them in pilot v1 + component_classes: + - LIGHTS + - BCNLAT + - BCNSPP + - BOYSPP + - RTPBCN + - TOWERS + - _extgn + rule: one semantic navigation_marks feature per same-cell relation20 group when LIGHTS + base component exist; all source + components remain traceable in engineering output + light_colour_observed_mapping: + 1: white + 3: red + 4: green + 6: yellow + extent_policy: not frozen here; generator must follow separate tile policy and report actual layer extent + geometry_policy: preserve source geometry; derived boundary/point_on_surface outputs are additional render artifacts, never + replacements for safety geometry +rules: +- rule_id: CM95-001 + mapping_version: v1 + cm95_object_class_id: 176 + cm95_object_class: WRECKS + cm95_description: Wreck + geometry_type: POINT + aoi_feature_count: 480 + target_source_layer: navigation_hazard_point + canonical_family: hazard + canonical_object_type: wreck + chart_render_type: symbol + safety_class: hard_gate + mapping_status: MAPPED_CONDITIONAL + style_fields: + least_depth_m: + from: VALSOU + chart_symbol_code: + const: wreck + chart_icon_image: + derive: wreck_surveyed if VALSOU present else wreck_submerged_dangerous + notes: WATLEV/VALSOU 保留;首版不使用 legacy class_code,直接引用 semantic sprite。 +- rule_id: CM95-002 + mapping_version: v1 + cm95_object_class_id: 45 + cm95_object_class: DEPCNT + cm95_description: Depth contour + geometry_type: LINE + aoi_feature_count: 451 + target_source_layer: depth_contour + canonical_family: depth + canonical_object_type: depth_contour_line + chart_render_type: line + safety_class: hard_gate + mapping_status: MAPPED + style_fields: + least_depth_m: + from: VALDCO + chart_text_style: + const: depth_text + chart_label_text: + derive: format_depth(VALDCO) + chart_text_color: + const: '#000000' + notes: 与现有 depth_contour 契约直接对应。 +- rule_id: CM95-003 + mapping_version: v1 + cm95_object_class_id: 44 + cm95_object_class: DEPARE + cm95_description: Depth area + geometry_type: AREA + aoi_feature_count: 414 + target_source_layer: baseline_area + canonical_family: depth + canonical_object_type: depth_area + chart_render_type: fill + safety_class: hard_gate + mapping_status: MAPPED_CONDITIONAL + style_fields: + chart_fill_style: + derive: depth_zone_style(DRVAL1,DRVAL2) + depth_min_m: + from: DRVAL1 + depth_max_m: + from: DRVAL2 + notes: 按 DRVAL1/DRVAL2 生成现有 style 可识别的 depth_zone_*;不改原 polygon。 +- rule_id: CM95-004 + mapping_version: v1 + cm95_object_class_id: 138 + cm95_object_class: SBDARE + cm95_description: Seabed area + geometry_type: POINT + aoi_feature_count: 287 + target_source_layer: seabed_text_point + canonical_family: seabed + canonical_object_type: seabed_material + chart_render_type: label + safety_class: normal + mapping_status: MAPPED_CONDITIONAL + style_fields: + chart_label_text: + derive: format_natsur(NATSUR,NATQUA) + chart_text_style: + const: seabed_text + chart_text_color: + const: '#000000' + notes: '' +- rule_id: CM95-005 + mapping_version: v1 + cm95_object_class_id: 139 + cm95_object_class: SLCONS + cm95_description: Shoreline construction + geometry_type: LINE + aoi_feature_count: 209 + target_source_layer: baseline_line + canonical_family: coast_structure + canonical_object_type: shoreline_construction + chart_render_type: line + safety_class: important + mapping_status: MAPPED_CONDITIONAL + style_fields: + chart_line_width: + const: 1.0 + notes: CATSLC/NATCON 保留工程 trace;首版线状岸壁/防波堤统一进入 baseline_line。 +- rule_id: CM95-006 + mapping_version: v1 + cm95_object_class_id: 168 + cm95_object_class: UWTROC + cm95_description: Underwater rock + geometry_type: POINT + aoi_feature_count: 176 + target_source_layer: navigation_hazard_point + canonical_family: hazard + canonical_object_type: underwater_rock + chart_render_type: symbol + safety_class: hard_gate + mapping_status: MAPPED_CONDITIONAL + style_fields: + least_depth_m: + from: VALSOU + chart_symbol_code: + const: hazard_mark + chart_icon_image: + derive: rock_awash if WATLEV in [2,4,5] else rock_submerged + notes: 不得把 submerged/awash 语义画反。 +- rule_id: CM95-007 + mapping_version: v1 + cm95_object_class_id: 35 + cm95_object_class: COALNE + cm95_description: Coastline + geometry_type: LINE + aoi_feature_count: 171 + target_source_layer: baseline_line + canonical_family: land + canonical_object_type: coastline + chart_render_type: line + safety_class: important + mapping_status: MAPPED + style_fields: {} + notes: '' +- rule_id: CM95-008 + mapping_version: v1 + cm95_object_class_id: 81 + cm95_object_class: LNDARE + cm95_description: Land area + geometry_type: AREA + aoi_feature_count: 159 + target_source_layer: land_area + canonical_family: land + canonical_object_type: land_area + chart_render_type: fill + safety_class: important + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: land_area + notes: '' +- rule_id: CM95-009 + mapping_version: v1 + cm95_object_class_id: 139 + cm95_object_class: SLCONS + cm95_description: Shoreline construction + geometry_type: AREA + aoi_feature_count: 119 + target_source_layer: baseline_area + canonical_family: coast_structure + canonical_object_type: breakwater + chart_render_type: fill + safety_class: important + mapping_status: MAPPED_CONDITIONAL + style_fields: + chart_fill_style: + const: coast_structure_area + notes: 面积岸工对象先统一 coast_structure_area;后续按 CATSLC 细分。 +- rule_id: CM95-010 + mapping_version: v1 + cm95_object_class_id: 198 + cm95_object_class: _texto + cm95_description: Text + geometry_type: POINT + aoi_feature_count: 113 + target_source_layer: place_label_land + canonical_family: place + canonical_object_type: source_text + chart_render_type: label + safety_class: normal + mapping_status: REVIEW_CONDITIONAL + style_fields: + chart_label_text: + derive: _texta.text + place_name_en: + derive: _texta.text + chart_text_style: + const: place_name_land + chart_text_color: + const: '#000000' + notes: CM93 cartographic text mixes land/sea/facility labels;需结合 relation20/邻近 parent 后再决定 land/sea,当前工程版可先输出。 +- rule_id: CM95-011 + mapping_version: v1 + cm95_object_class_id: 86 + cm95_object_class: LIGHTS + cm95_description: Light + geometry_type: POINT + aoi_feature_count: 96 + target_source_layer: navigation_marks + canonical_family: navigation_aid + canonical_object_type: minor_light + chart_render_type: symbol + safety_class: hard_gate + mapping_status: COMPOSITE + style_fields: + light_color_code: + derive: s57_colour_to_light_color(COLOUR) + chart_label_text: + derive: first_present(OBJNAM,NOBJNM) + chart_label_subtext: + derive: format_light_abbreviation(LITCHR,SIGGRP,SIGPER,COLOUR,HEIGHT,VALNMR) + chart_text_style: + const: light_label + chart_text_color: + const: '#000000' + chart_label_position_code: + const: l + light_sector_mode: + derive: sector if SECTR1/SECTR2 present else omni + chart_symbol_code: + const: minor_light + chart_icon_image: + const: light_minor + notes: 优先合并到 relation20 相同的 Beacon/Buoy/Tower/_extgn 等基体;无基体时才独立输出 minor_light。 名称仅允许使用助航组件自身 OBJNAM/NOBJNM;禁止按 _texto 距离自动绑定。 +- rule_id: CM95-012 + mapping_version: v1 + cm95_object_class_id: 10 + cm95_object_class: BRTFAC + cm95_description: Berthing facility + geometry_type: POINT + aoi_feature_count: 89 + target_source_layer: facility_boundary_point + canonical_family: facility + canonical_object_type: berthing_facility + chart_render_type: symbol + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_symbol_code: + const: facility_mark + notes: '' +- rule_id: CM95-013 + mapping_version: v1 + cm95_object_class_id: 177 + cm95_object_class: ZEMCNT + cm95_description: Zero meter contour + geometry_type: LINE + aoi_feature_count: 84 + target_source_layer: baseline_line + canonical_family: hydrography + canonical_object_type: zero_meter_contour + chart_render_type: line + safety_class: important + mapping_status: MAPPED + style_fields: {} + notes: '' +- rule_id: CM95-014 + mapping_version: v1 + cm95_object_class_id: 99 + cm95_object_class: OBSTRN + cm95_description: Obstruction + geometry_type: AREA + aoi_feature_count: 70 + target_source_layer: navigation_hazard_area + canonical_family: hazard + canonical_object_type: obstruction_area + chart_render_type: fill + safety_class: hard_gate + mapping_status: MAPPED + style_fields: + least_depth_m: + from: VALSOU + chart_fill_style: + const: hazard_area + chart_fill_pattern: + const: pattern_fill_rock_hazard + notes: '' + derived_outputs: + - source_layer: navigation_hazard_outline + geometry: boundary + style_fields: + chart_line_width: 1.0 +- rule_id: CM95-015 + mapping_version: v1 + cm95_object_class_id: 78 + cm95_object_class: ITDARE + cm95_description: Intertidal area + geometry_type: AREA + aoi_feature_count: 69 + target_source_layer: baseline_area + canonical_family: depth + canonical_object_type: tidal_flat + chart_render_type: fill + safety_class: hard_gate + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: tidal_flat + notes: '' +- rule_id: CM95-016 + mapping_version: v1 + cm95_object_class_id: 158 + cm95_object_class: TOWERS + cm95_description: Tower + geometry_type: POINT + aoi_feature_count: 54 + target_source_layer: onshore_structure_point + canonical_family: landmark + canonical_object_type: tower_yagura_windmill + chart_render_type: symbol + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_icon_image: + const: landmark_tower_windmill + class_code: + const: 650 + notes: 当前 unified style 直接读取 chart_icon_image;class_code=650 仅用于现有 landmark filter 兼容。 +- rule_id: CM95-017 + mapping_version: v1 + cm95_object_class_id: 153 + cm95_object_class: TNKCON + cm95_description: Tank + geometry_type: POINT + aoi_feature_count: 46 + target_source_layer: onshore_structure_point + canonical_family: landmark + canonical_object_type: tank + chart_render_type: symbol + safety_class: normal + mapping_status: REVIEW_STYLE_GAP + style_fields: {} + notes: '' +- rule_id: CM95-018 + mapping_version: v1 + cm95_object_class_id: 201 + cm95_object_class: _extgn + cm95_description: Extended navigational aid, generic + geometry_type: POINT + aoi_feature_count: 42 + target_source_layer: cm95_unmapped + canonical_family: navigation_aid + canonical_object_type: extended_nav_aid_component + chart_render_type: none + safety_class: important + mapping_status: ENGINEERING_COMPONENT + style_fields: {} + notes: CM93 扩展助航组件;作为 relation20 合成输入,不单独进入 delivery。 +- rule_id: CM95-019 + mapping_version: v1 + cm95_object_class_id: 14 + cm95_object_class: BUAARE + cm95_description: Built-up area + geometry_type: POINT + aoi_feature_count: 35 + target_source_layer: place_label_land + canonical_family: place + canonical_object_type: built_up_place + chart_render_type: label + safety_class: normal + mapping_status: MAPPED_CONDITIONAL + style_fields: + chart_label_text: + from: OBJNAM + place_name_en: + from: OBJNAM + chart_text_style: + const: place_name_land + notes: '' +- rule_id: CM95-020 + mapping_version: v1 + cm95_object_class_id: 33 + cm95_object_class: CHIMNY + cm95_description: Chimney + geometry_type: POINT + aoi_feature_count: 35 + target_source_layer: onshore_structure_point + canonical_family: landmark + canonical_object_type: chimney + chart_render_type: symbol + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_icon_image: + const: landmark_chimney + class_code: + const: 640 + notes: 当前 unified style 直接读取 chart_icon_image;class_code=640 仅用于现有 landmark filter 兼容。 +- rule_id: CM95-021 + mapping_version: v1 + cm95_object_class_id: 13 + cm95_object_class: BUISGL + cm95_description: Building, single + geometry_type: AREA + aoi_feature_count: 20 + target_source_layer: onshore_structure_area + canonical_family: structure + canonical_object_type: building + chart_render_type: fill + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: land_structure_area + notes: '' +- rule_id: CM95-022 + mapping_version: v1 + cm95_object_class_id: 103 + cm95_object_class: PILPNT + cm95_description: Pile + geometry_type: POINT + aoi_feature_count: 20 + target_source_layer: navigation_hazard_point + canonical_family: hazard + canonical_object_type: pile_post + chart_render_type: symbol + safety_class: important + mapping_status: MAPPED + style_fields: + chart_symbol_code: + const: obstruction + chart_icon_image: + const: structure_pile + notes: '' +- rule_id: CM95-023 + mapping_version: v1 + cm95_object_class_id: 60 + cm95_object_class: FSHHAV + cm95_description: Fish haven + geometry_type: POINT + aoi_feature_count: 18 + target_source_layer: anchor_caution_hazard_point + canonical_family: hazard + canonical_object_type: fish_reef + chart_render_type: symbol + safety_class: hard_gate + mapping_status: MAPPED + style_fields: + chart_symbol_code: + const: fish_reef + chart_icon_image: + const: reef_fish + notes: '' +- rule_id: CM95-024 + mapping_version: v1 + cm95_object_class_id: 11 + cm95_object_class: BRIDGE + cm95_description: Bridge + geometry_type: AREA + aoi_feature_count: 17 + target_source_layer: bridge_structure + canonical_family: structure + canonical_object_type: bridge_water_gate + chart_render_type: fill + safety_class: hard_gate + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: bridge_area + clearance_height_m: + from: VERCLR + notes: 桥面保留 AREA;有 VERCLR 时额外派生净空标签点。 + derived_outputs: + - source_layer: clearance_limit_point + geometry: point_on_surface + condition: VERCLR present + style_fields: + clearance_height_m: + from: VERCLR + chart_label_text: + derive: format_clearance(VERCLR) +- rule_id: CM95-025 + mapping_version: v1 + cm95_object_class_id: 29 + cm95_object_class: CTNARE + cm95_description: Caution area + geometry_type: AREA + aoi_feature_count: 16 + target_source_layer: facility_boundary_area + canonical_family: restriction + canonical_object_type: caution_area + chart_render_type: fill + safety_class: important + mapping_status: REVIEW_CONDITIONAL + style_fields: + chart_fill_style: + const: facility_area + chart_fill_pattern: + const: pattern_fill_facility_area + notes: Caution area 语义跨度较大;首版工程版保留 INFORM,正式发布前按文本/属性细分。 +- rule_id: CM95-026 + mapping_version: v1 + cm95_object_class_id: 193 + cm95_object_class: $LINES + cm95_description: Cartographic line + geometry_type: LINE + aoi_feature_count: 15 + target_source_layer: cm95_unmapped + canonical_family: cartographic + canonical_object_type: cartographic_line + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: '' +- rule_id: CM95-027 + mapping_version: v1 + cm95_object_class_id: 7 + cm95_object_class: BCNLAT + cm95_description: Beacon, lateral + geometry_type: POINT + aoi_feature_count: 15 + target_source_layer: navigation_marks + canonical_family: navigation_aid + canonical_object_type: lateral_beacon + chart_render_type: symbol + safety_class: hard_gate + mapping_status: COMPOSITE + style_fields: + chart_icon_image: + derive: nav_icon_from_bcnlat_attributes + chart_symbol_code: + const: beacon + notes: 若同 cell + _cm93_relation20_raw 存在 LIGHTS,则合成为一个 navigation_marks Feature;不重复输出 LIGHTS。 +- rule_id: CM95-028 + mapping_version: v1 + cm95_object_class_id: 39 + cm95_object_class: CRANES + cm95_description: Crane + geometry_type: POINT + aoi_feature_count: 15 + target_source_layer: onshore_structure_point + canonical_family: landmark + canonical_object_type: crane + chart_render_type: symbol + safety_class: normal + mapping_status: REVIEW_STYLE_GAP + style_fields: {} + notes: '' +- rule_id: CM95-029 + mapping_version: v1 + cm95_object_class_id: 111 + cm95_object_class: PRDINS + cm95_description: Production installation + geometry_type: AREA + aoi_feature_count: 15 + target_source_layer: onshore_structure_area + canonical_family: structure + canonical_object_type: production_installation + chart_render_type: fill + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: land_structure_area + notes: '' +- rule_id: CM95-030 + mapping_version: v1 + cm95_object_class_id: 50 + cm95_object_class: DRGARE + cm95_description: Dredged area + geometry_type: AREA + aoi_feature_count: 14 + target_source_layer: baseline_area + canonical_family: depth + canonical_object_type: dredged_area + chart_render_type: fill + safety_class: important + mapping_status: MAPPED_CONDITIONAL + style_fields: + chart_fill_style: + derive: depth_zone_style(DRVAL1,null) + depth_min_m: + from: DRVAL1 + notes: '' +- rule_id: CM95-031 + mapping_version: v1 + cm95_object_class_id: 29 + cm95_object_class: CTNARE + cm95_description: Caution area + geometry_type: POINT + aoi_feature_count: 13 + target_source_layer: facility_boundary_point + canonical_family: restriction + canonical_object_type: caution_point + chart_render_type: symbol + safety_class: important + mapping_status: REVIEW_CONDITIONAL + style_fields: {} + notes: '' +- rule_id: CM95-032 + mapping_version: v1 + cm95_object_class_id: 9 + cm95_object_class: BCNSPP + cm95_description: Beacon, special purpose + geometry_type: POINT + aoi_feature_count: 12 + target_source_layer: navigation_marks + canonical_family: navigation_aid + canonical_object_type: special_purpose_beacon + chart_render_type: symbol + safety_class: hard_gate + mapping_status: COMPOSITE + style_fields: + chart_icon_image: + derive: nav_icon_from_bcnspp_attributes + chart_symbol_code: + const: beacon + notes: 若同 cell + _cm93_relation20_raw 存在 LIGHTS,则合成为一个 navigation_marks Feature;不重复输出 LIGHTS。 +- rule_id: CM95-033 + mapping_version: v1 + cm95_object_class_id: 13 + cm95_object_class: BUISGL + cm95_description: Building, single + geometry_type: POINT + aoi_feature_count: 12 + target_source_layer: cm95_unmapped + canonical_family: unknown + canonical_object_type: cm95_buisgl + chart_render_type: none + safety_class: normal + mapping_status: UNMAPPED_REVIEW + style_fields: {} + notes: 当前 AOI 已发现,但现有 NavSea style 契约中尚无足够证据安全映射;工程版必须保留。 +- rule_id: CM95-034 + mapping_version: v1 + cm95_object_class_id: 22 + cm95_object_class: CBLSUB + cm95_description: Cable, submarine + geometry_type: LINE + aoi_feature_count: 12 + target_source_layer: seabed_line + canonical_family: seabed + canonical_object_type: submarine_cable + chart_render_type: line + safety_class: important + mapping_status: MAPPED + style_fields: + chart_line_pattern: + const: pattern_line_subsea_cable + notes: '' +- rule_id: CM95-035 + mapping_version: v1 + cm95_object_class_id: 111 + cm95_object_class: PRDINS + cm95_description: Production installation + geometry_type: POINT + aoi_feature_count: 12 + target_source_layer: onshore_structure_point + canonical_family: structure + canonical_object_type: production_installation + chart_render_type: symbol + safety_class: normal + mapping_status: REVIEW_STYLE_GAP + style_fields: {} + notes: '' +- rule_id: CM95-036 + mapping_version: v1 + cm95_object_class_id: 194 + cm95_object_class: $AREAS + cm95_description: Cartographic area + geometry_type: AREA + aoi_feature_count: 11 + target_source_layer: cm95_unmapped + canonical_family: cartographic + canonical_object_type: cartographic_area + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: '' +- rule_id: CM95-037 + mapping_version: v1 + cm95_object_class_id: 153 + cm95_object_class: TNKCON + cm95_description: Tank + geometry_type: AREA + aoi_feature_count: 11 + target_source_layer: onshore_structure_area + canonical_family: structure + canonical_object_type: tank + chart_render_type: fill + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: land_structure_area + notes: '' +- rule_id: CM95-038 + mapping_version: v1 + cm95_object_class_id: 138 + cm95_object_class: SBDARE + cm95_description: Seabed area + geometry_type: AREA + aoi_feature_count: 9 + target_source_layer: cm95_unmapped + canonical_family: seabed + canonical_object_type: seabed_area + chart_render_type: none + safety_class: normal + mapping_status: DERIVED_LABEL_ONLY + style_fields: {} + notes: 原始 area 保留工程 trace;可额外 point_on_surface 派生 seabed_text_point 标签,但不把原面替换成点。 + derived_outputs: + - source_layer: seabed_text_point + geometry: point_on_surface + style_fields: + chart_label_text: + derive: format_natsur(NATSUR,NATQUA) + chart_text_style: seabed_text + chart_text_color: '#000000' +- rule_id: CM95-039 + mapping_version: v1 + cm95_object_class_id: 20 + cm95_object_class: BOYSPP + cm95_description: Buoy, special purpose + geometry_type: POINT + aoi_feature_count: 8 + target_source_layer: navigation_marks + canonical_family: navigation_aid + canonical_object_type: special_purpose_buoy + chart_render_type: symbol + safety_class: hard_gate + mapping_status: COMPOSITE + style_fields: + chart_icon_image: + derive: nav_icon_from_boyspp_attributes + chart_symbol_code: + const: buoy + notes: 若同 cell + _cm93_relation20_raw 存在 LIGHTS,则合成为一个 navigation_marks Feature;不重复输出 LIGHTS。 +- rule_id: CM95-040 + mapping_version: v1 + cm95_object_class_id: 96 + cm95_object_class: MORFAC + cm95_description: Mooring/Warping facility + geometry_type: POINT + aoi_feature_count: 7 + target_source_layer: facility_boundary_point + canonical_family: facility + canonical_object_type: mooring_facility + chart_render_type: symbol + safety_class: important + mapping_status: MAPPED + style_fields: + chart_symbol_code: + const: facility_mark + chart_icon_image: + const: structure_dolphin + notes: '' +- rule_id: CM95-041 + mapping_version: v1 + cm95_object_class_id: 210 + cm95_object_class: M_PROD + cm95_description: Production information + geometry_type: AREA + aoi_feature_count: 7 + target_source_layer: cm95_unmapped + canonical_family: metadata + canonical_object_type: production_information + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: '' +- rule_id: CM95-042 + mapping_version: v1 + cm95_object_class_id: 130 + cm95_object_class: RIVBNK + cm95_description: River bank + geometry_type: LINE + aoi_feature_count: 7 + target_source_layer: baseline_line + canonical_family: hydrography + canonical_object_type: river_bank + chart_render_type: line + safety_class: normal + mapping_status: MAPPED + style_fields: {} + notes: '' +- rule_id: CM95-043 + mapping_version: v1 + cm95_object_class_id: 38 + cm95_object_class: CTRPNT + cm95_description: Control point + geometry_type: POINT + aoi_feature_count: 6 + target_source_layer: cm95_unmapped + canonical_family: survey + canonical_object_type: control_point + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: '' +- rule_id: CM95-044 + mapping_version: v1 + cm95_object_class_id: 99 + cm95_object_class: OBSTRN + cm95_description: Obstruction + geometry_type: POINT + aoi_feature_count: 6 + target_source_layer: navigation_hazard_point + canonical_family: hazard + canonical_object_type: obstruction + chart_render_type: symbol + safety_class: hard_gate + mapping_status: MAPPED + style_fields: + least_depth_m: + from: VALSOU + chart_symbol_code: + const: obstruction + chart_icon_image: + const: obstruction + notes: '' +- rule_id: CM95-045 + mapping_version: v1 + cm95_object_class_id: 217 + cm95_object_class: _m_sor + cm95_description: Source of data + geometry_type: META + aoi_feature_count: 6 + target_source_layer: cm95_unmapped + canonical_family: metadata + canonical_object_type: source_of_data + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: '' +- rule_id: CM95-046 + mapping_version: v1 + cm95_object_class_id: 191 + cm95_object_class: $COMPS + cm95_description: Compass + geometry_type: POINT + aoi_feature_count: 5 + target_source_layer: cm95_unmapped + canonical_family: cartographic + canonical_object_type: compass + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: '' +- rule_id: CM95-047 + mapping_version: v1 + cm95_object_class_id: 12 + cm95_object_class: BUIREL + cm95_description: Building, religious + geometry_type: POINT + aoi_feature_count: 5 + target_source_layer: onshore_structure_point + canonical_family: landmark + canonical_object_type: religious_building + chart_render_type: symbol + safety_class: normal + mapping_status: REVIEW_STYLE_GAP + style_fields: {} + notes: '' +- rule_id: CM95-048 + mapping_version: v1 + cm95_object_class_id: 21 + cm95_object_class: CBLOHD + cm95_description: Cable, overhead + geometry_type: LINE + aoi_feature_count: 5 + target_source_layer: clearance_limit_line + canonical_family: safety_constraint + canonical_object_type: overhead_cable + chart_render_type: line + safety_class: hard_gate + mapping_status: MAPPED + style_fields: + clearance_height_m: + from: VERCLR + notes: '' +- rule_id: CM95-049 + mapping_version: v1 + cm95_object_class_id: 57 + cm95_object_class: FAIRWY + cm95_description: Fairway + geometry_type: AREA + aoi_feature_count: 5 + target_source_layer: cm95_unmapped + canonical_family: navigation_route + canonical_object_type: fairway + chart_render_type: none + safety_class: important + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: 当前 unified style 不消费 route_area/route_outline;为保证“只改 tile URL”原则,首版不进入 delivery,工程版保留。 +- rule_id: CM95-050 + mapping_version: v1 + cm95_object_class_id: 129 + cm95_object_class: RIVERS + cm95_description: River + geometry_type: AREA + aoi_feature_count: 5 + target_source_layer: baseline_area + canonical_family: hydrography + canonical_object_type: river_area + chart_render_type: fill + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: river_water + notes: '' +- rule_id: CM95-051 + mapping_version: v1 + cm95_object_class_id: 142 + cm95_object_class: SILBUI + cm95_description: Silo + geometry_type: POINT + aoi_feature_count: 5 + target_source_layer: onshore_structure_point + canonical_family: landmark + canonical_object_type: silo + chart_render_type: symbol + safety_class: normal + mapping_status: REVIEW_STYLE_GAP + style_fields: {} + notes: '' +- rule_id: CM95-052 + mapping_version: v1 + cm95_object_class_id: 154 + cm95_object_class: TELPHC + cm95_description: Telepheric + geometry_type: LINE + aoi_feature_count: 5 + target_source_layer: clearance_limit_line + canonical_family: safety_constraint + canonical_object_type: telepheric + chart_render_type: line + safety_class: hard_gate + mapping_status: MAPPED_CONDITIONAL + style_fields: {} + notes: 缺少净空属性时只渲染限制线,不伪造高度。 +- rule_id: CM95-053 + mapping_version: v1 + cm95_object_class_id: 11 + cm95_object_class: BRIDGE + cm95_description: Bridge + geometry_type: LINE + aoi_feature_count: 4 + target_source_layer: clearance_limit_line + canonical_family: structure + canonical_object_type: bridge_clearance_line + chart_render_type: line + safety_class: hard_gate + mapping_status: MAPPED_CONDITIONAL + style_fields: + clearance_height_m: + from: VERCLR + notes: 线桥对象作为净空/结构线,若无 VERCLR 仍保留工程 trace。 +- rule_id: CM95-054 + mapping_version: v1 + cm95_object_class_id: 72 + cm95_object_class: HRBARE + cm95_description: Harbour area (administrative) + geometry_type: AREA + aoi_feature_count: 4 + target_source_layer: facility_boundary_area + canonical_family: facility + canonical_object_type: harbour_area + chart_render_type: fill + safety_class: normal + mapping_status: REVIEW_CONDITIONAL + style_fields: {} + notes: '' +- rule_id: CM95-055 + mapping_version: v1 + cm95_object_class_id: 95 + cm95_object_class: MONUMT + cm95_description: Monument + geometry_type: POINT + aoi_feature_count: 4 + target_source_layer: onshore_structure_point + canonical_family: landmark + canonical_object_type: other_landmark_monument + chart_render_type: symbol + safety_class: normal + mapping_status: REVIEW_STYLE_GAP + style_fields: + class_code: + const: 698 + notes: unified style can consume chart_icon_image, but semantic sprite lacks a clearly dedicated monument key; keep engineering + until icon decision. +- rule_id: CM95-056 + mapping_version: v1 + cm95_object_class_id: 140 + cm95_object_class: SISTAT + cm95_description: Signal station, traffic + geometry_type: POINT + aoi_feature_count: 4 + target_source_layer: onshore_structure_point + canonical_family: signal_station + canonical_object_type: traffic_signal_station + chart_render_type: symbol + safety_class: important + mapping_status: REVIEW_STYLE_GAP + style_fields: {} + notes: '' +- rule_id: CM95-057 + mapping_version: v1 + cm95_object_class_id: 147 + cm95_object_class: SOUNDG + cm95_description: Spot soundings + geometry_type: SOUNDING + aoi_feature_count: 4 + target_source_layer: seabed_text_point + canonical_family: depth + canonical_object_type: spot_sounding + chart_render_type: label + safety_class: hard_gate + mapping_status: MAPPED_DERIVED_POINTS + style_fields: + depth_value_m: + from: chart_sounding_point.depth + chart_label_text: + derive: format_depth(chart_sounding_point.depth) + chart_text_style: + const: depth_text + chart_text_color: + const: '#000000' + notes: 每个 sounding point 单独派生文本点;保留原 sounding feature/source identity。 +- rule_id: CM95-058 + mapping_version: v1 + cm95_object_class_id: 1 + cm95_object_class: AIRARE + cm95_description: Airport area + geometry_type: POINT + aoi_feature_count: 3 + target_source_layer: onshore_structure_point + canonical_family: landmark + canonical_object_type: airport + chart_render_type: symbol + safety_class: normal + mapping_status: REVIEW_STYLE_GAP + style_fields: {} + notes: '' +- rule_id: CM95-059 + mapping_version: v1 + cm95_object_class_id: 14 + cm95_object_class: BUAARE + cm95_description: Built-up area + geometry_type: AREA + aoi_feature_count: 3 + target_source_layer: cm95_unmapped + canonical_family: place + canonical_object_type: built_up_area + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: 现有 style 没有明确 built-up area 填充契约,避免错误覆盖 land。 +- rule_id: CM95-060 + mapping_version: v1 + cm95_object_class_id: 79 + cm95_object_class: LAKARE + cm95_description: Lake + geometry_type: AREA + aoi_feature_count: 3 + target_source_layer: baseline_area + canonical_family: hydrography + canonical_object_type: lake_area + chart_render_type: fill + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: river_water + notes: '' +- rule_id: CM95-061 + mapping_version: v1 + cm95_object_class_id: 80 + cm95_object_class: LAKSHR + cm95_description: Lake shore + geometry_type: LINE + aoi_feature_count: 3 + target_source_layer: baseline_line + canonical_family: hydrography + canonical_object_type: lake_shore + chart_render_type: line + safety_class: normal + mapping_status: MAPPED + style_fields: {} + notes: '' +- rule_id: CM95-062 + mapping_version: v1 + cm95_object_class_id: 97 + cm95_object_class: NATARE + cm95_description: National territorial area + geometry_type: AREA + aoi_feature_count: 3 + target_source_layer: cm95_unmapped + canonical_family: administrative + canonical_object_type: national_territorial_area + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: '' +- rule_id: CM95-063 + mapping_version: v1 + cm95_object_class_id: 104 + cm95_object_class: PILBOP + cm95_description: Pilot boarding place + geometry_type: POINT + aoi_feature_count: 3 + target_source_layer: pilot_station_point + canonical_family: facility + canonical_object_type: pilot_boarding_place + chart_render_type: symbol + safety_class: important + mapping_status: MAPPED + style_fields: + chart_symbol_code: + const: pilot_station + notes: '' +- rule_id: CM95-064 + mapping_version: v1 + cm95_object_class_id: 143 + cm95_object_class: SLIPWY + cm95_description: Slipway + geometry_type: AREA + aoi_feature_count: 3 + target_source_layer: baseline_area + canonical_family: coast_structure + canonical_object_type: slipway + chart_render_type: fill + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: coast_structure_area + notes: '' +- rule_id: CM95-065 + mapping_version: v1 + cm95_object_class_id: 155 + cm95_object_class: TESARE + cm95_description: Territorial sea area + geometry_type: AREA + aoi_feature_count: 3 + target_source_layer: cm95_unmapped + canonical_family: administrative + canonical_object_type: territorial_sea_area + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: '' +- rule_id: CM95-066 + mapping_version: v1 + cm95_object_class_id: 4 + cm95_object_class: ACHARE + cm95_description: Anchorage area + geometry_type: AREA + aoi_feature_count: 2 + target_source_layer: anchorage_area + canonical_family: usage_area + canonical_object_type: anchorage + chart_render_type: fill + safety_class: important + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: anchorage_area + notes: '' + derived_outputs: + - source_layer: anchorage_outline + geometry: boundary + style_fields: + chart_line_width: 1.0 + - source_layer: anchorage_point + geometry: point_on_surface + style_fields: + chart_symbol_code: anchorage + chart_icon_image: anchorage_designated +- rule_id: CM95-067 + mapping_version: v1 + cm95_object_class_id: 36 + cm95_object_class: CONZNE + cm95_description: Contiguous zone + geometry_type: AREA + aoi_feature_count: 2 + target_source_layer: cm95_unmapped + canonical_family: administrative + canonical_object_type: contiguous_zone + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: '' +- rule_id: CM95-068 + mapping_version: v1 + cm95_object_class_id: 56 + cm95_object_class: EXEZNE + cm95_description: Exclusive economic zone + geometry_type: AREA + aoi_feature_count: 2 + target_source_layer: cm95_unmapped + canonical_family: administrative + canonical_object_type: exclusive_economic_zone + chart_render_type: none + safety_class: normal + mapping_status: ENGINEERING_ONLY + style_fields: {} + notes: '' +- rule_id: CM95-069 + mapping_version: v1 + cm95_object_class_id: 96 + cm95_object_class: MORFAC + cm95_description: Mooring/Warping facility + geometry_type: AREA + aoi_feature_count: 2 + target_source_layer: facility_boundary_area + canonical_family: facility + canonical_object_type: mooring_facility_area + chart_render_type: fill + safety_class: important + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: facility_area + chart_fill_pattern: + const: pattern_fill_facility_area + notes: '' + derived_outputs: + - source_layer: facility_boundary_outline + geometry: boundary + style_fields: + chart_line_width: 1.0 +- rule_id: CM95-070 + mapping_version: v1 + cm95_object_class_id: 106 + cm95_object_class: PIPOHD + cm95_description: Pipeline, overhead + geometry_type: LINE + aoi_feature_count: 2 + target_source_layer: clearance_limit_line + canonical_family: safety_constraint + canonical_object_type: overhead_pipeline + chart_render_type: line + safety_class: hard_gate + mapping_status: MAPPED_CONDITIONAL + style_fields: {} + notes: '' +- rule_id: CM95-071 + mapping_version: v1 + cm95_object_class_id: 107 + cm95_object_class: PIPSOL + cm95_description: Pipeline, submarine/on land + geometry_type: LINE + aoi_feature_count: 2 + target_source_layer: seabed_line + canonical_family: seabed + canonical_object_type: submarine_pipeline + chart_render_type: line + safety_class: important + mapping_status: MAPPED + style_fields: {} + notes: '' +- rule_id: CM95-072 + mapping_version: v1 + cm95_object_class_id: 112 + cm95_object_class: PYLONS + cm95_description: Pylon + geometry_type: POINT + aoi_feature_count: 2 + target_source_layer: onshore_structure_point + canonical_family: landmark + canonical_object_type: pylon + chart_render_type: symbol + safety_class: normal + mapping_status: REVIEW_STYLE_GAP + style_fields: {} + notes: '' +- rule_id: CM95-073 + mapping_version: v1 + cm95_object_class_id: 136 + cm95_object_class: SEAARE + cm95_description: Sea area + geometry_type: AREA + aoi_feature_count: 2 + target_source_layer: baseline_area + canonical_family: hydrography + canonical_object_type: water_area + chart_render_type: fill + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: water_area + notes: '' +- rule_id: CM95-074 + mapping_version: v1 + cm95_object_class_id: 73 + cm95_object_class: HRBFAC + cm95_description: Harbour facility + geometry_type: POINT + aoi_feature_count: 1 + target_source_layer: facility_boundary_point + canonical_family: facility + canonical_object_type: harbour_facility + chart_render_type: symbol + safety_class: normal + mapping_status: MAPPED + style_fields: {} + notes: '' +- rule_id: CM95-075 + mapping_version: v1 + cm95_object_class_id: 73 + cm95_object_class: HRBFAC + cm95_description: Harbour facility + geometry_type: AREA + aoi_feature_count: 1 + target_source_layer: facility_boundary_area + canonical_family: facility + canonical_object_type: harbour_facility_area + chart_render_type: fill + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: facility_area + chart_fill_pattern: + const: pattern_fill_facility_area + notes: '' +- rule_id: CM95-076 + mapping_version: v1 + cm95_object_class_id: 127 + cm95_object_class: RSCSTA + cm95_description: Rescue station + geometry_type: POINT + aoi_feature_count: 1 + target_source_layer: facility_boundary_point + canonical_family: facility + canonical_object_type: rescue_station + chart_render_type: symbol + safety_class: important + mapping_status: REVIEW_STYLE_GAP + style_fields: {} + notes: '' +- rule_id: CM95-077 + mapping_version: v1 + cm95_object_class_id: 118 + cm95_object_class: RTPBCN + cm95_description: Radar transponder beacon + geometry_type: POINT + aoi_feature_count: 1 + target_source_layer: navigation_marks + canonical_family: navigation_aid + canonical_object_type: radar_transponder_beacon + chart_render_type: symbol + safety_class: hard_gate + mapping_status: COMPOSITE + style_fields: + chart_icon_image: + derive: nav_icon_from_rtpbcn_attributes + chart_symbol_code: + const: beacon + notes: 若同 cell + _cm93_relation20_raw 存在 LIGHTS,则合成为一个 navigation_marks Feature;不重复输出 LIGHTS。 +- rule_id: CM95-078 + mapping_version: v1 + cm95_object_class_id: 142 + cm95_object_class: SILBUI + cm95_description: Silo + geometry_type: AREA + aoi_feature_count: 1 + target_source_layer: onshore_structure_area + canonical_family: structure + canonical_object_type: silo + chart_render_type: fill + safety_class: normal + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: land_structure_area + notes: '' +- rule_id: CM95-079 + mapping_version: v1 + cm95_object_class_id: 141 + cm95_object_class: SISTAW + cm95_description: Signal station, warning + geometry_type: POINT + aoi_feature_count: 1 + target_source_layer: onshore_structure_point + canonical_family: signal_station + canonical_object_type: warning_signal_station + chart_render_type: symbol + safety_class: important + mapping_status: REVIEW_STYLE_GAP + style_fields: {} + notes: '' +- rule_id: CM95-080 + mapping_version: v1 + cm95_object_class_id: 176 + cm95_object_class: WRECKS + cm95_description: Wreck + geometry_type: AREA + aoi_feature_count: 1 + target_source_layer: navigation_hazard_area + canonical_family: hazard + canonical_object_type: wreck_area + chart_render_type: fill + safety_class: hard_gate + mapping_status: MAPPED + style_fields: + chart_fill_style: + const: hazard_area + chart_fill_pattern: + const: pattern_fill_rock_hazard + notes: 保留面危险物,不降级为点;另派生 outline 用于现有 style。 + derived_outputs: + - source_layer: navigation_hazard_outline + geometry: boundary + style_fields: + chart_line_width: 1.0 +- rule_id: CM95-PROD-001 + mapping_version: v1.4.3 + cm95_object_class_id: 60 + cm95_object_class: FSHHAV + cm95_description: Fish haven + geometry_type: AREA + aoi_feature_count: 0 + target_source_layer: anchor_caution_hazard_area + canonical_family: hazard + canonical_object_type: fish_reef + chart_render_type: fill + safety_class: hard_gate + mapping_status: MAPPED_DERIVED_POINTS + style_fields: + chart_fill_pattern: + const: pattern_fill_fish_reef + least_depth_m: + from: VALSOU + derived_outputs: + - source_layer: anchor_caution_hazard_outline + geometry: boundary + style_fields: + chart_line_width: 1.0 + chart_line_color: '#88988b' + - source_layer: anchor_caution_hazard_point + geometry: point_on_surface + style_fields: + least_depth_m: + from: VALSOU + chart_symbol_code: fish_reef + chart_icon_image: reef_fish + notes: 'Production closure: Dataset-1 contains FSHHAV AREA. Preserve area + outline + point-on-surface; never downgrade + to unmapped.' +relation20_validation: + aoi: 10/914/385 + nav_point_rows: 233 + relation_groups: 93 + light_total: 96 + light_with_relation20: 94 + light_mergeable_by_relation20: 94 + coord_conflict_groups: 0 + standalone_lights: 2 + decision: PASS_RELATION20_PRIMARY_KEY +production_change_contract: + baseline: v1.4.2 + delivery_output_changed_object_classes: + - FSHHAV + disposition_catalog: config/mappings/cm95_gap_disposition_v1.yaml + global_gap_policy: Every observed Dataset-1 gap variant must have an explicit disposition; unresolved semantics remain pending + review and are not generic-mapped. diff --git a/config/pbf/cm95_production_v1.yaml b/config/pbf/cm95_production_v1.yaml new file mode 100644 index 0000000..b1a9378 --- /dev/null +++ b/config/pbf/cm95_production_v1.yaml @@ -0,0 +1,18 @@ +schema: navsea.cm95.production-policy/v1 +version: v1.4.2-materialization-split +status: PRODUCTION_CANDIDATE +zooms: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] +profile: delivery +workers: 4 +max_attempts: 3 +release_root: build/releases +plan_path: build/production/cm95_production_plan_v1.json +rules: + - 生产目标固定为 z0-z12。 + - 高 zoom tile 的物理枚举只由 enumeration_scales 决定。 + - scale_ladders 的粗比例尺只允许在已枚举 tile 内回退,不得扩张生产 footprint。 + - mapping、tile policy、Dataset fingerprint、FID manifest 在计划创建后必须保持不变。 + - PASS tile 自动断点续跑;RUNNING 状态在下次启动时恢复为 PENDING。 + - FAILED tile 最多尝试 max_attempts 次;失败不会被静默跳过。 + - 空 tile 可为 PASS 且不生成 PBF 文件;release manifest 只列真实产物。 + - 发布前 finalize-production 必须满足 planned/report/decoded feature 三方一致。 diff --git a/config/pbf/cm95_tile_policy_japan_full_detail_v1.yaml b/config/pbf/cm95_tile_policy_japan_full_detail_v1.yaml new file mode 100644 index 0000000..7b08f01 --- /dev/null +++ b/config/pbf/cm95_tile_policy_japan_full_detail_v1.yaml @@ -0,0 +1,96 @@ +schema: navsea.cm95.tile-policy/v1 +version: v1.3-japan-full-detail-g7500-at-z12 +status: PRODUCTION_CANDIDATE +xyz: true +nominal_tile_pixels: 256 +buffer_tile_pixels: 8 +default_extent: 4096 +extent_by_zoom: + '10': 4096 + '11': 4096 + '12': 1048576 +enumeration_scales: + '0': + - 20000000 + '1': + - 20000000 + '2': + - 20000000 + '3': + - 20000000 + '4': + - 20000000 + '5': + - 3000000 + '6': + - 3000000 + '7': + - 3000000 + '8': + - 1000000 + '9': + - 1000000 + '10': + - 200000 + '11': + - 50000 + - 100000 + '12': + - 7500 + - 20000 + - 50000 +scale_ladders: + '0': + - 20000000 + '1': + - 20000000 + '2': + - 20000000 + '3': + - 20000000 + '4': + - 20000000 + '5': + - 3000000 + - 20000000 + '6': + - 3000000 + - 20000000 + '7': + - 3000000 + - 20000000 + '8': + - 1000000 + - 3000000 + - 20000000 + '9': + - 1000000 + - 3000000 + - 20000000 + '10': + - 200000 + - 1000000 + - 3000000 + - 20000000 + '11': + - 50000 + - 100000 + - 200000 + - 1000000 + - 3000000 + - 20000000 + '12': + - 7500 + - 20000 + - 50000 + - 100000 + - 200000 + - 1000000 + - 3000000 + - 20000000 +notes: +- Japan full-detail production 仍保持 z0-z12;不新增 z13/z14。 +- z12 enumeration 加入 1:7,500(G),避免正确 Japan 数据中的 G 级细节被生产策略直接忽略。 +- z12 scale ladder 优先 7,500,再回退 20k/50k/100k/...。 +- z0-z11 extent=4096;z12 extent=1048576,保持已验证 NavSea/MapLibre 契约。 +- enumeration_scales 仅决定物化范围;scale_ladders 仅决定 tile 内选择/回退。 diff --git a/config/pbf/cm95_tile_policy_v1.yaml b/config/pbf/cm95_tile_policy_v1.yaml new file mode 100644 index 0000000..8defea5 --- /dev/null +++ b/config/pbf/cm95_tile_policy_v1.yaml @@ -0,0 +1,51 @@ +schema: navsea.cm95.tile-policy/v1 +version: v1.2-production-materialization-split +status: PRODUCTION_CANDIDATE +xyz: true +nominal_tile_pixels: 256 +buffer_tile_pixels: 8 +default_extent: 4096 +extent_by_zoom: + '10': 4096 + '11': 4096 + '12': 1048576 + +# enumeration_scales 决定哪些 coverage 可以创建物理 tile。 +# 这里只使用与目标 zoom 匹配的原生/近原生比例尺,避免粗比例尺 coverage +# 把高 zoom 生产范围膨胀成百万级静态文件。 +enumeration_scales: + '0': [20000000] + '1': [20000000] + '2': [20000000] + '3': [20000000] + '4': [20000000] + '5': [3000000] + '6': [3000000] + '7': [3000000] + '8': [1000000] + '9': [1000000] + '10': [200000] + '11': [50000, 100000] + '12': [20000, 50000] + +# scale_ladders 只控制已经决定生成的 tile 内部如何选择数据。 +# 粗比例尺仍可作为 tile 内回退,但不再扩张 tile 枚举范围。 +scale_ladders: + '0': [20000000] + '1': [20000000] + '2': [20000000] + '3': [20000000] + '4': [20000000] + '5': [3000000, 20000000] + '6': [3000000, 20000000] + '7': [3000000, 20000000] + '8': [1000000, 3000000, 20000000] + '9': [1000000, 3000000, 20000000] + '10': [200000, 1000000, 3000000, 20000000] + '11': [50000, 100000, 200000, 1000000, 3000000, 20000000] + '12': [20000, 50000, 100000, 200000, 1000000, 3000000, 20000000] +notes: + - 生产目标为 z0-z12;Pilot 的 z10-z12 只用于验证。 + - enumeration_scales 与 scale_ladders 必须分离。 + - enumeration_scales 只决定是否物化 tile;scale_ladders 只决定 tile 内数据回退。 + - z0-z11 extent=4096;z12 extent=1048576,保持已验证 NavSea 契约。 diff --git a/config/pbf/cm95_v1_4_5_nonrenderable_label_tiles.txt b/config/pbf/cm95_v1_4_5_nonrenderable_label_tiles.txt new file mode 100644 index 0000000..8e93fdb --- /dev/null +++ b/config/pbf/cm95_v1_4_5_nonrenderable_label_tiles.txt @@ -0,0 +1,18 @@ +# CM95 PBF v1.4.5 定向重建 tile +# 来源:cm95_style_contract_unmatched_features_v1.json +10/912/366 +10/913/366 +10/916/327 +11/1893/717 +11/1893/718 +11/1908/643 +11/1908/645 +11/1909/636 +11/1909/639 +11/1909/643 +11/1910/633 +12/3662/1409 +12/3737/1466 +12/3787/1435 +12/3787/1436 +12/3825/1376 diff --git a/config/sprite/semantic-sprite-20260808.json b/config/sprite/semantic-sprite-20260808.json new file mode 100644 index 0000000..7272935 --- /dev/null +++ b/config/sprite/semantic-sprite-20260808.json @@ -0,0 +1,3334 @@ +{ + "arc_g233_249_g012_130": { + "x": 0, + "y": 0, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_g000_215": { + "x": 144, + "y": 0, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_g113_039": { + "x": 288, + "y": 0, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r181_211_y211_181": { + "x": 432, + "y": 0, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r182_072": { + "x": 576, + "y": 0, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r191_201_y201_191": { + "x": 720, + "y": 0, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r228_121": { + "x": 864, + "y": 0, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r244_260_r000_117": { + "x": 0, + "y": 144, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r293_145": { + "x": 144, + "y": 144, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r042_130_y130_042": { + "x": 288, + "y": 144, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r057_087_y087_057": { + "x": 432, + "y": 144, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r075_119_y119_269": { + "x": 576, + "y": 144, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r077_325": { + "x": 720, + "y": 144, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r120_030": { + "x": 864, + "y": 144, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_r137_130": { + "x": 0, + "y": 288, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y182_064": { + "x": 144, + "y": 288, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y184_066": { + "x": 288, + "y": 288, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y186_135": { + "x": 432, + "y": 288, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y187_097": { + "x": 576, + "y": 288, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y188_063": { + "x": 720, + "y": 288, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y190_113": { + "x": 864, + "y": 288, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y194_033": { + "x": 0, + "y": 432, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y196_001": { + "x": 144, + "y": 432, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y196_111": { + "x": 288, + "y": 432, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y198_018": { + "x": 432, + "y": 432, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y198_078": { + "x": 576, + "y": 432, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y200_056": { + "x": 720, + "y": 432, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y200_063": { + "x": 864, + "y": 432, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y201_033": { + "x": 0, + "y": 576, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y201_073": { + "x": 144, + "y": 576, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y202_022": { + "x": 288, + "y": 576, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y202_127": { + "x": 432, + "y": 576, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y204_078": { + "x": 576, + "y": 576, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y205_093": { + "x": 720, + "y": 576, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y207_109": { + "x": 864, + "y": 576, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y208_107": { + "x": 0, + "y": 720, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y209_088": { + "x": 144, + "y": 720, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y209_100": { + "x": 288, + "y": 720, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y210_095": { + "x": 432, + "y": 720, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y211_150": { + "x": 576, + "y": 720, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y213_069": { + "x": 720, + "y": 720, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y215_029": { + "x": 864, + "y": 720, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y215_041_y063_207_r207_215_r041_063": { + "x": 0, + "y": 864, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y215_103": { + "x": 144, + "y": 864, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y216_036": { + "x": 288, + "y": 864, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y220_073": { + "x": 432, + "y": 864, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y223_043": { + "x": 576, + "y": 864, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y225_315": { + "x": 720, + "y": 864, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y228_033": { + "x": 864, + "y": 864, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y231_134": { + "x": 0, + "y": 1008, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y232_100_r261_272_g232_253": { + "x": 144, + "y": 1008, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y232_125": { + "x": 288, + "y": 1008, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y233_099": { + "x": 432, + "y": 1008, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y234_046": { + "x": 576, + "y": 1008, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y237_128": { + "x": 720, + "y": 1008, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y240_077": { + "x": 864, + "y": 1008, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y240_139": { + "x": 0, + "y": 1152, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y241_086_r259_277": { + "x": 144, + "y": 1152, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y243_071_y084_221_r221_243_r071_084": { + "x": 288, + "y": 1152, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y248_118": { + "x": 432, + "y": 1152, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y250_090": { + "x": 576, + "y": 1152, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y250_134": { + "x": 720, + "y": 1152, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y250_156": { + "x": 864, + "y": 1152, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y253_129": { + "x": 0, + "y": 1296, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y257_106": { + "x": 144, + "y": 1296, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y259_130": { + "x": 288, + "y": 1296, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y259_155": { + "x": 432, + "y": 1296, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y261_113": { + "x": 576, + "y": 1296, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y262_152": { + "x": 720, + "y": 1296, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y264_201_r201_264": { + "x": 864, + "y": 1296, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y266_086_r086_266": { + "x": 0, + "y": 1440, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y271_177": { + "x": 144, + "y": 1440, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y272_112": { + "x": 288, + "y": 1440, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y273_213": { + "x": 432, + "y": 1440, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y273_160": { + "x": 576, + "y": 1440, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y274_180": { + "x": 720, + "y": 1440, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y275_284_r215_275_r284_350": { + "x": 864, + "y": 1440, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y275_132": { + "x": 0, + "y": 1584, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y277_230": { + "x": 144, + "y": 1584, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y277_155": { + "x": 288, + "y": 1584, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y278_180": { + "x": 432, + "y": 1584, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y279_138": { + "x": 576, + "y": 1584, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y282_322": { + "x": 720, + "y": 1584, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y282_175": { + "x": 864, + "y": 1584, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y284_192": { + "x": 0, + "y": 1728, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y285_193": { + "x": 144, + "y": 1728, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y285_200": { + "x": 288, + "y": 1728, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y285_159_r159_195": { + "x": 432, + "y": 1728, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y286_164": { + "x": 576, + "y": 1728, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y287_223": { + "x": 720, + "y": 1728, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y288_167": { + "x": 864, + "y": 1728, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y289_213": { + "x": 0, + "y": 1872, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y289_136": { + "x": 144, + "y": 1872, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y295_232": { + "x": 288, + "y": 1872, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y296_244": { + "x": 432, + "y": 1872, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y296_272_r272_296": { + "x": 576, + "y": 1872, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y298_149": { + "x": 720, + "y": 1872, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y300_305_y310_132_r305_310": { + "x": 864, + "y": 1872, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y301_138": { + "x": 0, + "y": 2016, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y304_144": { + "x": 144, + "y": 2016, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y305_171": { + "x": 288, + "y": 2016, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y312_138": { + "x": 432, + "y": 2016, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y313_210": { + "x": 576, + "y": 2016, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y315_140": { + "x": 720, + "y": 2016, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y318_198": { + "x": 864, + "y": 2016, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y319_176_r286_319": { + "x": 0, + "y": 2160, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y320_192": { + "x": 144, + "y": 2160, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y320_161": { + "x": 288, + "y": 2160, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y332_197": { + "x": 432, + "y": 2160, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y335_185": { + "x": 576, + "y": 2160, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y336_188": { + "x": 720, + "y": 2160, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y336_155": { + "x": 864, + "y": 2160, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y339_190": { + "x": 0, + "y": 2304, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y340_186": { + "x": 144, + "y": 2304, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y340_149": { + "x": 288, + "y": 2304, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y342_212": { + "x": 432, + "y": 2304, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y346_178": { + "x": 576, + "y": 2304, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y348_198": { + "x": 720, + "y": 2304, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y349_245": { + "x": 864, + "y": 2304, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y350_025_y035_231_r025_035": { + "x": 0, + "y": 2448, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y352_260": { + "x": 144, + "y": 2448, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y353_262": { + "x": 288, + "y": 2448, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y355_197": { + "x": 432, + "y": 2448, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y357_251": { + "x": 576, + "y": 2448, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y358_246": { + "x": 720, + "y": 2448, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y000_188": { + "x": 864, + "y": 2448, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y000_240": { + "x": 0, + "y": 2592, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y000_242": { + "x": 144, + "y": 2592, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y001_309_r309_001": { + "x": 288, + "y": 2592, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y002_270": { + "x": 432, + "y": 2592, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y005_235": { + "x": 576, + "y": 2592, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y005_275": { + "x": 720, + "y": 2592, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y007_322": { + "x": 864, + "y": 2592, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y010_237": { + "x": 0, + "y": 2736, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y010_265": { + "x": 144, + "y": 2736, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y014_209": { + "x": 288, + "y": 2736, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y015_201": { + "x": 432, + "y": 2736, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y017_197": { + "x": 576, + "y": 2736, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y018_277": { + "x": 720, + "y": 2736, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y018_178": { + "x": 864, + "y": 2736, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y019_199": { + "x": 0, + "y": 2880, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y019_259_r223_259": { + "x": 144, + "y": 2880, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y019_163": { + "x": 288, + "y": 2880, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y021_271": { + "x": 432, + "y": 2880, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y023_279": { + "x": 576, + "y": 2880, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y024_223": { + "x": 720, + "y": 2880, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y024_279": { + "x": 864, + "y": 2880, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y025_225": { + "x": 0, + "y": 3024, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y025_277": { + "x": 144, + "y": 3024, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y027_218": { + "x": 288, + "y": 3024, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y027_228_r228_250": { + "x": 432, + "y": 3024, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y029_296": { + "x": 576, + "y": 3024, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y030_271": { + "x": 720, + "y": 3024, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y033_193": { + "x": 864, + "y": 3024, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y035_342": { + "x": 0, + "y": 3168, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y036_278": { + "x": 144, + "y": 3168, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y037_299": { + "x": 288, + "y": 3168, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y041_232": { + "x": 432, + "y": 3168, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y041_284": { + "x": 576, + "y": 3168, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y042_235": { + "x": 720, + "y": 3168, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y042_243": { + "x": 864, + "y": 3168, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y043_317": { + "x": 0, + "y": 3312, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y049_253": { + "x": 144, + "y": 3312, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y050_230": { + "x": 288, + "y": 3312, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y050_256": { + "x": 432, + "y": 3312, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y051_215_y236_280_r215_236": { + "x": 576, + "y": 3312, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y051_347_y305_347": { + "x": 720, + "y": 3312, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y052_230": { + "x": 864, + "y": 3312, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y052_046_r046_052": { + "x": 0, + "y": 3456, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y053_290": { + "x": 144, + "y": 3456, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y055_105_y115_125_y140_350": { + "x": 288, + "y": 3456, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y057_280": { + "x": 432, + "y": 3456, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y060_350": { + "x": 576, + "y": 3456, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y061_047_r047_061": { + "x": 720, + "y": 3456, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y062_330": { + "x": 864, + "y": 3456, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y065_272": { + "x": 0, + "y": 3600, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y066_106_y116_320": { + "x": 144, + "y": 3600, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y071_295": { + "x": 288, + "y": 3600, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y074_260_r260_281": { + "x": 432, + "y": 3600, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y074_349": { + "x": 576, + "y": 3600, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y075_255": { + "x": 720, + "y": 3600, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y077_312": { + "x": 864, + "y": 3600, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y077_314": { + "x": 0, + "y": 3744, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y077_102_y115_143_y190_328_r037_077_r102_115_r143_190": { + "x": 144, + "y": 3744, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y079_293": { + "x": 288, + "y": 3744, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y081_294": { + "x": 432, + "y": 3744, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y083_263": { + "x": 576, + "y": 3744, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y085_034": { + "x": 720, + "y": 3744, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y085_062_r062_085": { + "x": 864, + "y": 3744, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y086_342": { + "x": 0, + "y": 3888, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y089_326": { + "x": 144, + "y": 3888, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y090_260": { + "x": 288, + "y": 3888, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y090_035_r035_090": { + "x": 432, + "y": 3888, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y091_293": { + "x": 576, + "y": 3888, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y091_295": { + "x": 720, + "y": 3888, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y092_031": { + "x": 864, + "y": 3888, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y094_285_r070_094": { + "x": 0, + "y": 4032, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y094_337": { + "x": 144, + "y": 4032, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y095_311": { + "x": 288, + "y": 4032, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y098_310": { + "x": 432, + "y": 4032, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y099_278": { + "x": 576, + "y": 4032, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y105_327": { + "x": 720, + "y": 4032, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y110_257_r257_270_y270_009": { + "x": 864, + "y": 4032, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y115_000": { + "x": 0, + "y": 4176, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y117_334": { + "x": 144, + "y": 4176, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y117_010": { + "x": 288, + "y": 4176, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y117_074": { + "x": 432, + "y": 4176, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y120_336": { + "x": 576, + "y": 4176, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y121_352": { + "x": 720, + "y": 4176, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y121_355": { + "x": 864, + "y": 4176, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y126_004": { + "x": 0, + "y": 4320, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y127_300": { + "x": 144, + "y": 4320, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y131_039": { + "x": 288, + "y": 4320, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y133_325": { + "x": 432, + "y": 4320, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y134_287": { + "x": 576, + "y": 4320, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y134_021": { + "x": 720, + "y": 4320, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y138_326": { + "x": 864, + "y": 4320, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y143_351": { + "x": 0, + "y": 4464, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y143_053": { + "x": 144, + "y": 4464, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y145_082": { + "x": 288, + "y": 4464, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y146_342": { + "x": 432, + "y": 4464, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y146_344": { + "x": 576, + "y": 4464, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y147_048": { + "x": 720, + "y": 4464, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y151_331": { + "x": 864, + "y": 4464, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y154_023": { + "x": 0, + "y": 4608, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y156_063": { + "x": 144, + "y": 4608, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y163_116": { + "x": 288, + "y": 4608, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y166_357": { + "x": 432, + "y": 4608, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y170_030": { + "x": 576, + "y": 4608, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y172_052": { + "x": 720, + "y": 4608, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y176_006": { + "x": 864, + "y": 4608, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_y178_347": { + "x": 0, + "y": 4752, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_05177027": { + "x": 144, + "y": 4752, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_06172050": { + "x": 288, + "y": 4752, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_06191091": { + "x": 432, + "y": 4752, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_07207029": { + "x": 576, + "y": 4752, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_07207075": { + "x": 720, + "y": 4752, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_07357229": { + "x": 864, + "y": 4752, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_08007250": { + "x": 0, + "y": 4896, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_08024245": { + "x": 144, + "y": 4896, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_08034279": { + "x": 288, + "y": 4896, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_08057336": { + "x": 432, + "y": 4896, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_08068287": { + "x": 576, + "y": 4896, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_08189045": { + "x": 720, + "y": 4896, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_08208134": { + "x": 864, + "y": 4896, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_08241098": { + "x": 0, + "y": 5040, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_08255101": { + "x": 144, + "y": 5040, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_code_08350232": { + "x": 288, + "y": 5040, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_l3": { + "x": 432, + "y": 5040, + "width": 144, + "height": 144, + "pixelRatio": 1 + }, + "arc_green": { + "x": 576, + "y": 5040, + "width": 96, + "height": 96, + "pixelRatio": 1 + }, + "arc_red": { + "x": 672, + "y": 5040, + "width": 96, + "height": 96, + "pixelRatio": 1 + }, + "arc_yellow_white": { + "x": 768, + "y": 5040, + "width": 96, + "height": 96, + "pixelRatio": 1 + }, + "arc_s1": { + "x": 864, + "y": 5040, + "width": 64, + "height": 64, + "pixelRatio": 1 + }, + "arc_s2": { + "x": 928, + "y": 5040, + "width": 64, + "height": 64, + "pixelRatio": 1 + }, + "arc_s3": { + "x": 0, + "y": 5184, + "width": 64, + "height": 64, + "pixelRatio": 1 + }, + "arrow_0": { + "x": 64, + "y": 5184, + "width": 8, + "height": 32, + "pixelRatio": 1 + }, + "arrow_1": { + "x": 72, + "y": 5184, + "width": 8, + "height": 32, + "pixelRatio": 1 + }, + "arrow_2": { + "x": 80, + "y": 5184, + "width": 8, + "height": 32, + "pixelRatio": 1 + }, + "arrow_3": { + "x": 88, + "y": 5184, + "width": 8, + "height": 32, + "pixelRatio": 1 + }, + "arrow_4": { + "x": 96, + "y": 5184, + "width": 8, + "height": 32, + "pixelRatio": 1 + }, + "pattern_fill_shallow_hazard": { + "x": 104, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "pattern_fill_rock_hazard": { + "x": 112, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "pattern_fill_area_light_hatch": { + "x": 120, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "pattern_fill_foul_ground": { + "x": 128, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "pattern_fill_sand_wave": { + "x": 136, + "y": 5184, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "pattern_fill_obstruction": { + "x": 152, + "y": 5184, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "pattern_fill_fish_reef": { + "x": 168, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "pattern_fill_fish_reef_dangerous": { + "x": 176, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "pattern_fill_area_red": { + "x": 184, + "y": 5184, + "width": 4, + "height": 4, + "pixelRatio": 1 + }, + "pattern_fill_area_yellow": { + "x": 188, + "y": 5184, + "width": 4, + "height": 4, + "pixelRatio": 1 + }, + "pattern_fill_area_green": { + "x": 192, + "y": 5184, + "width": 4, + "height": 4, + "pixelRatio": 1 + }, + "pattern_fill_area_gray_green": { + "x": 196, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "pattern_fill_area_yellow_grid": { + "x": 204, + "y": 5184, + "width": 4, + "height": 4, + "pixelRatio": 1 + }, + "pattern_fill_facility_area": { + "x": 208, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "pattern_fill_area_magenta_mesh": { + "x": 216, + "y": 5184, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "pattern_fill_area_gray_green_hatch": { + "x": 232, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "pattern_fill_fishery_fixed_gear": { + "x": 240, + "y": 5184, + "width": 4, + "height": 4, + "pixelRatio": 1 + }, + "pattern_fill_fishery_partition": { + "x": 244, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "flare_green": { + "x": 252, + "y": 5184, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "flare_red": { + "x": 284, + "y": 5184, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "flare_yellow_white": { + "x": 316, + "y": 5184, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "pattern_line_subsea_cable": { + "x": 348, + "y": 5184, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "pattern_line_subsea_water_pipe": { + "x": 364, + "y": 5184, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "pattern_line_subsea_oil_gas_pipe": { + "x": 380, + "y": 5184, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "pattern_line_restricted_boundary": { + "x": 396, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "pattern_line_warning_wave": { + "x": 404, + "y": 5184, + "width": 64, + "height": 64, + "pixelRatio": 1 + }, + "pattern_line_guidance_line": { + "x": 468, + "y": 5184, + "width": 64, + "height": 64, + "pixelRatio": 1 + }, + "pattern_line_facility_boundary": { + "x": 532, + "y": 5184, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "shipfinder_hull_blue": { + "x": 540, + "y": 5184, + "width": 16, + "height": 32, + "pixelRatio": 1 + }, + "shipfinder_hull_gray": { + "x": 556, + "y": 5184, + "width": 16, + "height": 32, + "pixelRatio": 1 + }, + "shipfinder_hull_green": { + "x": 572, + "y": 5184, + "width": 16, + "height": 32, + "pixelRatio": 1 + }, + "shipfinder_hull_orange": { + "x": 588, + "y": 5184, + "width": 16, + "height": 32, + "pixelRatio": 1 + }, + "shipfinder_hull_red": { + "x": 604, + "y": 5184, + "width": 16, + "height": 32, + "pixelRatio": 1 + }, + "shipfinder_hull_yellow": { + "x": 620, + "y": 5184, + "width": 16, + "height": 32, + "pixelRatio": 1 + }, + "shipfinder_left": { + "x": 636, + "y": 5184, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "shipfinder_lost": { + "x": 652, + "y": 5184, + "width": 16, + "height": 24, + "pixelRatio": 1 + }, + "shipfinder_right": { + "x": 668, + "y": 5184, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "shipfinder_sog1": { + "x": 684, + "y": 5184, + "width": 2, + "height": 300, + "pixelRatio": 1 + }, + "shipfinder_sog2": { + "x": 686, + "y": 5184, + "width": 2, + "height": 300, + "pixelRatio": 1 + }, + "shipfinder_sog3": { + "x": 688, + "y": 5184, + "width": 2, + "height": 300, + "pixelRatio": 1 + }, + "shipfinder_sog4": { + "x": 690, + "y": 5184, + "width": 2, + "height": 300, + "pixelRatio": 1 + }, + "shipfinder_sog5": { + "x": 692, + "y": 5184, + "width": 2, + "height": 300, + "pixelRatio": 1 + }, + "shipfinder_sog6": { + "x": 694, + "y": 5184, + "width": 2, + "height": 300, + "pixelRatio": 1 + }, + "shipfinder_straight": { + "x": 696, + "y": 5184, + "width": 2, + "height": 64, + "pixelRatio": 1 + }, + "lighthouse_coastal": { + "x": 698, + "y": 5184, + "width": 48, + "height": 64, + "pixelRatio": 1 + }, + "lighthouse_harbor": { + "x": 746, + "y": 5184, + "width": 12, + "height": 48, + "pixelRatio": 1 + }, + "lighthouse_breakwater": { + "x": 758, + "y": 5184, + "width": 8, + "height": 32, + "pixelRatio": 1 + }, + "light_minor": { + "x": 766, + "y": 5184, + "width": 10, + "height": 10, + "pixelRatio": 1 + }, + "mark_light_g": { + "x": 776, + "y": 5184, + "width": 48, + "height": 32, + "pixelRatio": 1 + }, + "mark_light_r": { + "x": 824, + "y": 5184, + "width": 48, + "height": 32, + "pixelRatio": 1 + }, + "mark_light_yw": { + "x": 872, + "y": 5184, + "width": 48, + "height": 32, + "pixelRatio": 1 + }, + "buoy_light_variantt_000": { + "x": 920, + "y": 5184, + "width": 32, + "height": 60, + "pixelRatio": 1 + }, + "buoy_light_variantt_000__30700002": { + "x": 952, + "y": 5184, + "width": 32, + "height": 60, + "pixelRatio": 1 + }, + "buoy_light_yw": { + "x": 984, + "y": 5184, + "width": 32, + "height": 60, + "pixelRatio": 1 + }, + "station_radio_radar": { + "x": 0, + "y": 5484, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "beacon_light": { + "x": 32, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_light_mark_port": { + "x": 48, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_light_mark_starboard": { + "x": 64, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_light_mark_north": { + "x": 80, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_light_mark_east": { + "x": 96, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_light_mark_west": { + "x": 112, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_light_mark_south": { + "x": 128, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_light_mark_isolated_danger": { + "x": 144, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_light_mark_safe_water": { + "x": 160, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_light_mark_special": { + "x": 176, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_light_mark_mooring": { + "x": 192, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "buoy_light_port": { + "x": 208, + "y": 5484, + "width": 32, + "height": 48, + "pixelRatio": 1 + }, + "buoy_light_starboard": { + "x": 240, + "y": 5484, + "width": 32, + "height": 48, + "pixelRatio": 1 + }, + "buoy_light_north": { + "x": 272, + "y": 5484, + "width": 32, + "height": 48, + "pixelRatio": 1 + }, + "buoy_light_east": { + "x": 304, + "y": 5484, + "width": 32, + "height": 48, + "pixelRatio": 1 + }, + "buoy_light_west": { + "x": 336, + "y": 5484, + "width": 32, + "height": 48, + "pixelRatio": 1 + }, + "buoy_light_south": { + "x": 368, + "y": 5484, + "width": 32, + "height": 48, + "pixelRatio": 1 + }, + "buoy_light_isolated_danger": { + "x": 400, + "y": 5484, + "width": 32, + "height": 48, + "pixelRatio": 1 + }, + "buoy_light_safe_water": { + "x": 432, + "y": 5484, + "width": 32, + "height": 48, + "pixelRatio": 1 + }, + "buoy_light_special": { + "x": 464, + "y": 5484, + "width": 32, + "height": 48, + "pixelRatio": 1 + }, + "buoy_mooring_mooring": { + "x": 496, + "y": 5484, + "width": 24, + "height": 32, + "pixelRatio": 1 + }, + "buoy_lattice": { + "x": 520, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_lattice_port": { + "x": 544, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_lattice_starboard": { + "x": 568, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_lattice_north": { + "x": 592, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_lattice_east": { + "x": 616, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_lattice_west": { + "x": 640, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_lattice_south": { + "x": 664, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_lattice_isolated_danger": { + "x": 688, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_lattice_safe_water": { + "x": 712, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_lattice_special": { + "x": 736, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_lattice_mooring": { + "x": 760, + "y": 5484, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "beacon_large": { + "x": 784, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "beacon_large_port": { + "x": 800, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "beacon_large_starboard": { + "x": 816, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "beacon_large_north": { + "x": 832, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "beacon_large_east": { + "x": 848, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "beacon_large_west": { + "x": 864, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "beacon_large_south": { + "x": 880, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "beacon_large_isolated_danger": { + "x": 896, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "beacon_large_safe_water": { + "x": 912, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "beacon_large_special": { + "x": 928, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "beacon_large_mooring": { + "x": 944, + "y": 5484, + "width": 16, + "height": 64, + "pixelRatio": 1 + }, + "mark_tower": { + "x": 960, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "mark_tower_light_port": { + "x": 976, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "mark_tower_light_starboard": { + "x": 992, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "mark_tower_light_north": { + "x": 1008, + "y": 5484, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "mark_tower_light_east": { + "x": 0, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "mark_tower_light_west": { + "x": 16, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "mark_tower_light_south": { + "x": 32, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "mark_tower_light_isolated_danger": { + "x": 48, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "mark_tower_light_safe_water": { + "x": 64, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "mark_tower_light_special": { + "x": 80, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "mark_tower_light_mooring": { + "x": 96, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "buoy_light": { + "x": 112, + "y": 5548, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "buoy_sphere": { + "x": 120, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_sphere_port": { + "x": 144, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_sphere_starboard": { + "x": 168, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_sphere_north": { + "x": 192, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_sphere_east": { + "x": 216, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_sphere_west": { + "x": 240, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_sphere_south": { + "x": 264, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_sphere_isolated_danger": { + "x": 288, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_sphere_safe_water": { + "x": 312, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_sphere_special": { + "x": 336, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_sphere_mooring": { + "x": 360, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar": { + "x": 384, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar_light_port": { + "x": 408, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar_light_starboard": { + "x": 432, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar_light_north": { + "x": 456, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar_light_east": { + "x": 480, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar_light_west": { + "x": 504, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar_light_south": { + "x": 528, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar_light_isolated_danger": { + "x": 552, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar_light_safe_water": { + "x": 576, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar_light_special": { + "x": 600, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_pillar_light_mooring": { + "x": 624, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_cylinder": { + "x": 648, + "y": 5548, + "width": 24, + "height": 32, + "pixelRatio": 1 + }, + "buoy_cone": { + "x": 672, + "y": 5548, + "width": 20, + "height": 24, + "pixelRatio": 1 + }, + "mark_small": { + "x": 692, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_small_port": { + "x": 708, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_small_starboard": { + "x": 724, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_small_north": { + "x": 740, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_small_east": { + "x": 756, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_small_west": { + "x": 772, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_small_south": { + "x": 788, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_small_isolated_danger": { + "x": 804, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_small_safe_water": { + "x": 820, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_small_special": { + "x": 836, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "beacon_small_mooring": { + "x": 852, + "y": 5548, + "width": 16, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light": { + "x": 868, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light_port": { + "x": 892, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light_starboard": { + "x": 916, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light_north": { + "x": 940, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light_east": { + "x": 964, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light_west": { + "x": 988, + "y": 5548, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light_south": { + "x": 0, + "y": 5596, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light_isolated_danger": { + "x": 24, + "y": 5596, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light_safe_water": { + "x": 48, + "y": 5596, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light_special": { + "x": 72, + "y": 5596, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "buoy_barrel_light_mooring": { + "x": 96, + "y": 5596, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "mark_vais_port": { + "x": 120, + "y": 5596, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "mark_vais_starboard": { + "x": 152, + "y": 5596, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "mark_vais_north": { + "x": 184, + "y": 5596, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "mark_vais_east": { + "x": 216, + "y": 5596, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "mark_vais_west": { + "x": 248, + "y": 5596, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "mark_vais_south": { + "x": 280, + "y": 5596, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "mark_vais_isolated_danger": { + "x": 312, + "y": 5596, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "mark_vais_safe_water": { + "x": 344, + "y": 5596, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "mark_vais_special": { + "x": 376, + "y": 5596, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "mark_vais_emergency_wreck": { + "x": 408, + "y": 5596, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "rock_awash": { + "x": 440, + "y": 5596, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "rock_submerged": { + "x": 456, + "y": 5596, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "hazard_cleared": { + "x": 472, + "y": 5596, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "volcano_submerged": { + "x": 488, + "y": 5596, + "width": 12, + "height": 16, + "pixelRatio": 1 + }, + "reef_coral_awash": { + "x": 500, + "y": 5596, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "reef_coral_submerged": { + "x": 516, + "y": 5596, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "hazard_isolated": { + "x": 532, + "y": 5596, + "width": 24, + "height": 24, + "pixelRatio": 1 + }, + "wreck_hull_exposed": { + "x": 556, + "y": 5596, + "width": 24, + "height": 16, + "pixelRatio": 1 + }, + "wreck_submerged_dangerous": { + "x": 580, + "y": 5596, + "width": 16, + "height": 12, + "pixelRatio": 1 + }, + "wreck_surveyed": { + "x": 596, + "y": 5596, + "width": 16, + "height": 12, + "pixelRatio": 1 + }, + "wreck_swept": { + "x": 612, + "y": 5596, + "width": 16, + "height": 6, + "pixelRatio": 1 + }, + "hazard_foul_ground": { + "x": 628, + "y": 5596, + "width": 16, + "height": 12, + "pixelRatio": 1 + }, + "sand_wave": { + "x": 644, + "y": 5596, + "width": 20, + "height": 8, + "pixelRatio": 1 + }, + "tide_rip": { + "x": 664, + "y": 5596, + "width": 20, + "height": 8, + "pixelRatio": 1 + }, + "whirlpool": { + "x": 684, + "y": 5596, + "width": 20, + "height": 24, + "pixelRatio": 1 + }, + "seaweed": { + "x": 704, + "y": 5596, + "width": 24, + "height": 8, + "pixelRatio": 1 + }, + "driftwood": { + "x": 728, + "y": 5596, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "obstruction": { + "x": 744, + "y": 5596, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "reef_fish": { + "x": 760, + "y": 5596, + "width": 24, + "height": 18, + "pixelRatio": 1 + }, + "reef_fish_dangerous": { + "x": 784, + "y": 5596, + "width": 24, + "height": 18, + "pixelRatio": 1 + }, + "platform_oil": { + "x": 808, + "y": 5596, + "width": 12, + "height": 12, + "pixelRatio": 1 + }, + "structure_tower": { + "x": 820, + "y": 5596, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "structure_pile": { + "x": 828, + "y": 5596, + "width": 8, + "height": 8, + "pixelRatio": 1 + }, + "structure_dolphin": { + "x": 836, + "y": 5596, + "width": 12, + "height": 12, + "pixelRatio": 1 + }, + "structure_subsea_outfall": { + "x": 848, + "y": 5596, + "width": 12, + "height": 12, + "pixelRatio": 1 + }, + "marker_black_box": { + "x": 860, + "y": 5596, + "width": 6, + "height": 6, + "pixelRatio": 1 + }, + "station_pilot": { + "x": 866, + "y": 5596, + "width": 20, + "height": 20, + "pixelRatio": 1 + }, + "port_general": { + "x": 886, + "y": 5596, + "width": 20, + "height": 20, + "pixelRatio": 1 + }, + "port_fishing": { + "x": 906, + "y": 5596, + "width": 20, + "height": 20, + "pixelRatio": 1 + }, + "port_marina": { + "x": 926, + "y": 5596, + "width": 20, + "height": 20, + "pixelRatio": 1 + }, + "port_fisherina": { + "x": 946, + "y": 5596, + "width": 20, + "height": 20, + "pixelRatio": 1 + }, + "station_sea": { + "x": 966, + "y": 5596, + "width": 20, + "height": 20, + "pixelRatio": 1 + }, + "marker_black_box__590": { + "x": 986, + "y": 5596, + "width": 6, + "height": 6, + "pixelRatio": 1 + }, + "landmark_chimney": { + "x": 992, + "y": 5596, + "width": 24, + "height": 48, + "pixelRatio": 1 + }, + "landmark_tower_windmill": { + "x": 0, + "y": 5644, + "width": 12, + "height": 32, + "pixelRatio": 1 + }, + "landmark_maritime_office": { + "x": 12, + "y": 5644, + "width": 12, + "height": 12, + "pixelRatio": 1 + }, + "landmark_fishing_coop": { + "x": 24, + "y": 5644, + "width": 12, + "height": 12, + "pixelRatio": 1 + }, + "landmark_convenience_store": { + "x": 36, + "y": 5644, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "landmark_prominent": { + "x": 52, + "y": 5644, + "width": 16, + "height": 16, + "pixelRatio": 1 + }, + "landmark_mountain": { + "x": 68, + "y": 5644, + "width": 20, + "height": 14, + "pixelRatio": 1 + }, + "station_control_signal": { + "x": 88, + "y": 5644, + "width": 31, + "height": 23, + "pixelRatio": 1 + }, + "landmark_other": { + "x": 119, + "y": 5644, + "width": 16, + "height": 32, + "pixelRatio": 1 + }, + "anchorage_quarantine": { + "x": 135, + "y": 5644, + "width": 20, + "height": 20, + "pixelRatio": 1 + }, + "anchorage_designated": { + "x": 155, + "y": 5644, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "area_restricted": { + "x": 187, + "y": 5644, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "area_no_anchoring": { + "x": 219, + "y": 5644, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "arrow_course_legal": { + "x": 251, + "y": 5644, + "width": 20, + "height": 45, + "pixelRatio": 1 + }, + "arrow_course_guidance": { + "x": 271, + "y": 5644, + "width": 20, + "height": 45, + "pixelRatio": 1 + }, + "arrow_water_source": { + "x": 291, + "y": 5644, + "width": 24, + "height": 16, + "pixelRatio": 1 + }, + "tide_spot": { + "x": 315, + "y": 5644, + "width": 18, + "height": 16, + "pixelRatio": 1 + } +} diff --git a/config/style/style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json b/config/style/style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json new file mode 100644 index 0000000..aeee577 --- /dev/null +++ b/config/style/style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json @@ -0,0 +1,2496 @@ +{ + "version": 8, + "name": "NavSea Delivery Full Semantic Unified 20260808 + CM95 Soundings v1", + "sprite": "http://192.168.200.184/newpec/sprite-semantic-unified-20260808/sprite", + "glyphs": "http://192.168.200.184/newpec/fonts/{fontstack}/{range}.pbf", + "sources": { + "mapple": { + "type": "raster", + "minzoom": 0, + "maxzoom": 19, + "tileSize": 256, + "tiles": [ + "https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png" + ], + "attribution": "© 昭文社" + }, + "tide": { + "type": "vector", + "minzoom": 8, + "maxzoom": 8, + "tiles": [ + "https://tile.mapple-on.jp/tide-mvt/{z}/{x}/{y}.pbf?ver=20251001" + ], + "attribution": "© 日本水路協会" + }, + "navsea_delivery": { + "type": "vector", + "minzoom": 0, + "maxzoom": 12, + "tiles": [ + "http://192.168.200.184/pbf-delivery-full-semantic-unified-20260808/{z}/{x}/{y}.pbf" + ], + "attribution": "NavSea semantic vector tiles" + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "rgba(255,255,255,1)" + } + }, + { + "id": "base-raster", + "type": "raster", + "source": "mapple", + "paint": { + "raster-opacity": 1, + "raster-saturation": 0, + "raster-contrast": 0.05 + } + }, + { + "id": "tide-spots", + "type": "symbol", + "source": "tide", + "source-layer": "tide", + "layout": { + "icon-allow-overlap": true, + "icon-image": "tide_spot" + } + }, + { + "id": "sea-area-fill", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "match", + [ + "get", + "chart_fill_style" + ], + [ + "depth_zone_0-2m", + "depth_zone_0-5m", + "depth_zone_0-10m", + "depth_zone_0-20m", + "depth_zone_2-5m", + "depth_zone_2-10m", + "depth_zone_2-20m", + "depth_zone_5-10m", + "depth_zone_5-20m", + "depth_zone_10-20m", + "depth_zone_20-100m", + "depth_zone_20-200m", + "depth_zone_100-200m", + "depth_zone_200-500m", + "depth_zone_500-1000m", + "depth_zone_1000-2000m", + "depth_zone_2000-3000m", + "depth_zone_3000-4000m", + "depth_zone_4000-5000m", + "depth_zone_5000-6000m", + "depth_zone_6000-7000m", + "depth_zone_7000-8000m", + "depth_zone_8000-9000m", + "depth_zone_over_9000m", + "water_area" + ], + true, + false + ], + [ + "match", + [ + "get", + "canonical_object_type" + ], + [ + "0-2m", + "0-5m", + "0-10m", + "0-20m", + "2-5m", + "2-10m", + "2-20m", + "5-10m", + "5-20m", + "10-20m", + "20-100m", + "20-200m", + "100-200m", + "200-500m", + "500-1000m", + "1000-2000m", + "2000-3000m", + "3000-4000m", + "4000-5000m", + "5000-6000m", + "6000-7000m", + "7000-8000m", + "8000-9000m", + "over_9000m" + ], + true, + false + ] + ], + "paint": { + "fill-color": [ + "match", + [ + "get", + "canonical_object_type" + ], + "0-2m", + "rgba(240,250,255,1)", + "0-5m", + "rgba(240,250,255,1)", + "0-10m", + "rgba(230,250,255,1)", + "0-20m", + "rgba(220,250,251,1)", + "2-5m", + "rgba(240,250,255,1)", + "2-10m", + "rgba(230,250,255,1)", + "2-20m", + "rgba(220,250,255,1)", + "5-10m", + "rgba(230,250,255,1)", + "5-20m", + "rgba(220,250,255,1)", + "10-20m", + "rgba(220,250,255,1)", + "20-100m", + "rgba(200,240,255,1)", + "20-200m", + "rgba(200,230,255,1)", + "100-200m", + "rgba(200,230,255,1)", + "200-500m", + "rgba(180,220,255,1)", + "500-1000m", + "rgba(171,192,255,1)", + "1000-2000m", + "rgba(163,181,255,1)", + "2000-3000m", + "rgba(132,169,255,1)", + "3000-4000m", + "rgba(89,155,255,1)", + "4000-5000m", + "rgba(90,140,255,1)", + "5000-6000m", + "rgba(100,132,255,1)", + "6000-7000m", + "rgba(128,128,255,1)", + "7000-8000m", + "rgba(139,118,255,1)", + "8000-9000m", + "rgba(150,100,255,1)", + "over_9000m", + "rgba(160,100,255,1)", + "river_area", + "rgba(129,195,226,1)", + "lake_area", + "rgba(129,195,226,1)", + "inland_water_area", + "rgba(129,195,226,1)", + "tidal_flat", + "rgba(143,191,147,1)", + [ + "match", + [ + "get", + "chart_fill_style" + ], + "depth_zone_0-2m", + "rgba(240,250,255,1)", + "depth_zone_0-5m", + "rgba(240,250,255,1)", + "depth_zone_0-10m", + "rgba(230,250,255,1)", + "depth_zone_0-20m", + "rgba(220,250,251,1)", + "depth_zone_2-5m", + "rgba(240,250,255,1)", + "depth_zone_2-10m", + "rgba(230,250,255,1)", + "depth_zone_2-20m", + "rgba(220,250,255,1)", + "depth_zone_5-10m", + "rgba(230,250,255,1)", + "depth_zone_5-20m", + "rgba(220,250,255,1)", + "depth_zone_10-20m", + "rgba(220,250,255,1)", + "depth_zone_20-100m", + "rgba(200,240,255,1)", + "depth_zone_20-200m", + "rgba(200,230,255,1)", + "depth_zone_100-200m", + "rgba(200,230,255,1)", + "depth_zone_200-500m", + "rgba(180,220,255,1)", + "depth_zone_500-1000m", + "rgba(171,192,255,1)", + "depth_zone_1000-2000m", + "rgba(163,181,255,1)", + "depth_zone_2000-3000m", + "rgba(132,169,255,1)", + "depth_zone_3000-4000m", + "rgba(89,155,255,1)", + "depth_zone_4000-5000m", + "rgba(90,140,255,1)", + "depth_zone_5000-6000m", + "rgba(100,132,255,1)", + "depth_zone_6000-7000m", + "rgba(128,128,255,1)", + "depth_zone_7000-8000m", + "rgba(139,118,255,1)", + "depth_zone_8000-9000m", + "rgba(150,100,255,1)", + "depth_zone_over_9000m", + "rgba(160,100,255,1)", + "water_area", + "rgba(129,195,226,1)", + "rgba(160,100,255,1)" + ] + ] + } + }, + { + "id": "tidal-flat", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "==", + [ + "get", + "chart_fill_style" + ], + "tidal_flat" + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "tidal_flat" + ] + ], + "paint": { + "fill-color": "rgba(143,191,147,1)" + } + }, + { + "id": "river-water", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "==", + [ + "get", + "chart_fill_style" + ], + "river_water" + ], + [ + "match", + [ + "get", + "canonical_object_type" + ], + [ + "river_area", + "lake_area", + "inland_water_area" + ], + true, + false + ] + ], + "paint": { + "fill-color": "rgba(129,195,226,1)" + } + }, + { + "id": "unsurveyed-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "==", + [ + "get", + "chart_fill_style" + ], + "unsurveyed_area" + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "unsurveyed_area" + ] + ], + "paint": { + "fill-color": "#efe3a8", + "fill-opacity": 0.55 + } + }, + { + "id": "shoal-danger-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "==", + [ + "get", + "chart_fill_style" + ], + "shoal_danger_area" + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "shoal_danger_area" + ] + ], + "paint": { + "fill-color": "#f0a85d", + "fill-opacity": 0.45 + } + }, + { + "id": "coast-structures-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "==", + [ + "get", + "chart_fill_style" + ], + "coast_structure_area" + ], + [ + "match", + [ + "get", + "canonical_object_type" + ], + [ + "breakwater", + "floating_facility_pier", + "removed_structure_remains" + ], + true, + false + ] + ], + "paint": { + "fill-color": "#8e887d", + "fill-opacity": 0.85 + } + }, + { + "id": "hazard-polygons", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "anchor_caution_hazard_area", + "paint": { + "fill-pattern": [ + "coalesce", + [ + "get", + "chart_fill_pattern" + ], + "" + ] + } + }, + { + "id": "navigation-hazard-polygons", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "navigation_hazard_area", + "paint": { + "fill-pattern": [ + "coalesce", + [ + "get", + "chart_fill_pattern" + ], + "" + ] + } + }, + { + "id": "fishery-areas", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "fixed_fishing_gear_area", + "paint": { + "fill-pattern": [ + "coalesce", + [ + "get", + "chart_fill_pattern" + ], + "" + ] + } + }, + { + "id": "fishery-areas-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "fixed_fishing_gear_area", + "paint": { + "line-color": "rgba(198,77,187,1)", + "line-width": 1 + } + }, + { + "id": "anchorage-areas", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "anchorage_area", + "paint": { + "fill-color": "rgba(0,0,0,0)" + } + }, + { + "id": "facility-zones", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "facility_boundary_area", + "paint": { + "fill-pattern": [ + "coalesce", + [ + "get", + "chart_fill_pattern" + ], + "" + ] + } + }, + { + "id": "submerged-structures", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "submerged_reef_area", + "paint": { + "fill-color": "#7d7f95", + "fill-opacity": 0.45, + "fill-outline-color": "#55586f" + } + }, + { + "id": "bridge-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "bridge_structure", + "paint": { + "fill-color": "rgba(0,0,0,0)" + } + }, + { + "id": "bridge-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "bridge_structure", + "paint": { + "line-color": "rgba(95,106,95,1)", + "line-width": 2 + } + }, + { + "id": "land-structures-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "onshore_structure_area", + "paint": { + "fill-color": "#8a6d3b", + "fill-opacity": 0.8 + } + }, + { + "id": "land-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "land_area", + "paint": { + "fill-color": "rgba(210,200,128,1)" + } + }, + { + "id": "land-hole", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "hole_area", + "paint": { + "fill-color": "rgba(0,0,0,0)" + } + }, + { + "id": "bathymetry-support", + "type": "line", + "source": "navsea_delivery", + "source-layer": "bathymetry_line", + "paint": { + "line-width": [ + "match", + [ + "get", + "depth_value_m" + ], + 10, + 1, + 20, + 1, + 40, + 1, + 60, + 1, + 80, + 1, + 100, + 1, + 150, + 1, + 200, + 1, + 300, + 1, + 400, + 1, + 500, + 1, + 600, + 1, + 700, + 1, + 800, + 1, + 900, + 1, + 1000, + 1, + 1500, + 1, + 2000, + 1, + 2500, + 1, + 3000, + 1, + 3500, + 1, + 4000, + 1, + 4500, + 1, + 5000, + 1, + 5500, + 1, + 6000, + 1, + 8000, + 1, + 10000, + 1, + 0.5 + ], + "line-color": [ + "step", + [ + "get", + "depth_value_m" + ], + "rgba(126,230,146,1)", + 10, + "rgba(106,210,126,1)", + 11, + "rgba(126,230,146,1)", + 20, + "rgba(106,210,126,1)", + 21, + "rgba(126,230,146,1)", + 30, + "rgba(144,220,255,1)", + 40, + "rgba(113,193,235,1)", + 41, + "rgba(133,213,255,1)", + 45, + "rgba(122,206,255,1)", + 50, + "rgba(111,199,255,1)", + 55, + "rgba(100,192,255,1)", + 60, + "rgba(69,164,235,1)", + 61, + "rgba(89,184,255,1)", + 65, + "rgba(78,177,255,1)", + 70, + "rgba(67,170,255,1)", + 75, + "rgba(56,163,255,1)", + 80, + "rgba(24,136,235,1)", + 81, + "rgba(44,156,255,1)", + 85, + "rgba(22,142,255,1)", + 90, + "rgba(33,149,255,1)", + 95, + "rgba(11,135,255,1)", + 100, + "rgba(0,108,235,1)", + 101, + "rgba(0,128,255,1)", + 110, + "rgba(0,115,255,1)", + 120, + "rgba(0,102,255,1)", + 130, + "rgba(0,90,255,1)", + 140, + "rgba(0,77,255,1)", + 150, + "rgba(0,44,235,1)", + 151, + "rgba(0,64,255,1)", + 160, + "rgba(0,51,255,1)", + 170, + "rgba(0,38,255,1)", + 180, + "rgba(0,26,255,1)", + 190, + "rgba(0,13,255,1)", + 200, + "rgba(0,0,235,1)", + 201, + "rgba(0,0,255,1)", + 300, + "rgba(0,0,219,1)", + 301, + "rgba(0,0,239,1)", + 400, + "rgba(0,0,203,1)", + 401, + "rgba(0,0,223,1)", + 500, + "rgba(0,0,187,1)", + 501, + "rgba(0,0,207,1)", + 600, + "rgba(0,0,172,1)", + 601, + "rgba(0,0,192,1)", + 700, + "rgba(0,0,156,1)", + 701, + "rgba(0,0,176,1)", + 800, + "rgba(0,0,140,1)", + 801, + "rgba(0,0,160,1)", + 900, + "rgba(0,0,124,1)", + 901, + "rgba(0,0,144,1)", + 1000, + "rgba(0,0,108,1)", + 1001, + "rgba(0,0,128,1)", + 1100, + "rgba(0,6,122,1)", + 1200, + "rgba(0,13,115,1)", + 1300, + "rgba(0,19,109,1)", + 1400, + "rgba(0,26,102,1)", + 1500, + "rgba(20,50,116,1)", + 1501, + "rgba(0,32,96,1)", + 1600, + "rgba(0,39,90,1)", + 1700, + "rgba(0,45,83,1)", + 1800, + "rgba(0,51,77,1)", + 1900, + "rgba(0,58,70,1)", + 2000, + "rgba(0,51,77,1)", + 2001, + "rgba(0,51,77,1)", + 2100, + "rgba(0,56,72,1)", + 2200, + "rgba(0,61,67,1)", + 2300, + "rgba(0,67,61,1)", + 2400, + "rgba(0,72,56,1)", + 2500, + "rgba(10,87,61,1)", + 2501, + "rgba(0,77,51,1)", + 2600, + "rgba(0,82,46,1)", + 2700, + "rgba(0,87,41,1)", + 2800, + "rgba(0,92,36,1)", + 2900, + "rgba(0,97,31,1)", + 3000, + "rgba(10,112,36,1)", + 3001, + "rgba(0,102,26,1)", + 3100, + "rgba(0,108,20,1)", + 3200, + "rgba(0,113,15,1)", + 3300, + "rgba(0,112,10,1)", + 3400, + "rgba(0,123,5,1)", + 3500, + "rgba(10,138,10,1)", + 3501, + "rgba(0,128,0,1)", + 3600, + "rgba(2,124,2,1)", + 3700, + "rgba(3,121,3,1)", + 3800, + "rgba(5,117,5,1)", + 3900, + "rgba(6,114,6,1)", + 4000, + "rgba(18,120,18,1)", + 4001, + "rgba(18,110,18,1)", + 4100, + "rgba(10,107,10,1)", + 4200, + "rgba(11,103,11,1)", + 4300, + "rgba(13,100,13,1)", + 4400, + "rgba(14,96,14,1)", + 4500, + "rgba(26,103,26,1)", + 4501, + "rgba(16,93,16,1)", + 4600, + "rgba(18,89,18,1)", + 4700, + "rgba(19,26,19,1)", + 4800, + "rgba(21,82,21,1)", + 4900, + "rgba(22,79,22,1)", + 5000, + "rgba(34,85,34,1)", + 5001, + "rgba(24,75,24,1)", + 5100, + "rgba(26,72,26,1)", + 5200, + "rgba(27,68,27,1)", + 5300, + "rgba(29,65,29,1)", + 5400, + "rgba(30,61,30,1)", + 5500, + "rgba(42,68,42,1)", + 5501, + "rgba(32,58,32,1)", + 5600, + "rgba(34,54,34,1)", + 5700, + "rgba(35,51,35,1)", + 5800, + "rgba(37,47,37,1)", + 5900, + "rgba(38,44,38,1)", + 6000, + "rgba(50,50,50,1)", + 6001, + "rgba(40,40,40,1)", + 6500, + "rgba(58,30,58,1)", + 7000, + "rgba(75,20,75,1)", + 7500, + "rgba(93,10,93,1)", + 8000, + "rgba(120,10,120,1)", + 8001, + "rgba(110,0,110,1)", + 8500, + "rgba(117,0,117,1)", + 9000, + "rgba(123,0,123,1)", + 9500, + "rgba(130,0,130,1)", + 10000, + "rgba(147,0,147,1)", + 10001, + "rgba(137,0,137,1)", + 10500, + "rgba(143,0,143,1)" + ] + } + }, + { + "id": "depth-contours", + "type": "line", + "source": "navsea_delivery", + "source-layer": "depth_contour", + "paint": { + "line-color": "rgba(136,152,139,1)", + "line-width": 1 + } + }, + { + "id": "depth-contour-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "depth_contour", + "minzoom": 11, + "layout": { + "symbol-placement": "line", + "symbol-spacing": 200, + "text-allow-overlap": true, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10, + "text-rotation-alignment": "viewport" + }, + "filter": [ + "all", + [ + "==", + [ + "get", + "chart_text_style" + ], + "depth_text" + ], + [ + "has", + "chart_label_text" + ] + ], + "paint": { + "text-color": "rgba(7,7,7,1)" + } + }, + { + "id": "bathymetry-depth-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "bathymetry_line", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + [ + "get", + "chart_text_style" + ], + "depth_text" + ], + [ + "has", + "chart_label_text" + ] + ], + "layout": { + "text-allow-overlap": true, + "symbol-placement": "line", + "symbol-spacing": 200, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10, + "text-rotation-alignment": "viewport" + }, + "paint": { + "text-color": "rgba(7,7,7,1)" + } + }, + { + "id": "subsea-cables", + "type": "line", + "source": "navsea_delivery", + "source-layer": "seabed_line", + "paint": { + "line-color": "#814d99", + "line-width": 1.3, + "line-dasharray": [ + 3, + 1.2 + ] + } + }, + { + "id": "coast-structures-line", + "type": "line", + "source": "navsea_delivery", + "source-layer": "baseline_line", + "paint": { + "line-color": "#5f5a50", + "line-width": 1.4 + } + }, + { + "id": "land-structures-line", + "type": "line", + "source": "navsea_delivery", + "source-layer": "onshore_structure_line", + "paint": { + "line-color": "rgba(147,116,39,1)", + "line-width": 2 + } + }, + { + "id": "water-boundary", + "type": "line", + "source": "navsea_delivery", + "source-layer": "depth_zone_739", + "paint": { + "line-color": "#4f8ca7", + "line-width": 1.1 + } + }, + { + "id": "regulatory-boundary", + "type": "line", + "source": "navsea_delivery", + "source-layer": "depth_zone_741", + "paint": { + "line-color": "#cb5c46", + "line-width": 1.2, + "line-dasharray": [ + 2, + 2 + ] + } + }, + { + "id": "height-limit-line", + "type": "line", + "source": "navsea_delivery", + "source-layer": "clearance_limit_line", + "paint": { + "line-color": "#ad3b6a", + "line-width": 1.1 + } + }, + { + "id": "clip-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "baseline_outline", + "paint": { + "line-color": "rgba(95,106,95,1)", + "line-width": 2 + } + }, + { + "id": "danger-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "hazard_boundary_outline", + "paint": { + "line-color": "rgba(95,106,95,1)", + "line-width": 3, + "line-dasharray": [ + 3, + 2 + ] + } + }, + { + "id": "navigation-hazard-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "navigation_hazard_outline", + "paint": { + "line-width": [ + "coalesce", + [ + "get", + "chart_line_width" + ], + 1 + ], + "line-color": [ + "coalesce", + [ + "get", + "chart_line_color" + ], + "rgba(136,152,139,1)" + ] + } + }, + { + "id": "anchor-danger-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "anchor_caution_hazard_outline", + "paint": { + "line-width": [ + "coalesce", + [ + "get", + "chart_line_width" + ], + 1 + ], + "line-color": [ + "coalesce", + [ + "get", + "chart_line_color" + ], + "rgba(136,152,139,1)" + ] + } + }, + { + "id": "anchorage-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "anchorage_outline", + "paint": { + "line-color": [ + "coalesce", + [ + "get", + "chart_line_color" + ], + "rgba(136,152,139,1)" + ], + "line-width": [ + "coalesce", + [ + "get", + "chart_line_width" + ], + 2 + ], + "line-dasharray": [ + 2, + 1 + ] + } + }, + { + "id": "facility-zone-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "facility_boundary_outline", + "paint": { + "line-color": [ + "coalesce", + [ + "get", + "chart_line_color" + ], + "rgba(136,152,139,1)" + ], + "line-width": [ + "coalesce", + [ + "get", + "chart_line_width" + ], + 1 + ] + } + }, + { + "id": "special-pattern-line-754", + "type": "line", + "source": "navsea_delivery", + "source-layer": "clip_outline_754", + "paint": { + "line-pattern": [ + "coalesce", + [ + "get", + "chart_line_pattern" + ], + "" + ], + "line-width": 8 + } + }, + { + "id": "hazard-points", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_hazard_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + } + }, + { + "id": "anchorage-symbols", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "anchorage_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + } + }, + { + "id": "anchor-hazard-points", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "anchor_caution_hazard_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "all", + [ + "!", + [ + "has", + "class_code" + ] + ], + [ + "!=", + [ + "get", + "chart_symbol_code" + ], + "obstruction" + ], + [ + "!=", + [ + "get", + "chart_symbol_code" + ], + "hazard_mark" + ], + [ + "!=", + [ + "get", + "chart_symbol_code" + ], + "fish_reef" + ] + ] + }, + { + "id": "anchor-hazard-points-428", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "anchor_caution_hazard_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + } + }, + { + "id": "nav-light-flare", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-size": 1.0, + "icon-image": [ + "match", + [ + "get", + "light_color_code" + ], + "green", + "flare_green", + "red", + "flare_red", + "yellow", + "flare_yellow_white", + "white", + "flare_yellow_white", + "amber", + "flare_yellow_white", + "orange", + "flare_yellow_white", + "flare_yellow_white" + ] + }, + "filter": [ + "all", + [ + "has", + "light_color_code" + ], + [ + "any", + [ + "all", + [ + "has", + "shape_class_code" + ], + [ + "match", + [ + "to-number", + [ + "get", + "shape_class_code" + ] + ], + 301, + true, + 302, + true, + 303, + true, + 306, + true, + 311, + true, + 312, + true, + 315, + true, + 316, + true, + 318, + true, + 320, + true, + 322, + true, + 324, + true, + 326, + true, + 328, + true, + 332, + true, + 334, + true, + false + ] + ], + [ + "all", + [ + "has", + "display_code" + ], + [ + "match", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "301", + true, + "302", + true, + "303", + true, + "306", + true, + "311", + true, + "312", + true, + "315", + true, + "316", + true, + "318", + true, + "320", + true, + "322", + true, + "324", + true, + "326", + true, + "328", + true, + "332", + true, + "334", + true, + false + ] + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "minor_light" + ] + ] + ] + }, + { + "id": "nav-light-arc", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "visibility": "visible", + "icon-allow-overlap": true, + "icon-rotation-alignment": "map", + "icon-image": [ + "case", + [ + "has", + "arc_id" + ], + [ + "get", + "arc_id" + ], + [ + "match", + [ + "get", + "light_color_code" + ], + "green", + "arc_green", + "red", + "arc_red", + "arc_yellow_white" + ] + ] + }, + "filter": [ + "all", + [ + "==", + [ + "get", + "chart_symbol_code" + ], + "lighthouse" + ], + [ + "has", + "light_color_code" + ] + ] + }, + { + "id": "nav-marks-harbor-lighthouses", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-size": 1.08, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "any", + [ + "all", + [ + "has", + "display_code" + ], + [ + "==", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "301" + ] + ], + [ + "all", + [ + "!", + [ + "has", + "display_code" + ] + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "harbor_lighthouse" + ] + ] + ] + }, + { + "id": "nav-marks-breakwater-lighthouses", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-size": 1.08, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "any", + [ + "all", + [ + "has", + "display_code" + ], + [ + "==", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "302" + ] + ], + [ + "all", + [ + "!", + [ + "has", + "display_code" + ] + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "breakwater_lighthouse" + ] + ] + ] + }, + { + "id": "nav-marks-small-lights", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "any", + [ + "all", + [ + "has", + "display_code" + ], + [ + "match", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "303", + true, + "305", + true, + "306", + true, + "307", + true, + "308", + true, + "309", + true, + false + ] + ], + [ + "all", + [ + "!", + [ + "has", + "display_code" + ] + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "minor_light" + ] + ] + ] + }, + { + "id": "nav-marks-light-beacons", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "any", + [ + "all", + [ + "has", + "display_code" + ], + [ + "==", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "311" + ] + ], + [ + "all", + [ + "!", + [ + "has", + "display_code" + ] + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "light_beacon" + ] + ] + ] + }, + { + "id": "nav-marks", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "all", + [ + "!", + [ + "all", + [ + "has", + "display_code" + ], + [ + "match", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "301", + true, + "302", + true, + "303", + true, + "305", + true, + "306", + true, + "307", + true, + "308", + true, + "309", + true, + "311", + true, + false + ] + ] + ], + [ + "!=", + [ + "get", + "canonical_object_type" + ], + "harbor_lighthouse" + ], + [ + "!=", + [ + "get", + "canonical_object_type" + ], + "breakwater_lighthouse" + ], + [ + "!=", + [ + "get", + "canonical_object_type" + ], + "minor_light" + ], + [ + "!=", + [ + "get", + "canonical_object_type" + ], + "light_beacon" + ] + ] + }, + { + "id": "facility-points", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "facility_boundary_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + } + }, + { + "id": "pilot-station-points", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "pilot_station_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + } + }, + { + "id": "landmark-points", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "onshore_structure_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "any", + [ + "has", + "class_code" + ], + [ + "match", + [ + "get", + "canonical_object_type" + ], + "chimney", + true, + "tower_yagura_windmill", + true, + "maritime_office", + true, + "fishing_cooperative", + true, + "mountain_top", + true, + "other_landmark_monument", + true, + false + ] + ] + }, + { + "id": "landmark-point-fallback", + "type": "circle", + "source": "navsea_delivery", + "source-layer": "onshore_structure_point", + "filter": [ + "all", + [ + "!", + [ + "has", + "class_code" + ] + ], + [ + "match", + [ + "get", + "canonical_object_type" + ], + "chimney", + false, + "tower_yagura_windmill", + false, + "maritime_office", + false, + "fishing_cooperative", + false, + "mountain_top", + false, + "other_landmark_monument", + false, + true + ] + ], + "paint": { + "circle-radius": 3, + "circle-color": "#695641", + "circle-stroke-color": "#fff9ee", + "circle-stroke-width": 0.8 + } + }, + { + "id": "bottom-material-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "seabed_text_point", + "minzoom": 11, + "filter": [ + "all", + [ + "has", + "chart_label_text" + ], + [ + "!=", + [ + "get", + "canonical_object_type" + ], + "spot_sounding" + ] + ], + "layout": { + "text-allow-overlap": true, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10 + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + } + }, + { + "id": "spot-sounding-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "seabed_text_point", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "canonical_object_type" + ], + "spot_sounding" + ], + [ + "has", + "chart_label_text" + ] + ], + "layout": { + "text-allow-overlap": false, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10 + }, + "paint": { + "text-color": "rgba(7,7,7,1)" + } + }, + { + "id": "height-limit-points", + "type": "circle", + "source": "navsea_delivery", + "source-layer": "clearance_limit_point", + "paint": { + "circle-radius": 3.5, + "circle-color": "#ab355f", + "circle-stroke-color": "#ffffff", + "circle-stroke-width": 0.8 + } + }, + { + "id": "height-limit-name-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "clearance_limit_point", + "minzoom": 11, + "filter": [ + "has", + "name_ja" + ], + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "name_ja" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 12, + "text-anchor": "bottom" + }, + "paint": { + "text-color": "rgba(255,0,0,1)" + } + }, + { + "id": "height-limit-value-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "clearance_limit_point", + "minzoom": 11, + "filter": [ + "has", + "chart_label_text" + ], + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "concat", + "高さ", + [ + "get", + "chart_label_text" + ], + "m" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 12, + "text-anchor": "top" + }, + "paint": { + "text-color": "rgba(255,0,0,1)" + } + }, + { + "id": "nav-mark-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10, + "text-offset": [ + "match", + [ + "get", + "chart_label_position_code" + ], + "tl", + [ + "literal", + [ + 2, + 2.5 + ] + ], + "t", + [ + "literal", + [ + 0, + 2.5 + ] + ], + "tr", + [ + "literal", + [ + -2, + 2.5 + ] + ], + "l", + [ + "literal", + [ + 2, + 0.5 + ] + ], + "c", + [ + "literal", + [ + 0, + 0.5 + ] + ], + "r", + [ + "literal", + [ + -2, + 0.5 + ] + ], + "bl", + [ + "literal", + [ + 2, + -1.5 + ] + ], + "b", + [ + "literal", + [ + 0, + -1.5 + ] + ], + "br", + [ + "literal", + [ + -2, + -1.5 + ] + ], + [ + "literal", + [ + 0, + 0.5 + ] + ] + ], + "text-anchor": [ + "match", + [ + "get", + "chart_label_position_code" + ], + "tl", + "top-left", + "t", + "top", + "tr", + "top-right", + "l", + "left", + "c", + "center", + "r", + "right", + "bl", + "bottom-left", + "b", + "bottom", + "br", + "bottom-right", + "center" + ] + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + }, + "filter": [ + "has", + "chart_label_text" + ] + }, + { + "id": "nav-light-abbr-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "chart_label_subtext" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10, + "text-offset": [ + "match", + [ + "get", + "chart_label_position_code" + ], + "tl", + [ + "literal", + [ + 2, + 1.5 + ] + ], + "t", + [ + "literal", + [ + 0, + 1.5 + ] + ], + "tr", + [ + "literal", + [ + -2, + 1.5 + ] + ], + "l", + [ + "literal", + [ + 2, + -0.5 + ] + ], + "c", + [ + "literal", + [ + 0, + -0.5 + ] + ], + "r", + [ + "literal", + [ + -2, + -0.5 + ] + ], + "bl", + [ + "literal", + [ + 2, + -2.5 + ] + ], + "b", + [ + "literal", + [ + 0, + -2.5 + ] + ], + "br", + [ + "literal", + [ + -2, + -2.5 + ] + ], + [ + "literal", + [ + 0, + -0.5 + ] + ] + ], + "text-anchor": [ + "match", + [ + "get", + "chart_label_position_code" + ], + "tl", + "top-left", + "t", + "top", + "tr", + "top-right", + "l", + "left", + "c", + "center", + "r", + "right", + "bl", + "bottom-left", + "b", + "bottom", + "br", + "bottom-right", + "center" + ] + }, + "paint": { + "text-color": [ + "case", + [ + "==", + [ + "get", + "chart_text_color" + ], + "#000000" + ], + "rgba(0,0,0,1)", + [ + "coalesce", + [ + "get", + "chart_text_color" + ], + "rgba(0,0,0,1)" + ] + ] + }, + "filter": [ + "has", + "chart_label_subtext" + ] + }, + { + "id": "place-labels-sea-en", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "place_label_sea", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "place_name_en" + ], + "text-font": [ + "NotoSerifCJK-Regular" + ], + "text-size": 10, + "text-anchor": "top" + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + }, + "filter": [ + "has", + "place_name_en" + ] + }, + { + "id": "place-labels-sea-ja", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "place_label_sea", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSerifCJK-Regular" + ], + "text-size": 10, + "text-anchor": "bottom" + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + }, + "filter": [ + "has", + "chart_label_text" + ] + }, + { + "id": "place-labels-land-en", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "place_label_land", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "place_name_en" + ], + "text-font": [ + "NotoSerifCJK-Regular" + ], + "text-size": 10, + "text-anchor": "top" + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + }, + "filter": [ + "has", + "place_name_en" + ] + }, + { + "id": "place-labels-land-ja", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "place_label_land", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSerifCJK-Regular" + ], + "text-size": 10, + "text-anchor": "bottom" + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + }, + "filter": [ + "has", + "chart_label_text" + ] + } + ] +} \ No newline at end of file diff --git a/docs/25个新增映射缺口分类说明_v1.md b/docs/25个新增映射缺口分类说明_v1.md new file mode 100644 index 0000000..440c2b2 --- /dev/null +++ b/docs/25个新增映射缺口分类说明_v1.md @@ -0,0 +1,58 @@ +# 25个新增映射缺口分类说明_v1 + +## 结论 + +- 正确 Japan Dataset 1 的 gap variant:165。 +- 原 disposition 可直接覆盖:140。 +- 新出现且未分类:25 variants / 869 rows。 +- 本次 25 个全部显式分类为 `ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW`。 +- 不新增 delivery mapping,不修改 `cm95_to_navsea_v1.yaml`,避免在未完成图层/样式语义设计前臆造显示。 +- 分类后 closure 预期:`PASS`。 +- 新 semantic backlog:137 variants / 90,009 rows。 + +## 25个新增 variant + +| Object | Geometry | Rows | Safety | 处理 | +|---|---:|---:|---|---| +| TWRTPT | AREA | 462 | important | pending semantic review | +| LNDSTS | AREA | 78 | normal | pending semantic review | +| SNDWAV | AREA | 74 | important | pending semantic review | +| FORSTC | POINT | 62 | normal | pending semantic review | +| TIDEWY | LINE | 42 | important | pending semantic review | +| RCTLPT | AREA | 30 | important | pending semantic review | +| DWRTPT | AREA | 20 | important | pending semantic review | +| TREPNT | POINT | 19 | normal | pending semantic review | +| DAMCON | LINE | 12 | important | pending semantic review | +| LITFLT | POINT | 9 | important | pending semantic review | +| FSHZNE | AREA | 8 | important | pending semantic review | +| TIDEWY | AREA | 8 | important | pending semantic review | +| TOWERS | AREA | 8 | normal | pending semantic review | +| DISMAR | POINT | 6 | normal | pending semantic review | +| LOKBSN | AREA | 5 | normal | pending semantic review | +| BRTFAC | AREA | 4 | normal | pending semantic review | +| FORSTC | AREA | 4 | normal | pending semantic review | +| GRIDRN | AREA | 4 | normal | pending semantic review | +| MIPARE | AREA | 4 | important | pending semantic review | +| SMCFAC | POINT | 4 | normal | pending semantic review | +| HULKES | POINT | 2 | important | pending semantic review | +| CHIMNY | AREA | 1 | normal | pending semantic review | +| SMCFAC | AREA | 1 | normal | pending semantic review | +| SPLARE | AREA | 1 | normal | pending semantic review | +| WNDMIL | POINT | 1 | normal | pending semantic review | + +## 特别优先审查 + +以下虽然本次先进入 pending,但属于后续应优先处理的航行语义: + +- `TWRTPT AREA`:双向交通航路。 +- `RCTLPT AREA`:推荐交通航道。 +- `DWRTPT AREA`:深水航路。 +- `LITFLT POINT`:灯浮。 +- `FSHZNE AREA`:渔业区,样本明确包含鱼陷阱警告。 +- `MIPARE AREA`:军事演习区,样本包含潜艇演习警告。 +- `HULKES POINT`:沉船/废船点。 +- `SNDWAV AREA`、`TIDEWY LINE/AREA`:海底/水道相关语义。 + +## 重要说明 + +本次只解决“分类闭环”,不等于语义完整。当前 90,009 条 `NO_EXACT_RULE` 仍不会进入正式 delivery,其中还包括 TOPMAR、BOYLAT、RESARE、NAVLNE 等重要航海对象。 \ No newline at end of file diff --git a/docs/CM95_21张PBF对照审计_v1.md b/docs/CM95_21张PBF对照审计_v1.md new file mode 100644 index 0000000..2755a5d --- /dev/null +++ b/docs/CM95_21张PBF对照审计_v1.md @@ -0,0 +1,84 @@ +# CM95 21 张 PBF 与现有 NavSea/NEWPEC 对照审计 v1 + +## 1. 结论 + +PBF-03 v1.1 的 MVT 结构、extent、tile buffer、FID 稳定性和 scale-region 机制通过;但发现两个正式语义/样式契约问题,因此 v1.1 不冻结,进入 v1.2。 + +## 2. 已通过项目 + +- 新 delivery 与参考 AOI 均为完全相同的 21 个 `z/x/y` 路径。 +- MVT layer version 为 2。 +- extent 与当前工作参考一致:z10/z11 为 4096,z12 为 1048576。 +- 所有 geometry command 可解析;无空 geometry、无截断 geometry。 +- 新 PBF 坐标均落在现有 8px buffer 契约内。 +- delivery feature ID 均能在同 tile、同 source-layer 的 engineering PBF 中找到。 +- 以 `(source_id, output source-layer)` 检查,共 6067 个键;其中 890 个跨 tile 重复出现,MVT ID 不稳定数为 0。 +- 同一 tile/source-layer 内未发现重复 MVT ID。 +- scale-region 实现采用 `coverage.difference(occupied)`,详细比例尺优先、低比例尺只补空缺。 +- 对多比例尺并存的点图层做 30m 内近重复检查,未发现跨比例尺重复点。 +- 21 张 delivery 报告:hard-gate unmapped = 0;nav name conflicts = 0。 + +## 3. 问题 A:DEPARE 非标准水深区间不被现有 style 消费 + +v1.1 会直接把 CM95 `DRVAL1/DRVAL2` 拼成 `chart_fill_style`。当前 NavSea style 只接受固定区间,所以以下 24 个水深面在现有 style 下不会显示: + +| 值 | 数量 | +|---|---:| +| depth_zone_13-20m | 7 | +| depth_zone_7.5-10m | 7 | +| depth_zone_20-50m | 7 | +| depth_zone_12-20m | 1 | +| depth_zone_9.6-10m | 1 | +| depth_zone_14-20m | 1 | + +v1.2 修正:将任意 CM95 深度范围归一到“能够完整包含原范围的最小现有 NavSea 区间”。例如: + +- 7.5–10m → 5–10m +- 9.6–10m → 5–10m +- 12–20m / 13–20m / 14–20m → 10–20m +- 20–50m → 20–100m + +原始 `DRVAL1/DRVAL2` 仍保留在 engineering trace/source attributes,不修改 MySQL。 + +## 4. 问题 B:SOUNDG 与底质文字共用过宽 style filter + +v1.1 在 21 张 delivery PBF 中输出的 `seabed_text_point`: + +- z10:spot_sounding 71,seabed_material 9,seabed_area 1 +- z11:spot_sounding 590,seabed_material 83,seabed_area 2 +- z12:spot_sounding 2269,seabed_material 250,seabed_area 10 + +参考 PBF 的 `seabed_text_point` 只在 z12 出现,共 273 个,全部为 `canonical_object_type=seabed_material`。 + +当前 `bottom-material-labels` 仅判断 `has(chart_label_text)`,因此 v1.1 的 SOUNDG 在 z11/z12 会被当作底质文字直接显示,并且 `text-allow-overlap=true`,会造成测深数字过密。 + +v1.2 不改变 source-layer,仍使用 `seabed_text_point`,但提供最小 style 扩展: + +1. `bottom-material-labels` 排除 `spot_sounding`; +2. 新增 `spot-sounding-labels`; +3. spot sounding 从 z12 开始显示; +4. `text-allow-overlap=false`,由 MapLibre 的符号碰撞机制控制密度。 + +这样不增加新的正式 source-layer,也不丢 SOUNDG hard-gate 数据。 + +## 5. 参考数据差异,不判为生成器错误 + +参考 NEWPEC 与 CM95 是不同上游数据,因此 Feature 数量不要求一致。例如: + +- 新 z12:4770 个 feature;参考 z12:11383 个 feature。 +- 参考含大量 `onshore_structure_line`、`baseline_outline`、`hole_area` 等;CM95 当前映射及源对象组成不同。 +- navigation_marks 全 AOI 数量接近:CM95 新 PBF 118,参考 123。 +- CM95 直接助航名称明显少于参考,这是源数据可证明关系差异;不得用参考名称反灌。 + +## 6. v1.2 冻结门槛 + +重新生成 21 张后必须满足: + +- build report audit:PASS; +- hard-gate unmapped = 0; +- nav name conflicts = 0; +- style contract audit:`contract_unmatched_count = 0`; +- z10/z11/z12 extent 不变; +- FID 稳定性不退化; +- SOUNDG 在 z11 属于有意 zoom-hidden,在 z12 进入独立 sounding style; +- 不修改 importer、geometry 或 MySQL schema。 diff --git a/docs/CM95_PBF_Pilot生成器设计_v1.md b/docs/CM95_PBF_Pilot生成器设计_v1.md new file mode 100644 index 0000000..ad51c01 --- /dev/null +++ b/docs/CM95_PBF_Pilot生成器设计_v1.md @@ -0,0 +1,205 @@ +# CM95 → NavSea PBF Pilot Generator v1 + +## 1. 当前阶段 + +已完成前置门禁: + +- CM93 → MySQL 全量 Geometry / Non-Geometry:PASS。 +- NavSea 现有 style、semantic sprite、z10–z12 PBF 契约已审计。 +- 测试 AOI:`z10/914/385`。 +- AOI 中 CM95 数据有效。 +- `LIGHTS` relation20 全 AOI 审计: + - LIGHTS total = 96 + - with relation20 = 94 + - relation20 可安全合成 = 94 + - 坐标冲突 = 0 + - 无 relation20、必须独立输出 = 2 + - 结论:`PASS_RELATION20_PRIMARY_KEY` + +本包进入第一版真实生成阶段。 + +## 2. 架构 + +```text +CM93 / CM95 source + ↓ +已冻结 MySQL importer + ↓ +CM95 MySQL Dataset 1 + ↓ read-only +Coverage / scale selector + ↓ +cm95_to_navsea_v1.yaml + ↓ +navigation relation20 composer + ↓ +Web Mercator clip / tile quantization + ↓ +NavSea source-layer + ↓ +MVT/PBF +``` + +PBF 生成器不修改 importer、schema 或原始 CM93 数据。 + +## 3. 第一 AOI 的 scale policy + +```text +z10 → C / 1:200,000 + fallback B/A/Z + +z11 → E / 1:50,000 + fallback D/C/B/A/Z + +z12 → F / 1:20,000 + fallback E/D/C/B/A/Z +``` + +回退不是简单叠加。 + +每一级优先使用该 scale 的 `chart_coverage.geom`;细图覆盖过的区域会遮蔽更粗 scale,只在未覆盖部分回退。 + +因此不会把 F/E/C/B 等多个比例尺的对象全部重复塞进同一 tile。 + +## 4. extent + +为兼容用户提供的当前 NavSea/NEWPEC PBF: + +```text +z10 = 4096 +z11 = 4096 +z12 = 1048576 +``` + +这是 Pilot 明确 policy,而不是从 CM95 上游 PBF“继承”。 + +## 5. 助航对象合成 + +主键: + +```text +cell_id + attributes._cm93_relation20_raw +``` + +仅当同一 relation20 组同时存在 `LIGHTS + base component` 时合成。 + +base component 优先级: + +```text +BCNLAT +BCNSPP +BOYSPP +RTPBCN +TOWERS +_extgn +``` + +同一组只输出一个 `navigation_marks` Feature。 + +原始组件在 engineering trace 中全部保留。 + +### 无 relation20 的 LIGHTS + +当前 AOI 有 2 个。 + +规则: + +```text +独立输出 +不按距离猜测合并 +``` + +## 6. MVT ID + +禁止使用 MySQL `chart_feature.id` 作为稳定外部身份。 + +第一次生成前建立: + +```text +build/cm95_fid_manifest_v1.sqlite +``` + +Manifest 按: + +```text +source_relative_path +source_record_index +geometry_type +sounding point_index +``` + +确定性排序并分配 base ordinal。 + +最终 MVT numeric id: + +```text +base_ord * 16 + geometry_role +``` + +这样: + +- 结果是 signed-int32 范围; +- Dataset 不变时重复构建稳定; +- derived boundary / point-on-surface 有独立稳定 ID; +- MySQL 重建导致自增 id 改变不会影响 PBF ID。 + +如果 Dataset 的 source SHA 集合发生变化,manifest fingerprint 不匹配,生成器会拒绝继续,要求显式重建。 + +## 7. Engineering / Delivery + +### Engineering + +保留: + +```text +source_id +source_dataset_id +source_cell +source_record_index +source_object_class +source_geometry_type +native_scale +mapping_rule_id +mapping_status +source_attr_json +``` + +无法安全映射对象进入: + +```text +cm95_unmapped +``` + +### Delivery + +只输出现有 NavSea style source-layer。 + +字段按当前 delivery allowlist 裁剪。 + +正式 delivery 不包含 `cm95_unmapped`。 + +## 8. 当前限制 + +这是 Pilot,不是全国发布版。 + +当前需要实测的内容: + +1. `mapbox-vector-tile` 在用户 Windows 环境的编码结果; +2. z10/z11/z12 Coverage 回退效果; +3. CM95 和 NEWPEC 内容不同导致的对象数量差异; +4. 航标 icon / label 实际视觉; +5. 未映射对象收敛; +6. hard-gate 对象保全; +7. tile edge buffer; +8. 后续 sector light 的专项 arc 映射。 + +因此第一轮目标是: + +```text +能生成 +能被当前 NavSea style 直接打开 +对象可追溯 +hard-gate 不静默丢 +``` + +而不是第一轮就宣称全国正式发布。 diff --git a/docs/CM95_PBF_v1.4.7_导航名称冲突审计式省略_v1.md b/docs/CM95_PBF_v1.4.7_导航名称冲突审计式省略_v1.md new file mode 100644 index 0000000..19b3c00 --- /dev/null +++ b/docs/CM95_PBF_v1.4.7_导航名称冲突审计式省略_v1.md @@ -0,0 +1,70 @@ +# CM95 PBF Production v1.4.7 — 导航名称冲突审计式省略 + +## 1. 本版本定位 + +v1.4.7 是 **release gate 修复**,不是 PBF builder 语义版本。 + +因此: + +- Project/runtime 升级为 v1.4.7; +- `BUILDER_CONTRACT_VERSION` **保持** `cm95pbf-builder/0.4.6-spatial-candidate-query`; +- 已完成的 v1.4.6 Plan、FID、27,038 个 job、27,030 个 PBF 全部复用; +- 不重新生成 PBF; +- 不修改 MySQL; +- 不修改 mapping / style / sprite / FID / geometry / quantization / encoder reconcile / non-renderable omission。 + +## 2. 已确认的真实冲突 + +当前 Japan release 中: + +- report conflict occurrences:10; +- trace conflict occurrences:10; +- unique conflict outputs:4; +- affected tiles:3; +- native scale:全部 1:50,000; +- 每个真实 conflict 都恰好有两个不同 direct-name candidate。 + +四组候选分别为: + +- `R2` / `P4` +- `R1` / `P3` +- `L1` / `P1` +- `L2` / `P2` + +它们不是大小写、空格或格式差异,因此不能做字符串归一化后任选一个。 + +## 3. v1.4.7 policy + +采用: + +`AMBIGUOUS_DIRECT_NAMES_OMIT_LABEL_FAIL_CLOSED` + +即: + +1. composite base 自己没有直接名称; +2. relation group 内有两个以上不同 LIGHTS 直接名称; +3. Builder 继续不猜名称,不写 `chart_label_text`; +4. finalizer 必须逐条核对 report 与 trace 数量; +5. trace 必须明确 `nav_name_conflict=true` 且 `nav_name_source=conflict`; +6. 至少存在两个 distinct name candidates; +7. finalizer 解码对应 PBF feature,确认 `chart_label_text` 实际为空; +8. 只有全部满足时,这些冲突才记为 `nav_name_conflict_omissions` 并允许 release PASS; +9. 若 trace 缺失、数量不一致、PBF feature 不存在、或 ambiguous feature 被写入任意 label,则继续 hard fail。 + +这不是关闭 gate,而是把原来的“只要有 conflict 就失败”改成“只允许经过可验证的安全省略”。 + +## 4. 当前 release 不重建 + +当前 release: + +`cm95-d1-62a85bd40d3a-6bc3c1352da3` + +现有生产数据: + +- jobs: 27,038 / 27,038 PASS +- attempts: 27,038 +- PBF files: 27,030 +- planned features: 2,974,375 +- decoded features: 2,974,375 + +v1.4.7 仅重新执行 finalize。 diff --git a/docs/CM95_PBF_v1_2变更说明.md b/docs/CM95_PBF_v1_2变更说明.md new file mode 100644 index 0000000..6c27d88 --- /dev/null +++ b/docs/CM95_PBF_v1_2变更说明.md @@ -0,0 +1,37 @@ +# CM95 PBF Pilot Generator v1.2 变更说明 + +## 变更范围 + +本版本只处理 21 张 Pilot 对照中确认的两个问题: + +1. DEPARE 深度区间归一化到当前 NavSea style 固定词汇; +2. SOUNDG 与底质标签在同一 `seabed_text_point` source-layer 内分流显示。 + +## 未修改 + +- CM93/CM95 importer +- geometry normalization +- MySQL schema +- relation20 助航合成规则 +- FID manifest 规则 +- tile extent / buffer +- scale ladder / coverage difference 算法 +- 80 条 CM95 对象 mapping 主结构 + +## 新增 style 候选 + +`config/style/style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json` + +它以当前 `style.navsea-delivery-full-semantic-unified-20260808.json` 为基线,只做: + +- `bottom-material-labels` 排除 `spot_sounding`; +- 新增 `spot-sounding-labels`,minzoom=12,禁止文字强制重叠。 + +## 新增审计工具 + +`tools/cm95_pbf_style_contract_audit_v2.py` + +用于区分: + +- style 属性/值域真正不匹配; +- 因 minzoom/maxzoom 有意隐藏。 diff --git a/docs/CM95_PBF_v1_3变更说明.md b/docs/CM95_PBF_v1_3变更说明.md new file mode 100644 index 0000000..fa209d3 --- /dev/null +++ b/docs/CM95_PBF_v1_3变更说明.md @@ -0,0 +1,35 @@ +# CM95 PBF Pilot Generator v1.3 变更说明 + +## 原因 + +v1.2 的 21 张批量 Gate 中,构建报告累计 6911 个输出,而真实 PBF 解码为 6910。定位到唯一缺失对象: + +- tile: `11/1828/771` +- layer: `clearance_limit_line` +- source_id: `cm95:1:03900420/E/03910424.E:574:line` +- mapping: `CM95-052 / TELPHC` +- safety_class: `hard_gate` + +该线在 z11 extent=4096 量化后退化,被 `mapbox-vector-tile` encoder 静默省略。 + +## v1.3 规则 + +1. `clearance_limit_line` 若量化后仍有至少两个不同整数顶点,正常输出 line。 +2. 若量化后退化,改用 `representative_point()` 输出到已有 `clearance_limit_point`。 +3. fallback 使用同一 source_id 的 `ROLE_SECONDARY` 稳定 FID,不复用原 line FID。 +4. fallback 写入 trace,状态追加 `QUANTIZATION_FALLBACK_POINT`。 +5. 编码后立即 decode,并以 layer + feature.id 与计划输出逐项对账。 +6. 任何未处理的 encoder 丢失都会写失败报告并终止构建,不允许静默 PASS。 + +## 预期 Gate + +本 AOI 应得到: + +- 21 reports +- planned output = actual output +- quantization fallback = 1 +- encoder dropped = 0 +- hard-gate unmapped = 0 +- style contract unmatched = 0 + +`quantization fallback = 1` 是预期安全回退,不是失败。 diff --git a/docs/CM95_PBF_v1_4_3离线自检报告_v1.md b/docs/CM95_PBF_v1_4_3离线自检报告_v1.md new file mode 100644 index 0000000..ba8d7e0 --- /dev/null +++ b/docs/CM95_PBF_v1_4_3离线自检报告_v1.md @@ -0,0 +1,52 @@ +# CM95 PBF Production v1.4.3 离线自检报告 v1 + +## 结论 + +离线自检:PASS。 + +## 检查项 + +1. Python 静态编译 + - 18 个 `.py` 文件全部 `py_compile` PASS。 + +2. Mapping → Style/Sprite Contract + - Rules:81 + - Style source layers:37 + - Sprite keys:476 + - Layer failures:0 + - Sprite failures:0 + - OVERALL:PASS + +3. Global Mapping Gap 分类收口 + - Observed gap variants:141 + - Unclassified:0 + - New delivery mapping:1(FSHHAV AREA) + - Pending semantic review:112 variants / 52,828 rows + - FSHHAV AREA hard-gate:PASS + - Delivery change contract:PASS,仅 `FSHHAV` + - 分类收口 OVERALL:PASS + - Semantic completeness:PENDING_REVIEW + +4. 量化预检合成测试 + - 亚像素短 Line:判定不可绘制 + - 正常 Line:判定可绘制 + - 亚像素 Polygon:判定不可绘制 + - 正常 Polygon:判定可绘制 + - 结果符合预期。 + +5. Release migration 合成测试 + - 3 个模拟任务: + - 1 个旧 PASS 且不受 changed class 影响 → 成功复用 + - 1 个旧 PASS 但 report 含 FSHHAV → 新 release 留 PENDING + - 1 个旧 FAILED → 新 release 留 PENDING + - 新 ledger:PASS=1 / PENDING=2 / attempts=0 + - 结果符合预期。 + +## 未在离线环境执行 + +- 未连接用户 MySQL Dataset-1; +- 未实际迁移 19,913 张旧 PASS; +- 未实际重建 202 张失败 tile; +- 未执行用户环境最终 `finalize-production`。 + +以上必须按《替换与执行说明.md》在用户 Windows 11 / 项目环境中完成。 diff --git a/docs/CM95_PBF生产化阶段_v1_4.md b/docs/CM95_PBF生产化阶段_v1_4.md new file mode 100644 index 0000000..8b6fac8 --- /dev/null +++ b/docs/CM95_PBF生产化阶段_v1_4.md @@ -0,0 +1,97 @@ +> 注意:本文件记录 v1.4 初版。生产范围已在 v1.4.1 改为 z0–z12;以 `CM95_PBF生产化阶段_v1_4_1.md` 为准。 + +# CM95 PBF 生产化阶段 v1.4(历史:z10–z12 初版) + +## 1. 基线 + +本版本以已经通过 21 张 AOI 双 Gate 的 v1.3 为冻结内核。以下行为不得在本阶段随意改变: + +- `cm95_to_navsea_v1.yaml` 语义映射; +- z10/z11/z12 extent; +- scale ladder / coverage mask; +- relation20 助航合成; +- `OBJNAM/NOBJNM` 直接名称规则; +- stable FID manifest; +- hard-gate quantization fallback; +- encoder 写后 Feature ID 对账。 + +v1.4 只增加生产编排层。 + +## 2. 新增生产闭环 + +### `plan-production` + +从 MySQL 只读读取 `chart_cell` 与 `chart_coverage`,按当前 tile policy 中每个 zoom 的 scale ladder 枚举真实需要的 tile。 + +优先使用真实 coverage polygon;若某 Cell 没有 coverage,则使用 Cell bbox 作为保守 fallback,避免漏图。 + +生产计划冻结: + +- Dataset fingerprint; +- mapping SHA256; +- tile policy SHA256; +- FID manifest fingerprint/count; +- profile; +- zoom; +- 完整 XYZ job 列表。 + +任何输入在计划创建后变化,`build-production` 必须拒绝继续。 + +### `build-production` + +- SQLite 账本; +- PASS 自动跳过; +- 上次异常中断的 RUNNING 自动恢复 PENDING; +- FAILED 最多重试指定次数; +- 有限线程并发; +- 每个 tile 继续使用 v1.3 builder 自带 hard-gate 与 encoder 对账; +- 空 tile 允许 PASS,但不写 `.pbf`。 + +### `finalize-production` + +发布前重新读取所有 report 与真实 PBF,要求: + +- 所有计划 job = PASS; +- hard-gate unmapped = 0; +- encoder dropped = 0; +- nav name conflict = 0; +- planned output = report output = decoded PBF feature count; +- tile 内同 layer Feature ID 无重复。 + +同时执行全量 style filter 契约与动态 sprite closure,并生成每个 PBF 的 SHA256/bytes/feature/layer inventory。 + +## 3. 产物结构 + +```text +build/ + production/ + cm95_production_plan_v1.json + + releases/ + / + production_run_v1.sqlite + production_run_summary_v1.json + release_manifest_v1.json + + pbf/ + delivery/ + {z}/{x}/{y}.pbf + + reports/ + delivery/ + {z}/{x}/{y}.json + {z}/{x}/{y}.trace.jsonl +``` + +`release_id` 由 Dataset fingerprint + plan hash 确定,相同输入得到相同 release identity。 + +## 4. 当前阶段不做 + +- 不选择 HTTP/Nginx/FastAPI serving; +- 不改变 NavSea 客户端; +- 不改 importer/schema; +- 不增加新正式 source-layer; +- 不改变 v1.3 safety semantics; +- 不自动清理旧 release。 + +Serving 在完整 Dataset production release PASS 后再单独决定。 diff --git a/docs/CM95_PBF生产化阶段_v1_4_1.md b/docs/CM95_PBF生产化阶段_v1_4_1.md new file mode 100644 index 0000000..1813e06 --- /dev/null +++ b/docs/CM95_PBF生产化阶段_v1_4_1.md @@ -0,0 +1,56 @@ +# CM95 PBF 生产化阶段 v1.4.1:z0–z12 + +## 1. 决策 + +生产目标固定为 **XYZ z0–z12**。 + +此前 z10–z12 是 Pilot AOI 验证范围,只用于验证 CM95→NavSea MVT 的语义、extent、FID、助航合成、hard-gate 与 style contract,不是生产发布范围。 + +v1.4.1 不改变 v1.3 已冻结内核,只扩展生产 tile policy 与生产计划 Gate。 + +## 2. Scale ladder + +按当前 Dataset 已确认的 CM95 native scale 层级: + +| Zoom | 优先比例尺及 fallback | +|---|---| +| z0–z4 | 1:20M | +| z5–z7 | 1:3M → 1:20M | +| z8–z9 | 1:1M → 1:3M → 1:20M | +| z10 | 1:200k → 1:1M → 1:3M → 1:20M | +| z11 | 1:50k → 1:100k → 1:200k → 1:1M → 1:3M → 1:20M | +| z12 | 1:20k → 1:50k → 1:100k → 1:200k → 1:1M → 1:3M → 1:20M | + +每级只向更粗比例尺 fallback。具体空间覆盖仍由 `chart_coverage` 控制,coverage 缺失时才使用 Cell bbox 保守兜底。 + +## 3. Extent + +- z0–z11:4096; +- z12:1048576,保持 Pilot 与当前 NavSea/NEWPEC 已验证契约。 + +## 4. Plan Gate + +`plan-production --zooms 0-12` 必须创建完整 13 个 zoom 的不可变计划。 + +计划审计默认要求: + +- planned zoom = 0..12; +- 每一级至少存在一个真实 tile job; +- duplicate job = 0; +- invalid XYZ = 0; +- `source_stats.tile_count` 与实际 job 数一致。 + +在完整 tile 数量未审查前,不启动 production build。 + +## 5. 冻结边界 + +以下内容仍保持 v1.3: + +- CM95→NavSea mapping; +- relation20 助航合成; +- OBJNAM/NOBJNM 名称规则; +- FID manifest; +- hard-gate quantization fallback; +- encoder 写后 Feature ID 对账; +- release PBF 属性 allowlist; +- style/sprite contract Gate。 diff --git a/docs/CM95_PBF生产化阶段_v1_4_2.md b/docs/CM95_PBF生产化阶段_v1_4_2.md new file mode 100644 index 0000000..41ca832 --- /dev/null +++ b/docs/CM95_PBF生产化阶段_v1_4_2.md @@ -0,0 +1,28 @@ +# CM95 PBF 生产化阶段 v1.4.2 + +## 结论 + +v1.4.1 的计划枚举把 `scale_ladders` 中所有粗比例尺 coverage 都用于高 zoom tile 枚举,导致 z10/z11/z12 接近连续 4 倍膨胀:66,848 / 265,706 / 1,056,589。该计划仅结构合法,不具备生产合理性,必须作废。 + +## v1.4.2 修正 + +新增 `enumeration_scales`: + +- 决定哪些 coverage 有资格创建物理 tile; +- 与 `scale_ladders` 完全分离; +- 粗比例尺 fallback 只能在已创建 tile 内参与数据选择,不能扩张高 zoom footprint。 + +默认 materialization: + +- z0-z4: 1:20M +- z5-z7: 1:3M +- z8-z9: 1:1M +- z10: 1:200k +- z11: 1:50k + 1:100k +- z12: 1:20k + 1:50k + +原 `scale_ladders` 保持不变,因此 Pilot 已验证的 tile 内回退语义不变。 + +## 当前动作 + +只重新生成 z0-z12 production plan 并审计 tile 数量。未审查新数量前不得执行 `build-production`。 diff --git a/docs/CM95_PBF生产化阶段_v1_4_3.md b/docs/CM95_PBF生产化阶段_v1_4_3.md new file mode 100644 index 0000000..831de24 --- /dev/null +++ b/docs/CM95_PBF生产化阶段_v1_4_3.md @@ -0,0 +1,146 @@ +# CM95 PBF Production v1.4.3:生产收口与失败恢复 + +## 1. 背景 + +v1.4.2 首轮 Dataset-1 / z0–z12 production: + +- 计划任务:20,115 +- PASS:19,913 +- FAILED:202 +- FAILED 分类: + - MVT encoder dropped:171 tile + - hard-gate unmapped:31 tile +- hard-gate 缺口全部为 `FSHHAV AREA`,共 51 条源 Feature,失败报告中累计命中 73 次 tile-local 记录。 + +Encoder dropped 主要分布: + +- `depth_contour`:313 +- `baseline_line`:85 +- `seabed_line`:9 +- `baseline_area`:5 +- `navigation_hazard_area`:1 +- `navigation_hazard_outline`:1 + +全 Dataset Mapping Gap 审计还发现: + +- source variants:191 +- gap variants:141 +- gap object classes:117 +- gap feature rows:81,443 +- no exact rule rows:52,879 +- explicit/status gap rows:28,564 +- inherited hard-gate rows:51(全部 `FSHHAV AREA`) + +因此 v1.4.3 不允许把 5 万多条未知语义对象粗暴映射到错误 NavSea 图层。 + +## 2. v1.4.3 决策 + +### 2.1 FSHHAV AREA 正式进入 delivery + +`FSHHAV` Dictionary 含义为 Fish haven。 + +Dataset-1 实际出现 AREA variant,现映射为: + +- main:`anchor_caution_hazard_area` +- outline:`anchor_caution_hazard_outline` +- point-on-surface:`anchor_caution_hazard_point` +- canonical:`fish_reef` +- safety:`hard_gate` +- icon:`reef_fish` +- fill:`pattern_fill_fish_reef` + +AREA、outline、point-on-surface 三者都是同一源对象的不同渲染产物;不得把 AREA 静默降为 unmapped。 + +### 2.2 全量 gap 显式分类,但不伪造语义 + +新增: + +`config/mappings/cm95_gap_disposition_v1.yaml` + +141 个已观察 gap variant 全部有明确 disposition: + +- 1 variant / 51 rows:`DELIVERY_MAPPED_V1_4_3`(FSHHAV AREA) +- 28 variants / 28,564 rows:已有显式非 delivery mapping/status +- 112 variants / 52,828 rows:`ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW` + +后者不是“已经完成映射”,而是明确的语义 backlog;正式后续阶段必须按对象类别逐组审查,不得 generic 映射冒充正确航海语义。 + +## 3. MVT 量化策略 + +v1.3 只保护了 `clearance_limit_line` 的单一退化场景。v1.4.3 改为统一编码前预量化: + +1. 使用当前 tile `quantize_bounds + extent` 计算整数坐标; +2. Line 必须至少有两个不同量化坐标; +3. Polygon exterior 必须至少有三个不同量化点且量化面积非零; +4. 不满足条件的 tile-local 几何,不再送入 encoder。 + +处理分两类: + +### 3.1 对象存在性必须保留 + +以下图层退化时转换到现有 point layer: + +- `clearance_limit_line` → `clearance_limit_point` +- `navigation_hazard_area/outline` → `navigation_hazard_point` +- `anchor_caution_hazard_area/outline` → `anchor_caution_hazard_point` + +报告记入 `quantization_fallbacks`。 + +### 3.2 线性参考/普通面片 + +例如: + +- `depth_contour` +- `baseline_line` +- `seabed_line` +- `baseline_area` + +若当前 tile 内量化后已经没有可绘制二维/一维形状,则明确记入 `quantization_omissions` 后省略当前 tile-local 片段。 + +这不等于删除源对象;源对象、FID identity 和其它 tile/zoom 中可绘制片段不变。禁止把等深线等线性语义伪造成点。 + +Encoder 后仍做真实二进制 decode 对账;`encoder_dropped_features` 必须继续为 0。 + +## 4. Release 迁移 + +v1.4.3 mapping SHA 与 v1.4.2 不同,因此旧 plan 不得继续运行。 + +新增: + +`cm95pbf migrate-production-release` + +流程: + +1. 用 v1.4.3 mapping 创建新 plan / 新 release_id; +2. 读取旧 release ledger; +3. 仅复用旧 `PASS`; +4. 旧 FAILED/PENDING/RUNNING 一律在新 ledger 中重新 PENDING; +5. 若旧 PASS report 命中新 mapping 声明的 `delivery_output_changed_object_classes`,也不复用; +6. 旧 PASS 必须同时满足: + - hard_gate_unmapped = 0 + - encoder_dropped_features = 0 + - planned == output + - PBF/report 文件完整 +7. 通过的 PBF/report 默认用 hardlink 复用,失败则自动 copy fallback。 + +v1.4.3 的 delivery output changed class 只有: + +`FSHHAV` + +因为旧版所有出现 FSHHAV AREA 的 tile 都已被 hard-gate 阻断,正常预期是复用约 19,913 PASS,只重建约 202 tile。 + +## 5. Release 状态语义 + +`finalize-production` 现在同时输出: + +- production integrity `status` +- `semantic_completeness` +- `semantic_backlog` +- `quantization_fallbacks` +- `quantization_omissions` + +v1.4.3 即使 production integrity PASS,只要 112 个 pending semantic variant 尚未处理: + +`semantic_completeness = PENDING_REVIEW` + +因此不得把 v1.4.3 称为“全国 CM95 语义全部完成”;它是生产生成链/失败恢复/安全硬门收口版。 diff --git a/docs/CM95_PBF生产化阶段_v1_4_4.md b/docs/CM95_PBF生产化阶段_v1_4_4.md new file mode 100644 index 0000000..8a2e8a5 --- /dev/null +++ b/docs/CM95_PBF生产化阶段_v1_4_4.md @@ -0,0 +1,66 @@ +# CM95 PBF 生产化阶段 v1.4.4 + +## 状态 + +目标:解决 v1.4.3 全量 production 重建后剩余 45 个 `MVT encoder dropped features`。 + +v1.4.3 实测: + +- jobs: 20,115 +- PASS: 20,070 +- FAILED: 45 +- FSHHAV hard-gate: 已解决 +- 剩余失败:全部 encoder drop + +## 根因 + +v1.4.3 的 MVT 编码前预量化检查只能近似模拟 mapbox-vector-tile 的实际 geometry clean-up。 +实际 encoder 内部仍可能把部分 line/polygon 清理为空,因此第一遍 encode/decode 仍发现 planned ID 缺失。 + +## 修复 + +采用两阶段真实 encoder reconciliation: + +1. encode + decode; +2. 比较 planned IDs 与 actual IDs; +3. 对 dropped ID: + - 普通几何:显式 quantization omission; + - safety-preserving layer:point fallback; +4. 重建 planned set; +5. 重新 encode + decode; +6. 最终仍不一致则 fail-closed。 + +不会把 depth contour / baseline line 等普通线性对象伪造成 hazard point。 + +## Production plan 完整性修复 + +`builder_contract_version` 现在属于 immutable plan 内容,因此 builder 输出语义改变时 Plan ID / Release ID 会改变。 + +v1.4.4: + +`cm95pbf-builder/0.4.4-encoder-reconcile` + +这防止同一个 release 目录混用不同 encoder reconciliation 逻辑。 + +## Release Gate + +允许: + +- quantization omissions +- safety point fallbacks +- encoder probe candidates + +禁止: + +- final encoder_dropped_features +- hard_gate_unmapped +- planned/report/decode count mismatch +- unexpected encoder output IDs + +## 恢复策略 + +从 v1.4.3 release 迁移: + +`cm95-d1-bfa67dd5625f-289c62fbf758` + +预期复用 20,070 PASS,只重建 45 FAILED。 diff --git a/docs/CM95_PBF生产化阶段_v1_4_5.md b/docs/CM95_PBF生产化阶段_v1_4_5.md new file mode 100644 index 0000000..3d25b09 --- /dev/null +++ b/docs/CM95_PBF生产化阶段_v1_4_5.md @@ -0,0 +1,42 @@ +# CM95 PBF 生产化阶段 v1.4.5 + +## 目标 + +收口 v1.4.4 finalize-production 唯一剩余的 Style contract unmatched:18 个没有任何可渲染文本内容的 label-only Feature。 + +## 事实基线 + +- production jobs: 20115 / PASS 20115 +- PBF: 19751 +- planned/decoded features: 787902 / 787902 +- sprite missing: 0 +- style contract unmatched: 18 + - place_label_land / built_up_place: 9 + - seabed_text_point / seabed_material: 9 +- 18 个 tile-local Feature 分布于 16 个 tile。 + +## 修复 + +1. Builder contract 升级为 `cm95pbf-builder/0.4.5-nonrenderable-label-omit`。 +2. delivery 编码前增加 label renderability gate: + - `place_label_land` 必须至少有非空 `place_name_en` 或 `chart_label_text`; + - `seabed_text_point` 必须有非空 `chart_label_text`。 +3. 不满足时不进入 PBF,写入 `non_renderable_omissions`;trace 标记 `delivery_omitted=true`。 +4. 不修改 mapping/style/sprite/FID/geometry/quantization。 +5. migration 增加 `--invalidate-tiles-file`,只强制重建实际受 builder contract 变化影响的 tile。 +6. 修正 migration trace 文件扩展名为实际 `.trace.jsonl`。 + +## 预期结果 + +- 新 release jobs 20115 +- migrate reuse 20099 +- PENDING 16 +- 16 tile 重建 PASS +- planned/decoded feature count 预计从 787902 降到 787884 +- `non_renderable_omissions = 18` +- `style_sprite_contract.overall = PASS` +- `contract_unmatched_count = 0` +- `sprite_missing_count = 0` +- finalize-production `status = PASS` + +语义 backlog `112 variants / 52828 rows` 仍维持 `PENDING_REVIEW`,不在本版本伪装为完成。 diff --git a/docs/CM95_PBF生产化阶段_v1_4_6.md b/docs/CM95_PBF生产化阶段_v1_4_6.md new file mode 100644 index 0000000..3fe2a57 --- /dev/null +++ b/docs/CM95_PBF生产化阶段_v1_4_6.md @@ -0,0 +1,116 @@ +# CM95 PBF 生产化阶段 v1.4.6 + +## 目标 + +v1.4.6 是 **纯生产查询性能修复**。不改变 NavSea delivery 语义、FID、mapping、Style、Sprite、量化、encoder reconcile、non-renderable omission 或 Japan z12 G=1:7,500 policy。 + +## 已确认根因 + +正确 Japan Dataset 1(1492 cells / 1,282,431 source features)在 z11 高密度生产时,v1.4.5 的 `_fetch_scale_features()` 使用: + +```sql +FROM chart_feature f +JOIN chart_cell c ... +JOIN chart_area_geometry g ... +WHERE f.dataset_id=? + AND f.native_scale=? + AND f.geometry_type='AREA' + AND four numeric bbox predicates +ORDER BY c.source_relative_path, f.source_record_index +``` + +代表性 tile EXPLAIN: + +- `chart_feature` 驱动; +- `key=idx_feature_class`; +- `rows≈611,396`; +- `Using temporary; Using filesort`。 + +同一 tile 改为 geometry spatial-first 后: + +- `chart_area_geometry` 驱动; +- `type=range`; +- `key=spx_area_geom`; +- `rows≈38`; +- `chart_feature` 通过 PRIMARY KEY `eq_ref` 回表。 + +## v1.4.6 修改 + +### POINT / LINE / AREA + +分别使用现有 MySQL 5.7 SPATIAL INDEX: + +- `chart_point_geometry.spx_point_geom` +- `chart_line_geometry.spx_line_geom` +- `chart_area_geometry.spx_area_geom` + +查询结构改为: + +1. geometry table `FORCE INDEX(spx_*)`; +2. `STRAIGHT_JOIN chart_feature`,防止 MySQL 5.7 重新选择 `chart_feature` 为驱动表; +3. `MBRIntersects(g.geom, tile envelope)` 做 R-tree candidate lookup; +4. 保留 v1.4.5 四个 `f.bbox_*` 条件作为第二道候选一致性 gate; +5. 继续通过 `chart_feature` PRIMARY KEY 读取属性; +6. 不增加/修改 importer schema。 + +### Deterministic ordering + +v1.4.5 的 SQL `ORDER BY c.source_relative_path, f.source_record_index` 会对包含 JSON/WKB 的结果触发大量 disk temporary/filesort。 + +v1.4.6 删除 SQL ORDER BY,改为 Python 排序,同时保留原有顺序语义: + +- 外层仍固定 `POINT → LINE → AREA`; +- 每一种 geometry 内按 `(source_relative_path, source_record_index)` 排序; +- sounding 按 `(source_relative_path, source_record_index, point_index)` 排序。 + +### SOUNDING + +`chart_sounding_point` 同样显式: + +- `FORCE INDEX(spx_sounding_geom)`; +- `STRAIGHT_JOIN chart_feature`; +- 保持原 `MBRContains(tile envelope, s.geom)` 语义不变; +- 排序移到 Python。 + +## 不变项 + +- Dataset / importer / MySQL schema:不变; +- `cm95_to_navsea_v1.yaml`:不变; +- FID identity contract:不变; +- delivery source-layer contract:不变; +- encoder reconcile:不变; +- non-renderable label omission:不变; +- Japan gap disposition:不变; +- Japan z12 G=1:7,500 policy:不变; +- z0-z12 extent:不变。 + +## Builder contract + +- project: `0.4.6` +- runtime: `0.4.6-production-spatial-candidate-query` +- builder: `cm95pbf-builder/0.4.6-spatial-candidate-query` + +Builder contract 参与 production plan hash,因此必须创建新的 plan / release ID。不得用 v1.4.5 plan 直接继续 v1.4.6 build。 + +## 验收 + +正式 build 前执行: + +```powershell +& ".\.venv\Scripts\python.exe" .\tools\cm95_v1_4_6_preflight.py + +& ".\.venv\Scripts\python.exe" .\tools\cm95_v1_4_6_query_equivalence.py ` + --dataset-id 1 +``` + +query equivalence 必须满足: + +- POINT old IDs == new IDs; +- LINE old IDs == new IDs; +- AREA old IDs == new IDs; +- SOUNDING old IDs == new IDs; +- new query geometry table 为第一驱动表; +- `type=range`; +- 使用对应 `spx_*` index。 + +最终 release 仍允许 `semantic_completeness=PENDING_REVIEW`,但 technical final status 必须 PASS。 diff --git a/docs/CM95_助航名称规则冻结_v1.md b/docs/CM95_助航名称规则冻结_v1.md new file mode 100644 index 0000000..3b61ec2 --- /dev/null +++ b/docs/CM95_助航名称规则冻结_v1.md @@ -0,0 +1,47 @@ +# CM95 助航名称规则冻结 v1 + +## 结论 + +基于 Dataset ID=1、z10/914/385 AOI 的 1:20,000 / 1:50,000 / 1:200,000 多尺度审计,冻结以下规则: + +1. `navigation_marks.chart_label_text` 只允许来自助航组件自身的 `OBJNAM` 或 `NOBJNM`。 +2. `_texto._texta.text` 不参与自动助航名称关联。 +3. 不使用“最近文字”“同 Cell 最近文字”“距离阈值”生成助航名称。 +4. 不从 NEWPEC / reference PBF 反向灌入名称。 +5. relation20 仍只负责同 Cell 助航组件合成,不用于关联 `_texto`。 +6. 合成组中: + - 基体存在直接名称时,基体名称优先; + - 否则只有一个唯一 LIGHTS 直接名称时使用该名称; + - 若多个 LIGHTS 提供不同直接名称,则 delivery 留空,engineering trace 记录 `nav_name_conflict=true` 与所有候选。 +7. standalone LIGHTS 同样只使用自身 `OBJNAM/NOBJNM`。 + +## 审计事实 + +- 共 136 个助航组。 +- 1:20,000:62 组,7 组带直接名称。 +- 1:50,000:57 组,0 组带直接名称。 +- 1:200,000:17 组,0 组带直接名称。 +- 三个比例尺 `explicit_text_candidates = 0`。 +- `_texto` 中没有可用于显式关联的 relation/index 字段。 +- 1:20,000 的 7 个直接名称均来自 `LIGHTS.OBJNAM`,值为: + `L2 / R1 / L1 / C1 / C1 / C2 / R2`。 + +这些值属于 CM95 源对象自身字段,因此可以保留;但它们不能被解释成 NEWPEC 的日文灯塔名,也不能作为距离文字关联的依据。 + +## 生成器实现要求 + +- `OBJNAM` 优先,`NOBJNM` fallback。 +- 不引入 `_texto` proximity lookup。 +- engineering report 统计: + - `named_from_direct_source` + - `name_conflict_groups` +- engineering trace 记录: + - `nav_name_source` + - `nav_name_candidates` + - `nav_name_conflict` + +## 状态 + +名称调查:CLOSED / PASS + +本规则不阻塞 PBF-03 后续 21 张 z10-z12 批量生成。 diff --git a/docs/CM95到NavSea映射设计报告_v1.md b/docs/CM95到NavSea映射设计报告_v1.md new file mode 100644 index 0000000..6051885 --- /dev/null +++ b/docs/CM95到NavSea映射设计报告_v1.md @@ -0,0 +1,389 @@ +# CM95 → NavSea PBF 映射设计报告 v1 + +日期:2026-09-03 +状态:`PBF-02 / IMPLEMENTATION_DRAFT` +测试 AOI:`z10/914/385` + +## 1. 本轮输入 + +CM95 MySQL AOI 审计: + +```text +AOI Cells : 7 +AOI Spatial Features : 3605 +Object class/geom groups : 80 +Attribute groups : 177 +Feature samples : 600 +``` + +现有 NavSea/NEWPEC 对照 PBF: + +```text +z10 tiles : 1 +z11 tiles : 4 +z12 tiles : 16 +total : 21 +observed source-layers : 37 +``` + +实际 extent: + +```text +z10 : 4096 +z11 : 4096 +z12 : 1048576 +``` + +因此 CM95 generator 不应把“所有 zoom 固定 extent=4096”当成既有生产事实。首版 generator 必须把 extent 作为显式策略,并在输出审计中记录实际值。 + +## 2. CM95 AOI 主要对象 + +当前 AOI 具备完整的安全对象闭环: + +```text +WRECKS POINT : 480 +DEPCNT LINE : 451 +DEPARE AREA : 414 +SBDARE POINT : 287 +SLCONS LINE : 209 +UWTROC POINT : 176 +COALNE LINE : 171 +LNDARE AREA : 159 +SLCONS AREA : 119 +LIGHTS POINT : 96 +OBSTRN AREA : 70 +ITDARE AREA : 69 +``` + +同时存在 Beacon/Buoy、Bridge、overhead cable、submarine cable、pilot boarding、anchorage 等对象,可覆盖第一阶段 hard-gate。 + +## 3. 现有 NavSea PBF 实际契约 + +当前 21 张参考 PBF 中最主要的 source-layer: + +```text +onshore_structure_line 12940 +baseline_outline 2129 +baseline_area 1146 +bathymetry_line 1128 +anchor_caution_hazard_point 897 +depth_contour 821 +hole_area 563 +land_area 321 +seabed_text_point 273 +baseline_line 234 +anchor_caution_hazard_area 172 +anchor_caution_hazard_outline 172 +onshore_structure_area 137 +place_label_land 136 +onshore_structure_point 124 +``` + +当前 unified style 实际消费 37 个 NavSea source-layer。 + +参考 PBF 与 style 之间存在少量“PBF 有但当前 style 不消费”的历史层: + +```text +depth_contour_overview +route_area +route_outline +``` + +因此 CM95 v1 不因为参考 PBF 中存在 `route_area` 就自动输出它。 +例如 `FAIRWY` 首版保留在工程版,避免违反“只改 tile URL 即可使用当前 style”的目标。 + +## 4. 第一版映射覆盖 + +`cm95_to_navsea_v1.yaml` 已覆盖本 AOI 全部 80 个 `object_class + geometry_type` 组合。 + +映射状态(按组合数): + +```text +MAPPED 33 +ENGINEERING_ONLY 12 +MAPPED_CONDITIONAL 11 +REVIEW_STYLE_GAP 11 +COMPOSITE 5 +REVIEW_CONDITIONAL 4 +ENGINEERING_COMPONENT 1 +UNMAPPED_REVIEW 1 +DERIVED_LABEL_ONLY 1 +MAPPED_DERIVED_POINTS 1 +``` + +可以直接进入映射/合成实现的 Feature 数: + +```text +3239 / 3605 = 89.8% +``` + +其余对象没有静默丢弃,全部明确进入: + +```text +REVIEW_CONDITIONAL +REVIEW_STYLE_GAP +ENGINEERING_ONLY +ENGINEERING_COMPONENT +UNMAPPED_REVIEW +``` + +正式 delivery 不会因为未映射而“假装成功”。 + +## 5. Hard-gate 映射 + +### DEPARE + +```text +DEPARE AREA +→ baseline_area +→ DRVAL1 / DRVAL2 +→ canonical depth range +→ chart_fill_style=depth_zone_* +``` + +原 polygon 不重建。 + +### DEPCNT + +```text +DEPCNT LINE +→ depth_contour +VALDCO → least_depth_m +VALDCO → chart_label_text +``` + +### WRECKS + +```text +WRECKS POINT +→ navigation_hazard_point +VALSOU present → wreck_surveyed +otherwise → wreck_submerged_dangerous +``` + +Area wreck 保持 area,不降级为 point,并额外派生 boundary 到 `navigation_hazard_outline`。 + +### UWTROC + +```text +UWTROC POINT +→ navigation_hazard_point + +WATLEV submerged → rock_submerged +WATLEV awash/drying → rock_awash +VALSOU → least_depth_m +``` + +必须保留水上/水下语义。 + +### OBSTRN + +Point 与 Area 分开: + +```text +POINT → navigation_hazard_point +AREA → navigation_hazard_area + derived outline +``` + +### FSHHAV + +```text +FSHHAV POINT +→ anchor_caution_hazard_point +→ reef_fish +``` + +### BRIDGE / CBLOHD / TELPHC / PIPOHD + +净空/架空安全对象使用现有: + +```text +bridge_structure +clearance_limit_line +clearance_limit_point +``` + +存在 `VERCLR` 时才写净空数值;没有值时不伪造。 + +## 6. 助航对象必须合成,而不是简单逐对象输出 + +本轮最重要的新结论是: + +CM93 中: + +```text +LIGHTS +BCNLAT +BCNSPP +BOYSPP +RTPBCN +TOWERS +_extgn +``` + +可能是同一个现实助航标的多个对象组件。 + +AOI 样本已经观察到共享: + +```text +cell_id + attributes._cm93_relation20_raw +``` + +并且共享 relation20 的样本坐标完全一致。 + +样本证据包括: + +- cell `693` relation20 `2273` → `BCNLAT, LIGHTS`;坐标组数 `1` +- cell `693` relation20 `2272` → `BCNLAT, LIGHTS`;坐标组数 `1` +- cell `693` relation20 `2254` → `BCNLAT, LIGHTS`;坐标组数 `1` +- cell `693` relation20 `2266` → `LIGHTS, _extgn`;坐标组数 `1` +- cell `693` relation20 `2270` → `LIGHTS, _extgn`;坐标组数 `1` +- cell `693` relation20 `2276` → `LIGHTS, _extgn`;坐标组数 `1` +- cell `693` relation20 `2239` → `LIGHTS, TOWERS`;坐标组数 `1` +- cell `693` relation20 `2241` → `LIGHTS, TOWERS`;坐标组数 `1` + +因此 CM95 PBF Adapter 第一版采用: + +```text +primary composition key = + cell_id + + _cm93_relation20_raw +``` + +而不是仅凭经纬度 proximity 合并。 + +规则: + +1. relation20 相同且坐标一致 → 合成一个 `navigation_marks` Feature; +2. LIGHTS 的灯色、灯质、周期、高度、射程、扇区等属性并入基体; +3. Beacon/Buoy/Tower 提供主体 symbol 语义; +4. `_extgn` 只作为组件/trace,不单独 delivery; +5. relation20 缺失时才允许进入 fallback; +6. fallback 必须被审计标记,不能静默按邻近点合并。 + +在真正写 generator 前,需要用全 AOI 数据验证 relation20,而不是只依赖 600 条采样记录。 + +本包已经提供: + +```text +tools/cm95_nav_aid_relation_audit_v1.py +``` + +## 7. Light 字段 + +本 AOI 实际出现的 CM93/S-57 `COLOUR` 值: + +```text +1 → white +3 → red +4 → green +6 → yellow +``` + +首版只对当前实际出现值建立冻结映射;其它值先进入 mapping gap,不猜值。 + +`LIGHTS` 输出至少包括: + +```text +light_color_code +chart_label_text +chart_label_subtext +chart_text_style +chart_text_color +light_sector_mode +chart_icon_image +``` + +灯略记由: + +```text +LITCHR +SIGGRP +SIGPER +COLOUR +HEIGHT +VALNMR +``` + +组合生成。 + +## 8. Sounding + +当前 AOI 有 `SOUNDG` Feature,并由 `chart_sounding_point` 保存多个真实 sounding points。 + +因为当前 style 没有独立 `sounding_point` source-layer,v1 采用: + +```text +chart_sounding_point +→ derived point label +→ seabed_text_point +``` + +这是额外 render artifact,不修改/替换数据库里的原 sounding。 + +## 9. Stable identity + +禁止把: + +```text +chart_feature.id +``` + +当成长期 PBF identity。 + +v1 冻结 source identity: + +```text +cm95: + dataset_id + + source_relative_path + + source_record_index + + geometry_role +``` + +下一阶段 generator 会在此基础上建立稳定 FID manifest,再接现有 NavSea numeric feature-id 体系。 + +## 10. 当前尚未正式进入 delivery 的内容 + +主要包括: + +```text +_texto 文本归属 land/sea/facility 尚需关联判断 +BUISGL POINT 当前 style 表达不明确 +行政边界类 当前 style 不需要 +FAIRWY 参考 PBF 有 route_area,但当前 unified style 不消费 +若干一般陆上点对象 不属于 hard-gate,后续补 symbol 映射 +``` + +这些对象全部保留在工程 trace / `cm95_unmapped`,没有删除。 + +## 11. 下一步门禁 + +先执行 relation20 全 AOI 审计。 + +通过条件: + +```text +LIGHTS relation20 可覆盖主要灯标 +relation group 不出现明显坐标冲突 +跨 Cell 不发生错误合并 +无法合并的 LIGHTS 数量明确 +``` + +通过后进入: + +```text +PBF-03 +CM95 MySQL → z10/914/385 单 tile generator +``` + +第一版 generator 将只实现当前已经冻结的映射,并同时输出: + +```text +delivery PBF +engineering PBF / trace +cm95_unmapped report +FID audit +sprite closure audit +object preservation audit +``` diff --git a/docs/PBF03_离线自检报告_v1.md b/docs/PBF03_离线自检报告_v1.md new file mode 100644 index 0000000..7cd1c50 --- /dev/null +++ b/docs/PBF03_离线自检报告_v1.md @@ -0,0 +1,35 @@ +# PBF-03 离线自检报告 v1 + +状态:`PASS / WAITING FOR USER MYSQL + WINDOWS MVT BUILD` + +## 已检查 + +- 当前仓库 `pyproject.toml` 基线已读取并按完整文件方式更新。 +- `requirements.txt` 已同步新增 `PyYAML` 与 `mapbox-vector-tile`。 +- 新增包:`src/cm95pbf/`,不修改 `src/cm93db/` importer/geometry。 +- Mapping:80 条 `object_class + geometry_type` 规则,无重复 key。 +- 当前 NavSea style:37 个 `source-layer`。 +- 当前 semantic sprite:476 个 key。 +- Mapping contract:layer failure = 0,sprite failure = 0。 +- AOI:`z10/914/385`。 +- Tile math:WGS84 bbox 与前置 AOI 审计一致。 +- 子瓦片:z11 = 4 张,z12 = 16 张。 +- relation20:96 LIGHTS 中 94 可安全关联,坐标冲突 0,2 条独立 LIGHTS。 +- Python 静态编译:`src/cm95pbf/*.py` 与 `tools/*.py` PASS。 + +## 生成器原则 + +- MySQL 只读。 +- 不使用 `chart_feature.id` 作为外部稳定 MVT id。 +- 使用 Dataset FID manifest。 +- Coverage 决定同一 tile 内的比例尺优先级和回退区域。 +- Engineering 版保留 trace;Delivery 版按当前 NavSea delivery allowlist 裁字段。 +- 无安全映射对象不进入正式 delivery,engineering 进入 `cm95_unmapped`。 +- 扇区灯第一轮不伪造 `arc_id`;待与实际生成结果和现有 PBF 做专项闭合。 + +## 尚需用户环境验证 + +- MySQL 实际查询与 Coverage 回退。 +- `mapbox-vector-tile` Windows 编码结果。 +- 21 张 PBF 实际 decode/audit。 +- 与现有 NavSea/NEWPEC 同 AOI 的 source-layer、hard-gate 和视觉对照。 diff --git a/docs/PBF03_离线自检报告_v1_1.md b/docs/PBF03_离线自检报告_v1_1.md new file mode 100644 index 0000000..cd55906 --- /dev/null +++ b/docs/PBF03_离线自检报告_v1_1.md @@ -0,0 +1,34 @@ +# PBF-03 Pilot Generator v1.1 离线自检报告 + +## 变更 + +v1.1 在已通过单 tile 二进制兼容性检查的 v1 基线上,只补充助航名称契约: + +- 新增 `OBJNAM -> NOBJNM` fallback; +- 多灯组直接名称冲突不写入 delivery; +- engineering trace 记录名称来源/候选/冲突; +- build report 增加直接名称与名称冲突统计; +- `_texto` 距离候选仍完全不参与生成。 + +## 静态检查 + +- Python `py_compile`:PASS +- Mapping rules:80 +- 助航名称 direct helper:PASS +- 当前 mapping 的 LIGHTS `chart_label_text`:`first_present(OBJNAM,NOBJNM)` +- 不修改 importer / geometry / schema。 +- z10/z11/z12 extent policy 不变。 +- build-sample-aoi 仍固定生成 1 + 4 + 16 = 21 张/每 profile。 + +## 运行时待验证 + +本环境没有用户 MySQL Dataset,因此以下由用户本机执行: + +1. 重新安装 editable project; +2. 运行 `build-sample-aoi`; +3. 运行 delivery build report audit; +4. 上传 `sample_aoi_summary_v1.json` 与 `cm95_pbf_build_reports_audit_v1.json`。 + +## Gate + +允许进入 21 张 Pilot 批量生成。 diff --git a/docs/cm95_global_mapping_gap_closure_audit_v2.json b/docs/cm95_global_mapping_gap_closure_audit_v2.json new file mode 100644 index 0000000..9f469b2 --- /dev/null +++ b/docs/cm95_global_mapping_gap_closure_audit_v2.json @@ -0,0 +1,866 @@ +{ + "schema": "navsea.cm95.global-mapping-gap-closure-audit/v2", + "dataset_id": 1, + "observed_gap_variants": 141, + "unclassified_variants": [], + "newly_delivery_mapped": [ + { + "object_class": "FSHHAV", + "geometry_type": "AREA", + "feature_count": 51, + "disposition": "DELIVERY_MAPPED_V1_4_3" + } + ], + "existing_explicit_non_delivery": [ + { + "object_class": "_texto", + "geometry_type": "POINT", + "feature_count": 13911, + "disposition": "EXISTING_REVIEW_CONDITIONAL" + }, + { + "object_class": "$LINES", + "geometry_type": "LINE", + "feature_count": 2652, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "CTNARE", + "geometry_type": "AREA", + "feature_count": 2546, + "disposition": "EXISTING_REVIEW_CONDITIONAL" + }, + { + "object_class": "CTNARE", + "geometry_type": "POINT", + "feature_count": 2262, + "disposition": "EXISTING_REVIEW_CONDITIONAL" + }, + { + "object_class": "BUAARE", + "geometry_type": "AREA", + "feature_count": 2046, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "M_PROD", + "geometry_type": "AREA", + "feature_count": 784, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "$COMPS", + "geometry_type": "POINT", + "feature_count": 538, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "BUISGL", + "geometry_type": "POINT", + "feature_count": 516, + "disposition": "EXISTING_UNMAPPED_REVIEW" + }, + { + "object_class": "_extgn", + "geometry_type": "POINT", + "feature_count": 462, + "disposition": "EXISTING_ENGINEERING_COMPONENT" + }, + { + "object_class": "TNKCON", + "geometry_type": "POINT", + "feature_count": 426, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + }, + { + "object_class": "$AREAS", + "geometry_type": "AREA", + "feature_count": 418, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "NATARE", + "geometry_type": "AREA", + "feature_count": 315, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "TESARE", + "geometry_type": "AREA", + "feature_count": 277, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "BUIREL", + "geometry_type": "POINT", + "feature_count": 246, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + }, + { + "object_class": "HRBARE", + "geometry_type": "AREA", + "feature_count": 204, + "disposition": "EXISTING_REVIEW_CONDITIONAL" + }, + { + "object_class": "CRANES", + "geometry_type": "POINT", + "feature_count": 167, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + }, + { + "object_class": "FAIRWY", + "geometry_type": "AREA", + "feature_count": 157, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "CTRPNT", + "geometry_type": "POINT", + "feature_count": 151, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "PRDINS", + "geometry_type": "POINT", + "feature_count": 131, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + }, + { + "object_class": "EXEZNE", + "geometry_type": "AREA", + "feature_count": 64, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "SILBUI", + "geometry_type": "POINT", + "feature_count": 60, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + }, + { + "object_class": "SISTAW", + "geometry_type": "POINT", + "feature_count": 59, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + }, + { + "object_class": "CONZNE", + "geometry_type": "AREA", + "feature_count": 47, + "disposition": "EXISTING_ENGINEERING_ONLY" + }, + { + "object_class": "SISTAT", + "geometry_type": "POINT", + "feature_count": 43, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + }, + { + "object_class": "PYLONS", + "geometry_type": "POINT", + "feature_count": 33, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + }, + { + "object_class": "MONUMT", + "geometry_type": "POINT", + "feature_count": 20, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + }, + { + "object_class": "AIRARE", + "geometry_type": "POINT", + "feature_count": 16, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + }, + { + "object_class": "RSCSTA", + "geometry_type": "POINT", + "feature_count": 13, + "disposition": "EXISTING_REVIEW_STYLE_GAP" + } + ], + "pending_semantic_review": [ + { + "object_class": "RIVERS", + "geometry_type": "LINE", + "feature_count": 17606, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "SLOTOP", + "geometry_type": "LINE", + "feature_count": 7572, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "LNDELV", + "geometry_type": "POINT", + "feature_count": 5441, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "SLOGRD", + "geometry_type": "AREA", + "feature_count": 5181, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "LNDRGN", + "geometry_type": "AREA", + "feature_count": 3041, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "TOPMAR", + "geometry_type": "POINT", + "feature_count": 1572, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "ROADPT", + "geometry_type": "LINE", + "feature_count": 1408, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "WEDKLP", + "geometry_type": "POINT", + "feature_count": 1288, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "VEGARE", + "geometry_type": "AREA", + "feature_count": 881, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "RECTRC", + "geometry_type": "LINE", + "feature_count": 807, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "BOYLAT", + "geometry_type": "POINT", + "feature_count": 762, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "RESARE", + "geometry_type": "AREA", + "feature_count": 671, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "RAILWY", + "geometry_type": "LINE", + "feature_count": 477, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "WATTUR", + "geometry_type": "POINT", + "feature_count": 474, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "ACHBRT", + "geometry_type": "POINT", + "feature_count": 408, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "NAVLNE", + "geometry_type": "LINE", + "feature_count": 399, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "TSSLPT", + "geometry_type": "AREA", + "feature_count": 337, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "BRTFAC", + "geometry_type": "LINE", + "feature_count": 311, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "RADRFL", + "geometry_type": "POINT", + "feature_count": 280, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "LOCMAG", + "geometry_type": "AREA", + "feature_count": 264, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "MARCUL", + "geometry_type": "AREA", + "feature_count": 234, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "TSSBND", + "geometry_type": "LINE", + "feature_count": 233, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "BOYCAR", + "geometry_type": "POINT", + "feature_count": 217, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "RDOSTA", + "geometry_type": "POINT", + "feature_count": 206, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "WATTUR", + "geometry_type": "AREA", + "feature_count": 172, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FOGSIG", + "geometry_type": "POINT", + "feature_count": 150, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "TSEZNE", + "geometry_type": "AREA", + "feature_count": 145, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "STSLNE", + "geometry_type": "LINE", + "feature_count": 137, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "ACHARE", + "geometry_type": "POINT", + "feature_count": 134, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "BOYSAW", + "geometry_type": "POINT", + "feature_count": 114, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CANALS", + "geometry_type": "LINE", + "feature_count": 111, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CAUSWY", + "geometry_type": "LINE", + "feature_count": 99, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "ICEARE", + "geometry_type": "AREA", + "feature_count": 97, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "ROADPT", + "geometry_type": "AREA", + "feature_count": 95, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "PONTON", + "geometry_type": "AREA", + "feature_count": 91, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CANBNK", + "geometry_type": "LINE", + "feature_count": 81, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "DMPGRD", + "geometry_type": "AREA", + "feature_count": 73, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "RCRTCL", + "geometry_type": "LINE", + "feature_count": 70, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FSHFAC", + "geometry_type": "LINE", + "feature_count": 64, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "WEDKLP", + "geometry_type": "AREA", + "feature_count": 56, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "DAMCON", + "geometry_type": "AREA", + "feature_count": 53, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "SPOGRD", + "geometry_type": "AREA", + "feature_count": 53, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "LOCMAG", + "geometry_type": "POINT", + "feature_count": 52, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "DYKCRW", + "geometry_type": "LINE", + "feature_count": 51, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "WIMCON", + "geometry_type": "POINT", + "feature_count": 51, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "OFSPLF", + "geometry_type": "POINT", + "feature_count": 49, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "$TEXTS", + "geometry_type": "POINT", + "feature_count": 48, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "MSTCON", + "geometry_type": "POINT", + "feature_count": 48, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "RDOCAL", + "geometry_type": "POINT", + "feature_count": 44, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "BOYISD", + "geometry_type": "POINT", + "feature_count": 42, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "TSELNE", + "geometry_type": "LINE", + "feature_count": 41, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FLASTK", + "geometry_type": "POINT", + "feature_count": 39, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CANALS", + "geometry_type": "AREA", + "feature_count": 34, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "SLTPAN", + "geometry_type": "AREA", + "feature_count": 32, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FLODOC", + "geometry_type": "AREA", + "feature_count": 28, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "DRYDOC", + "geometry_type": "AREA", + "feature_count": 25, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "PRCARE", + "geometry_type": "AREA", + "feature_count": 22, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FSHFAC", + "geometry_type": "POINT", + "feature_count": 19, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "RADSTA", + "geometry_type": "POINT", + "feature_count": 18, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "TSSRON", + "geometry_type": "AREA", + "feature_count": 17, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "MARCUL", + "geometry_type": "POINT", + "feature_count": 16, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "DYKARE", + "geometry_type": "AREA", + "feature_count": 15, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "DMPGRD", + "geometry_type": "POINT", + "feature_count": 14, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "GATCON", + "geometry_type": "LINE", + "feature_count": 14, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "SLIPWY", + "geometry_type": "LINE", + "feature_count": 13, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "SNDWAV", + "geometry_type": "POINT", + "feature_count": 13, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "GATCON", + "geometry_type": "AREA", + "feature_count": 12, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FNCLNE", + "geometry_type": "LINE", + "feature_count": 11, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "LOGPON", + "geometry_type": "AREA", + "feature_count": 11, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "PIPARE", + "geometry_type": "AREA", + "feature_count": 11, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "PILBOP", + "geometry_type": "AREA", + "feature_count": 10, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "BCNISD", + "geometry_type": "POINT", + "feature_count": 9, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CGUSTA", + "geometry_type": "POINT", + "feature_count": 9, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CRANES", + "geometry_type": "AREA", + "feature_count": 9, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "WATFAL", + "geometry_type": "POINT", + "feature_count": 9, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "BCNCAR", + "geometry_type": "POINT", + "feature_count": 8, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FSHFAC", + "geometry_type": "AREA", + "feature_count": 8, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "BOYINB", + "geometry_type": "POINT", + "feature_count": 7, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "DIFFUS", + "geometry_type": "AREA", + "feature_count": 7, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "DSHAER", + "geometry_type": "POINT", + "feature_count": 6, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "OILBAR", + "geometry_type": "LINE", + "feature_count": 6, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "PYLONS", + "geometry_type": "AREA", + "feature_count": 6, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "BUIREL", + "geometry_type": "AREA", + "feature_count": 5, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CBLARE", + "geometry_type": "AREA", + "feature_count": 5, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "HILARE", + "geometry_type": "AREA", + "feature_count": 5, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "HULKES", + "geometry_type": "AREA", + "feature_count": 5, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "LITVES", + "geometry_type": "POINT", + "feature_count": 5, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "TSSCRS", + "geometry_type": "AREA", + "feature_count": 5, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "$CSYMB", + "geometry_type": "POINT", + "feature_count": 4, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "ACHBRT", + "geometry_type": "AREA", + "feature_count": 4, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CEMTRY", + "geometry_type": "POINT", + "feature_count": 4, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "ACHPNT", + "geometry_type": "POINT", + "feature_count": 3, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CAUSWY", + "geometry_type": "AREA", + "feature_count": 3, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CEMTRY", + "geometry_type": "AREA", + "feature_count": 3, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "DIFFUS", + "geometry_type": "POINT", + "feature_count": 3, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FLGSTF", + "geometry_type": "POINT", + "feature_count": 3, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "WATTUR", + "geometry_type": "LINE", + "feature_count": 3, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CHNWIR", + "geometry_type": "LINE", + "feature_count": 2, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "CTSARE", + "geometry_type": "AREA", + "feature_count": 2, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "OFSPRD", + "geometry_type": "AREA", + "feature_count": 2, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "RMPARE", + "geometry_type": "AREA", + "feature_count": 2, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "AIRARE", + "geometry_type": "AREA", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "BCNSAW", + "geometry_type": "POINT", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "DOCARE", + "geometry_type": "AREA", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FERYRT", + "geometry_type": "LINE", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FLODOC", + "geometry_type": "LINE", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "FSHGRD", + "geometry_type": "AREA", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "GATCON", + "geometry_type": "POINT", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "LOGPON", + "geometry_type": "POINT", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "RADDOM", + "geometry_type": "POINT", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "SPOGRD", + "geometry_type": "POINT", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + }, + { + "object_class": "SPRING", + "geometry_type": "POINT", + "feature_count": 1, + "disposition": "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" + } + ], + "pending_semantic_review_feature_rows": 52828, + "fshhav_area_hard_gate_mapping_ok": true, + "delivery_output_changed_object_classes": [ + "FSHHAV" + ], + "delivery_change_contract_ok": true, + "semantic_completeness": "PENDING_REVIEW", + "overall": "PASS" +} \ No newline at end of file diff --git a/docs/cm95_mapping_contract_check_v1.json b/docs/cm95_mapping_contract_check_v1.json new file mode 100644 index 0000000..d49a0d8 --- /dev/null +++ b/docs/cm95_mapping_contract_check_v1.json @@ -0,0 +1,12 @@ +{ + "mapping": "/mnt/data/cm95_pbf_pilot_generator_v1/config/mappings/cm95_to_navsea_v1.yaml", + "style": "/mnt/data/_pbf_sample/style.navsea-delivery-full-semantic-unified-20260808.json", + "sprite_json": "/mnt/data/_pbf_sample/semantic-sprite/sprite.json", + "style_source_layer_count": 37, + "sprite_key_count": 476, + "rule_count": 80, + "layer_failures": [], + "sprite_failures": [], + "failure_count": 0, + "overall": "PASS" +} \ No newline at end of file diff --git a/docs/cm95_mapping_contract_check_v1_1.json b/docs/cm95_mapping_contract_check_v1_1.json new file mode 100644 index 0000000..5e58644 --- /dev/null +++ b/docs/cm95_mapping_contract_check_v1_1.json @@ -0,0 +1,12 @@ +{ + "mapping": "/mnt/data/cm95_pbf_pilot_generator_v1_1/config/mappings/cm95_to_navsea_v1.yaml", + "style": "/mnt/data/navsea_contract_ref/style.navsea-delivery-full-semantic-unified-20260808.json", + "sprite_json": "/mnt/data/navsea_contract_ref/semantic-sprite/sprite.json", + "style_source_layer_count": 37, + "sprite_key_count": 476, + "rule_count": 80, + "layer_failures": [], + "sprite_failures": [], + "failure_count": 0, + "overall": "PASS" +} \ No newline at end of file diff --git a/docs/cm95_mapping_contract_check_v1_4_3.json b/docs/cm95_mapping_contract_check_v1_4_3.json new file mode 100644 index 0000000..909e30c --- /dev/null +++ b/docs/cm95_mapping_contract_check_v1_4_3.json @@ -0,0 +1,12 @@ +{ + "mapping": "/mnt/data/cm95_pbf_production_v1_4_3/cm95_pbf_production_v1_4/config/mappings/cm95_to_navsea_v1.yaml", + "style": "/mnt/data/cm95_pbf_production_v1_4_3/cm95_pbf_production_v1_4/config/style/style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json", + "sprite_json": "/mnt/data/cm95_pbf_production_v1_4_3/cm95_pbf_production_v1_4/config/sprite/semantic-sprite-20260808.json", + "style_source_layer_count": 37, + "sprite_key_count": 476, + "rule_count": 81, + "layer_failures": [], + "sprite_failures": [], + "failure_count": 0, + "overall": "PASS" +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 65f57e6..352ae01 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,18 +4,21 @@ build-backend = "setuptools.build_meta" [project] name = "cm93-mysql-importer" -version = "0.2.0" -description = "CM93 complete high-precision importer and auditor for MySQL 5.7" +version = "0.4.7" +description = "CM93 complete high-precision importer/auditor and CM95-to-NavSea PBF frozen-pilot and production generator for MySQL 5.7" readme = "README.md" requires-python = ">=3.12,<3.13" dependencies = [ "PyMySQL>=1.1,<2", "python-dotenv>=1.0,<2", "Shapely>=2.0,<3", + "PyYAML>=6.0,<7", + "mapbox-vector-tile>=2.2,<3", ] [project.scripts] cm93db = "cm93db.cli:main" +cm95pbf = "cm95pbf.cli:main" [tool.setuptools] package-dir = {"" = "src"} diff --git a/requirements.txt b/requirements.txt index 43fd8cd..747959d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ PyMySQL>=1.1,<2 python-dotenv>=1.0,<2 Shapely>=2.0,<3 +PyYAML>=6.0,<7 +mapbox-vector-tile>=2.2,<3 diff --git a/scripts/cm95_japan_continue_from_step8.ps1 b/scripts/cm95_japan_continue_from_step8.ps1 new file mode 100644 index 0000000..d78fe39 --- /dev/null +++ b/scripts/cm95_japan_continue_from_step8.ps1 @@ -0,0 +1,392 @@ +param( + [string]$ProjectRoot = "D:\React\cm93-mysql-importer-starter", + [string]$SourceRoot = "D:\Ship\CM93V2\CM93JAPAN", + [int]$DatasetId = 1, + [int]$ExpectedCells = 1492, + [int]$Workers = 4 +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +function Step([string]$Text) { + Write-Host "" + Write-Host "======================================================================" + Write-Host $Text + Write-Host "======================================================================" +} + +function Run([string]$Label, [scriptblock]$Action) { + Step $Label + & $Action + $Code = $LASTEXITCODE + if ($null -ne $Code -and $Code -ne 0) { + throw "$Label FAILED (exit=$Code)" + } +} + +function StateCount($States, [string]$Name) { + if ($null -eq $States) { return 0 } + $P = $States.PSObject.Properties[$Name] + if ($null -eq $P) { return 0 } + return [int]$P.Value +} + +Set-Location $ProjectRoot + +$Python = ".\.venv\Scripts\python.exe" +$Cm95Pbf = ".\.venv\Scripts\cm95pbf.exe" + +$Mapping = ".\config\mappings\cm95_to_navsea_v1.yaml" +$Disposition = ".\config\mappings\cm95_gap_disposition_japan_dataset_1_v1.yaml" +$Policy = ".\config\pbf\cm95_tile_policy_japan_full_detail_v1.yaml" + +$GapAudit = ".\build\production\cm95_global_mapping_gap_audit_dataset_1.json" +$Closure = ".\build\production\cm95_global_mapping_gap_closure_dataset_1_after_review.json" +$MappingContract = ".\build\production\cm95_mapping_contract_check_japan_dataset_1.json" + +$Manifest = ".\build\cm95_fid_manifest_japan_dataset_1_v1.sqlite" +$Plan = ".\build\production\cm95_production_plan_japan_full_detail_v1.json" +$PlanAudit = ".\build\production\cm95_production_plan_audit_japan_full_detail_v1.json" + +foreach ($Path in @($Python,$Cm95Pbf,$Mapping,$Disposition,$Policy)) { + if (-not (Test-Path $Path)) { + throw "Missing required file: $Path" + } +} + +# ---------------------------------------------------------------------- +# 0. Verify v1.4.5 runtime +# ---------------------------------------------------------------------- + +Run "STEP 0 - CM95 v1.4.5 preflight" { + & $Python ".\tools\cm95_v1_4_5_preflight.py" +} + +# ---------------------------------------------------------------------- +# 1. Verify fresh Japan Dataset in MySQL, no reimport +# ---------------------------------------------------------------------- + +Step "STEP 1 - Verify existing fresh Japan Dataset" + +$Tmp = Join-Path $env:TEMP ("cm95_japan_continue_" + $PID) +Remove-Item $Tmp -Recurse -Force -ErrorAction SilentlyContinue +New-Item -ItemType Directory -Path $Tmp | Out-Null + +try { + $Helper = Join-Path $Tmp "verify_dataset.py" + +@' +from pathlib import Path +from dotenv import load_dotenv +import os, sys, json, pymysql + +project_root = Path(sys.argv[1]).resolve() +dataset_id = int(sys.argv[2]) +expected_root = str(Path(sys.argv[3]).resolve()) + +load_dotenv(dotenv_path=project_root / ".env") + +conn = pymysql.connect( + host=os.getenv("CM93_DB_HOST", "127.0.0.1"), + port=int(os.getenv("CM93_DB_PORT", "3306")), + user=os.getenv("CM93_DB_USER", "root"), + password=os.getenv("CM93_DB_PASSWORD", ""), + database=os.getenv("CM93_DB_NAME", "cm93_chart"), + charset=os.getenv("CM93_DB_CHARSET", "utf8mb4"), + cursorclass=pymysql.cursors.DictCursor, +) + +try: + with conn.cursor() as cur: + cur.execute( + """ + SELECT d.id,d.name,d.source_root, + COUNT(c.id) cells, + SUM(c.import_status='DONE') done_cells, + SUM(c.import_status='FAILED') failed_cells + FROM chart_dataset d + LEFT JOIN chart_cell c ON c.dataset_id=d.id + WHERE d.id=%s + GROUP BY d.id,d.name,d.source_root + """, + (dataset_id,), + ) + row = cur.fetchone() + if not row: + raise RuntimeError(f"dataset {dataset_id} not found") + + actual_root = str(Path(row["source_root"]).resolve()) + + result = { + "id": int(row["id"]), + "name": row["name"], + "source_root": actual_root, + "cells": int(row["cells"] or 0), + "done_cells": int(row["done_cells"] or 0), + "failed_cells": int(row["failed_cells"] or 0), + } + + if actual_root.lower() != expected_root.lower(): + raise RuntimeError( + f"source_root mismatch: {actual_root} != {expected_root}" + ) + + print(json.dumps(result, ensure_ascii=False)) +finally: + conn.close() +'@ | Set-Content $Helper -Encoding UTF8 + + $DatasetText = ( + & $Python $Helper $ProjectRoot $DatasetId $SourceRoot | + Out-String + ).Trim() + + if ($LASTEXITCODE -ne 0) { + throw "Dataset verification failed" + } + + $Dataset = $DatasetText | ConvertFrom-Json + + if ([int]$Dataset.cells -ne $ExpectedCells -or + [int]$Dataset.done_cells -ne $ExpectedCells -or + [int]$Dataset.failed_cells -ne 0) { + throw "Dataset state mismatch: $DatasetText" + } + + Write-Host $DatasetText + +} +finally { + Remove-Item $Tmp -Recurse -Force -ErrorAction SilentlyContinue +} + +# ---------------------------------------------------------------------- +# 2. Re-run gap audit and closure with the new dataset-specific disposition +# ---------------------------------------------------------------------- + +Run "STEP 2A - Re-run global mapping gap audit" { + & $Python ".\tools\cm95_global_mapping_gap_audit_v1.py" ` + --dataset-id $DatasetId ` + --mapping $Mapping ` + --output $GapAudit +} + +Run "STEP 2B - Close 25 new Japan gap variants" { + & $Python ".\tools\cm95_global_mapping_gap_closure_audit_v2.py" ` + --gap-audit $GapAudit ` + --mapping $Mapping ` + --disposition $Disposition ` + --output $Closure +} + +$C = Get-Content $Closure -Raw | ConvertFrom-Json + +if ([string]$C.overall -ne "PASS") { + throw "Mapping gap closure is not PASS" +} +if (@($C.unclassified_variants).Count -ne 0) { + throw "Unclassified variants remain" +} +if ([int]$C.observed_gap_variants -ne 165) { + throw "Unexpected gap variant count: $($C.observed_gap_variants)" +} +if (@($C.pending_semantic_review).Count -ne 137) { + throw "Unexpected pending variant count: $(@($C.pending_semantic_review).Count)" +} +if ([int]$C.pending_semantic_review_feature_rows -ne 90009) { + throw "Unexpected pending rows: $($C.pending_semantic_review_feature_rows)" +} + +Write-Host "" +Write-Host "Expected closure confirmed:" +Write-Host " observed = 165" +Write-Host " unclassified = 0" +Write-Host " pending = 137" +Write-Host " pending rows = 90009" +Write-Host " overall = PASS" + +# ---------------------------------------------------------------------- +# 3. Static mapping/style/sprite contract +# ---------------------------------------------------------------------- + +Run "STEP 3 - Mapping / Style / Sprite static contract" { + & $Python ".\tools\cm95_mapping_contract_check_v1.py" ` + --mapping $Mapping ` + --style ".\config\style\style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json" ` + --sprite-json ".\config\sprite\semantic-sprite-20260808.json" ` + --output $MappingContract +} + +$MC = Get-Content $MappingContract -Raw | ConvertFrom-Json +if ([string]$MC.overall -ne "PASS") { + throw "Mapping/style/sprite contract failed" +} + +# ---------------------------------------------------------------------- +# 4. Full-detail policy hard gate: G=7500 must be in z12 +# ---------------------------------------------------------------------- + +Step "STEP 4 - Japan full-detail policy check" + +$PolicyObj = Get-Content $Policy -Raw | + & $Python -c "import sys,yaml,json; print(json.dumps(yaml.safe_load(sys.stdin.read())))" | + ConvertFrom-Json + +# No multi-line Python is passed here; only a fixed one-line expression. +$Enum12 = @($PolicyObj.enumeration_scales.'12') +$Ladder12 = @($PolicyObj.scale_ladders.'12') + +if (7500 -notin $Enum12 -or + $Ladder12.Count -eq 0 -or + [int]$Ladder12[0] -ne 7500) { + throw "Japan full-detail policy does not prioritize G=7500 at z12" +} + +Write-Host "z12 enumeration : $($Enum12 -join ', ')" +Write-Host "z12 ladder : $($Ladder12 -join ', ')" +Write-Host "G=7500 gate : PASS" + +# ---------------------------------------------------------------------- +# 5. Reset PBF-side outputs only. MySQL remains untouched. +# ---------------------------------------------------------------------- + +Step "STEP 5 - Reset PBF-side outputs only" + +Remove-Item ".\build\releases" -Recurse -Force -ErrorAction SilentlyContinue +Remove-Item $Manifest -Force -ErrorAction SilentlyContinue +Remove-Item $Plan -Force -ErrorAction SilentlyContinue +Remove-Item $PlanAudit -Force -ErrorAction SilentlyContinue + +New-Item -ItemType Directory -Force -Path ".\build\releases" | Out-Null + +# ---------------------------------------------------------------------- +# 6. Fresh deterministic FID manifest +# ---------------------------------------------------------------------- + +Run "STEP 6 - Build fresh FID manifest" { + & $Cm95Pbf build-fid-manifest ` + --dataset-id $DatasetId ` + --manifest $Manifest ` + --rebuild-fid-manifest +} + +# ---------------------------------------------------------------------- +# 7. Fresh production plan using G=7500-aware z12 policy +# ---------------------------------------------------------------------- + +Run "STEP 7A - plan-production z0-z12 Japan full detail" { + & $Cm95Pbf plan-production ` + --dataset-id $DatasetId ` + --zooms 0-12 ` + --profile delivery ` + --mapping $Mapping ` + --policy $Policy ` + --manifest $Manifest ` + --output $Plan +} + +Run "STEP 7B - production plan audit" { + & $Python ".\tools\cm95_production_plan_audit_v1.py" ` + --plan $Plan ` + --expected-zooms 0-12 ` + --output $PlanAudit +} + +$PA = Get-Content $PlanAudit -Raw | ConvertFrom-Json +if ([string]$PA.overall -ne "PASS") { + throw "Production plan audit failed" +} + +$PlanObj = Get-Content $Plan -Raw | ConvertFrom-Json +$ReleaseId = [string]$PlanObj.release_id + +Write-Host "" +Write-Host "Plan ID : $($PlanObj.plan_id)" +Write-Host "Release ID : $ReleaseId" +Write-Host "Jobs : $($PlanObj.job_count)" + +# ---------------------------------------------------------------------- +# 8. Full production build +# ---------------------------------------------------------------------- + +Run "STEP 8 - Full PBF production build" { + & $Cm95Pbf build-production ` + --plan $Plan ` + --release-root ".\build\releases" ` + --workers $Workers ` + --max-attempts 3 +} + +# ---------------------------------------------------------------------- +# 9. Status +# ---------------------------------------------------------------------- + +Step "STEP 9 - Production status" + +$StatusText = ( + & $Cm95Pbf status-production ` + --plan $Plan ` + --release-root ".\build\releases" | + Out-String +).Trim() + +if ($LASTEXITCODE -ne 0) { + throw "status-production failed" +} + +Write-Host $StatusText + +$S = $StatusText | ConvertFrom-Json + +$Pass = StateCount $S.states "PASS" +$Fail = StateCount $S.states "FAILED" +$Pending = StateCount $S.states "PENDING" +$Running = StateCount $S.states "RUNNING" + +if ($Pass -ne [int]$S.jobs -or + $Fail -ne 0 -or + $Pending -ne 0 -or + $Running -ne 0) { + throw "Production state gate failed" +} + +# ---------------------------------------------------------------------- +# 10. Final release gate +# ---------------------------------------------------------------------- + +Run "STEP 10 - Finalize production release" { + & $Cm95Pbf finalize-production ` + --plan $Plan ` + --release-root ".\build\releases" ` + --style ".\config\style\style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json" ` + --sprite-json ".\config\sprite\semantic-sprite-20260808.json" ` + --gap-disposition $Disposition +} + +$ReleaseManifest = ".\build\releases\$ReleaseId\release_manifest_v1.json" + +if (-not (Test-Path $ReleaseManifest)) { + throw "Release manifest missing: $ReleaseManifest" +} + +$Final = Get-Content $ReleaseManifest -Raw | ConvertFrom-Json + +if ([string]$Final.status -ne "PASS") { + throw "Final release status is not PASS" +} + +Step "JAPAN CONTINUATION COMPLETE / PASS" + +Write-Host "Dataset ID : $DatasetId" +Write-Host "Release ID : $ReleaseId" +Write-Host "Jobs : $($S.jobs)" +Write-Host "PBF files : $($S.pbf_files)" +Write-Host "Output features : $($S.output_features)" +Write-Host "Semantic status : $($Final.semantic_completeness)" +Write-Host "Pending variants : 137" +Write-Host "Pending rows : 90009" +Write-Host "" +Write-Host "Web test:" +Write-Host " cd `"$ProjectRoot`"" +Write-Host " & `".\.venv\Scripts\python.exe`" .\web\cm95_web.py --release-id `"$ReleaseId`"" diff --git a/scripts/cm95_japan_full_rebuild_pipeline.ps1 b/scripts/cm95_japan_full_rebuild_pipeline.ps1 new file mode 100644 index 0000000..06edc34 --- /dev/null +++ b/scripts/cm95_japan_full_rebuild_pipeline.ps1 @@ -0,0 +1,946 @@ +param( + [string]$ProjectRoot = "D:\React\cm93-mysql-importer-starter", + [string]$SourceRoot = "D:\Ship\CM93V2\CM93JAPAN", + [int]$ExpectedCells = 1492, + [int]$Workers = 4, + [switch]$Force +) + +# CM95 Japan Full Rebuild Pipeline v2 +# +# 从零重建: +# CM93 source -> fresh MySQL -> audit -> mapping gates +# -> fresh FID manifest -> fresh production plan +# -> full PBF build -> final release gate +# +# Windows 11 / PowerShell +# +# 破坏性范围: +# - DROP .env 中 CM93_DB_NAME 整个数据库 +# - 删除旧 build\production +# - 删除旧 build\releases +# - 删除旧 build\pbf +# - 删除旧 build\pbf-reports +# - 删除旧 build\cm95_fid_manifest*.sqlite* +# +# 不会删除: +# - D:\Ship\CM93V2\CM93JAPAN +# - src\ +# - config\ +# - web\ +# - logs\ 历史文件 +# +# v2 修正: +# - 禁止 python.exe -c 多行代码,避免 Windows/PowerShell 引号损坏 +# - 临时 Python helper 一律落盘执行 +# - audit JSON gate 对齐当前 cm93db AuditResult +# - geometry_validity_issues 保持 informational +# - status JSON 使用 Out-String 后再 ConvertFrom-Json +# - 生成当前 Dataset 专属 semantic disposition summary +# +# 如果新 Dataset 出现未分类 mapping gap,会在 PBF build 前 STOP。 + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +function Write-Step { + param([string]$Text) + Write-Host "" + Write-Host "======================================================================" + Write-Host $Text + Write-Host "======================================================================" +} + +function Invoke-Checked { + param( + [string]$Label, + [scriptblock]$Action + ) + + Write-Step $Label + + & $Action + $ExitCode = $LASTEXITCODE + + if ($null -ne $ExitCode -and $ExitCode -ne 0) { + throw "$Label FAILED (exit code=$ExitCode)" + } +} + +function Remove-PathIfExists { + param([string]$PathValue) + + if (Test-Path $PathValue) { + Write-Host "DELETE: $PathValue" + Remove-Item $PathValue -Recurse -Force + } +} + +function Get-StateCount { + param( + [object]$States, + [string]$Name + ) + + if ($null -eq $States) { + return 0 + } + + $Prop = $States.PSObject.Properties[$Name] + if ($null -eq $Prop) { + return 0 + } + + return [int]$Prop.Value +} + +if (-not (Test-Path $ProjectRoot -PathType Container)) { + throw "ProjectRoot 不存在: $ProjectRoot" +} + +if (-not (Test-Path $SourceRoot -PathType Container)) { + throw "SourceRoot 不存在: $SourceRoot" +} + +Set-Location $ProjectRoot + +$ProjectRoot = (Resolve-Path $ProjectRoot).Path +$SourceRoot = (Resolve-Path $SourceRoot).Path + +$Python = Join-Path $ProjectRoot ".venv\Scripts\python.exe" +$Cm93Db = Join-Path $ProjectRoot ".venv\Scripts\cm93db.exe" +$Cm95Pbf = Join-Path $ProjectRoot ".venv\Scripts\cm95pbf.exe" +$EnvPath = Join-Path $ProjectRoot ".env" + +foreach ($RequiredExe in @($Python, $Cm93Db, $Cm95Pbf)) { + if (-not (Test-Path $RequiredExe -PathType Leaf)) { + throw "缺少运行文件: $RequiredExe" + } +} + +if (-not (Test-Path $EnvPath -PathType Leaf)) { + throw "缺少项目 .env: $EnvPath" +} + +# 临时 helper 放系统 TEMP,不受 build 清理影响。 +$TempRoot = Join-Path $env:TEMP ("cm95_japan_pipeline_v2_" + $PID) + +Remove-Item $TempRoot -Recurse -Force -ErrorAction SilentlyContinue +New-Item -ItemType Directory -Path $TempRoot -Force | Out-Null + +try { + +# ---------------------------------------------------------------------- +# STEP 0 - Source hard gate +# ---------------------------------------------------------------------- + +Write-Step "STEP 0 - Japan CM93 源目录检查" + +$RequiredRegions = @( + "03300360", + "03300420", + "03900360", + "03900420" +) + +$ActualRegions = @( + Get-ChildItem $SourceRoot -Directory -ErrorAction Stop | + Where-Object { $_.Name -match '^\d{8}$' } | + ForEach-Object { $_.Name } | + Sort-Object +) + +$MissingRegions = @( + $RequiredRegions | + Where-Object { $_ -notin $ActualRegions } +) + +$ExtraRegions = @( + $ActualRegions | + Where-Object { $_ -notin $RequiredRegions } +) + +Write-Host "SourceRoot:" +Write-Host " $SourceRoot" +Write-Host "" +Write-Host "Numeric regions:" +$ActualRegions | ForEach-Object { Write-Host " $_" } + +if ($MissingRegions.Count -gt 0) { + throw "缺少 Japan 必需区域: $($MissingRegions -join ', ')" +} + +if ($ExtraRegions.Count -gt 0) { + throw "发现 Japan 工作集之外的数字区域,停止: $($ExtraRegions -join ', ')" +} + +if (-not (Test-Path (Join-Path $SourceRoot "CM93OBJ.DIC"))) { + throw "缺少 CM93OBJ.DIC" +} + +$HasAttrDic = + (Test-Path (Join-Path $SourceRoot "CM93ATTR.DIC")) -or + (Test-Path (Join-Path $SourceRoot "ATTRLUT.DIC")) + +if (-not $HasAttrDic) { + throw "缺少 CM93ATTR.DIC / ATTRLUT.DIC" +} + +Write-Host "" +Write-Host "Japan source region gate: PASS" + +# ---------------------------------------------------------------------- +# STEP 1 - Current code baseline + read-only checks +# ---------------------------------------------------------------------- + +Invoke-Checked "STEP 1A - pip install -e ." { + & $Python -m pip install -e . +} + +if (-not (Test-Path ".\tools\cm95_v1_4_5_preflight.py")) { + throw "缺少 tools\cm95_v1_4_5_preflight.py;当前项目不是 v1.4.5 baseline" +} + +Invoke-Checked "STEP 1B - CM95 v1.4.5 preflight" { + & $Python ".\tools\cm95_v1_4_5_preflight.py" +} + +Invoke-Checked "STEP 1C - CM93 scan" { + & $Cm93Db scan $SourceRoot +} + +Invoke-Checked "STEP 1D - CM93 dictionaries" { + & $Cm93Db inspect-dicts $SourceRoot +} + +# ---------------------------------------------------------------------- +# STEP 2 - Read DB config with a real helper .py file +# ---------------------------------------------------------------------- + +$ReadDbInfoPy = Join-Path $TempRoot "read_db_info.py" + +@' +from __future__ import annotations + +import json +import os +import sys +from pathlib import Path + +from dotenv import load_dotenv + +env_path = Path(sys.argv[1]).resolve() +load_dotenv(dotenv_path=env_path) + +result = { + "host": os.getenv("CM93_DB_HOST", "127.0.0.1"), + "port": int(os.getenv("CM93_DB_PORT", "3306")), + "database": (os.getenv("CM93_DB_NAME", "cm93_chart") or "").strip(), + "user": os.getenv("CM93_DB_USER", "root"), + "charset": os.getenv("CM93_DB_CHARSET", "utf8mb4"), +} + +if not result["database"]: + raise SystemExit("CM93_DB_NAME is empty") + +print(json.dumps(result, ensure_ascii=False)) +'@ | Set-Content $ReadDbInfoPy -Encoding UTF8 + +$DbInfoText = (& $Python $ReadDbInfoPy $EnvPath | Out-String).Trim() + +if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($DbInfoText)) { + throw "无法读取数据库配置" +} + +$DbInfo = $DbInfoText | ConvertFrom-Json +$DbName = [string]$DbInfo.database + +$ForbiddenDbNames = @( + "mysql", + "information_schema", + "performance_schema", + "sys" +) + +if ($DbName.ToLowerInvariant() -in $ForbiddenDbNames) { + throw "拒绝删除系统数据库: $DbName" +} + +Write-Step "STEP 2 - DESTRUCTIVE RESET CONFIRMATION" + +Write-Host "将永久删除整个 MySQL database:" +Write-Host " $DbName" +Write-Host "" +Write-Host "数据库服务器:" +Write-Host " $($DbInfo.host):$($DbInfo.port)" +Write-Host "" +Write-Host "也会删除旧 CM95 build/release 产物。" +Write-Host "" +Write-Host "不会删除 CM93 source:" +Write-Host " $SourceRoot" + +if (-not $Force) { + $Expected = "DELETE $DbName" + $Answer = Read-Host "请输入 [$Expected] 继续" + + if ($Answer -ne $Expected) { + throw "用户取消。" + } +} +else { + Write-Host "-Force 已指定,跳过交互确认。" +} + +# ---------------------------------------------------------------------- +# STEP 3 - Delete old generated artifacts +# ---------------------------------------------------------------------- + +Write-Step "STEP 3 - 删除旧 CM95 build/release 产物" + +Remove-PathIfExists (Join-Path $ProjectRoot "build\production") +Remove-PathIfExists (Join-Path $ProjectRoot "build\releases") +Remove-PathIfExists (Join-Path $ProjectRoot "build\pbf") +Remove-PathIfExists (Join-Path $ProjectRoot "build\pbf-reports") + +$BuildRoot = Join-Path $ProjectRoot "build" + +if (Test-Path $BuildRoot) { + Get-ChildItem $BuildRoot -File -Filter "cm95_fid_manifest*.sqlite*" -ErrorAction SilentlyContinue | + ForEach-Object { + Write-Host "DELETE: $($_.FullName)" + Remove-Item $_.FullName -Force + } +} + +New-Item -ItemType Directory -Force -Path ".\build\production" | Out-Null +New-Item -ItemType Directory -Force -Path ".\logs" | Out-Null + +# ---------------------------------------------------------------------- +# STEP 4 - DROP database using helper file, then let cm93db recreate schema +# ---------------------------------------------------------------------- + +$DropDbPy = Join-Path $TempRoot "drop_cm93_database.py" + +@' +from __future__ import annotations + +import os +import re +import sys +from pathlib import Path + +import pymysql +from dotenv import load_dotenv + +env_path = Path(sys.argv[1]).resolve() +load_dotenv(dotenv_path=env_path) + +host = os.getenv("CM93_DB_HOST", "127.0.0.1") +port = int(os.getenv("CM93_DB_PORT", "3306")) +user = os.getenv("CM93_DB_USER", "root") +password = os.getenv("CM93_DB_PASSWORD", "") +database = (os.getenv("CM93_DB_NAME", "cm93_chart") or "").strip() +charset = os.getenv("CM93_DB_CHARSET", "utf8mb4") + +if not database: + raise RuntimeError("CM93_DB_NAME is empty") + +if database.lower() in { + "mysql", + "information_schema", + "performance_schema", + "sys", +}: + raise RuntimeError(f"refuse to drop system database: {database}") + +conn = pymysql.connect( + host=host, + port=port, + user=user, + password=password, + charset=charset, + autocommit=False, + cursorclass=pymysql.cursors.DictCursor, +) + +try: + with conn.cursor() as cur: + cur.execute("SELECT VERSION() AS v") + version = str(cur.fetchone()["v"]) + + match = re.match(r"^(\d+)\.(\d+)\.(\d+)", version) + if not match or tuple(map(int, match.groups()[:2])) != (5, 7): + raise RuntimeError( + f"expected MySQL 5.7.x, got {version}; refusing destructive reset" + ) + + safe = database.replace("`", "``") + cur.execute(f"DROP DATABASE IF EXISTS `{safe}`") + + conn.commit() + print(f"DROP_DATABASE_OK database={database} mysql={version}") + +finally: + conn.close() +'@ | Set-Content $DropDbPy -Encoding UTF8 + +Invoke-Checked "STEP 4A - DROP old database" { + & $Python $DropDbPy $EnvPath +} + +Invoke-Checked "STEP 4B - CREATE database + initialize schema" { + & $Cm93Db db-init --create-database +} + +Invoke-Checked "STEP 4C - DB contract check" { + & $Cm93Db db-check +} + +# ---------------------------------------------------------------------- +# STEP 5 - Full import on fresh DB +# ---------------------------------------------------------------------- + +Invoke-Checked "STEP 5 - 全量 CM93 Japan import(fresh DB)" { + & $Cm93Db import $SourceRoot --fail-fast +} + +# ---------------------------------------------------------------------- +# STEP 6 - Full audit +# ---------------------------------------------------------------------- + +$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss" +$AuditReport = ".\logs\cm93_audit_japan_full_rebuild_$Timestamp.json" + +Invoke-Checked "STEP 6 - CM93 full audit + geometry validation" { + & $Cm93Db audit ` + $SourceRoot ` + --validate-geometry ` + --report $AuditReport +} + +$Audit = Get-Content $AuditReport -Raw | ConvertFrom-Json + +if (-not [bool]$Audit.passed) { + throw "CM93 audit report passed=false;检查 $AuditReport" +} + +$AuditHardFailures = @( + [int64]$Audit.source_parse_failed, + [int64]$Audit.db_missing_cells, + [int64]$Audit.db_not_done_cells, + [int64]$Audit.count_mismatches, + [int64]$Audit.hash_mismatches, + [int64]$Audit.raw_preservation_mismatches, + [int64]$Audit.unknown_objects, + [int64]$Audit.unknown_attributes, + [int64]$Audit.precision_failed +) + +if (($AuditHardFailures | Measure-Object -Sum).Sum -ne 0) { + throw "CM93 audit hard gate failed;检查 $AuditReport" +} + +if ($ExpectedCells -gt 0 -and [int]$Audit.source_cells -ne $ExpectedCells) { + throw "Source cell count 不符合当前 Japan baseline: $($Audit.source_cells) != $ExpectedCells" +} + +Write-Host "" +Write-Host "CM93 AUDIT HARD GATE: PASS" +Write-Host "Source cells : $($Audit.source_cells)" +Write-Host "Geometry validity issues : $($Audit.geometry_validity_issues) (informational)" + +# ---------------------------------------------------------------------- +# STEP 7 - Resolve fresh Dataset +# ---------------------------------------------------------------------- + +$DatasetInfoPy = Join-Path $TempRoot "dataset_info.py" + +@' +from __future__ import annotations + +import json +import os +import sys +from pathlib import Path + +import pymysql +from dotenv import load_dotenv + +env_path = Path(sys.argv[1]).resolve() +source_root = str(Path(sys.argv[2]).resolve()) + +load_dotenv(dotenv_path=env_path) + +conn = pymysql.connect( + host=os.getenv("CM93_DB_HOST", "127.0.0.1"), + port=int(os.getenv("CM93_DB_PORT", "3306")), + user=os.getenv("CM93_DB_USER", "root"), + password=os.getenv("CM93_DB_PASSWORD", ""), + database=os.getenv("CM93_DB_NAME", "cm93_chart"), + charset=os.getenv("CM93_DB_CHARSET", "utf8mb4"), + cursorclass=pymysql.cursors.DictCursor, +) + +try: + with conn.cursor() as cur: + cur.execute("SELECT COUNT(*) AS n FROM chart_dataset") + dataset_count = int(cur.fetchone()["n"]) + + cur.execute( + """ + SELECT + d.id, + d.name, + d.source_root, + COUNT(c.id) AS cells, + SUM(c.import_status='DONE') AS done_cells, + SUM(c.import_status='FAILED') AS failed_cells + FROM chart_dataset d + LEFT JOIN chart_cell c + ON c.dataset_id=d.id + WHERE d.source_type='CM93' + AND d.source_root=%s + GROUP BY d.id,d.name,d.source_root + """, + (source_root,), + ) + rows = cur.fetchall() + + if dataset_count != 1: + raise RuntimeError( + f"fresh DB expected exactly 1 dataset, got {dataset_count}" + ) + + if len(rows) != 1: + raise RuntimeError( + f"expected one dataset for source_root={source_root}, got {len(rows)}" + ) + + row = rows[0] + + print( + json.dumps( + { + "id": int(row["id"]), + "name": row["name"], + "source_root": row["source_root"], + "cells": int(row["cells"] or 0), + "done_cells": int(row["done_cells"] or 0), + "failed_cells": int(row["failed_cells"] or 0), + }, + ensure_ascii=False, + ) + ) + +finally: + conn.close() +'@ | Set-Content $DatasetInfoPy -Encoding UTF8 + +$DatasetText = (& $Python $DatasetInfoPy $EnvPath $SourceRoot | Out-String).Trim() + +if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($DatasetText)) { + throw "无法读取 fresh Dataset 信息" +} + +$Dataset = $DatasetText | ConvertFrom-Json +$DatasetId = [int]$Dataset.id + +if ([int]$Dataset.cells -ne [int]$Audit.source_cells) { + throw "DB cell count != audit source_cells ($($Dataset.cells) != $($Audit.source_cells))" +} + +if ([int]$Dataset.done_cells -ne [int]$Audit.source_cells) { + throw "不是所有 Cell 都 DONE" +} + +if ([int]$Dataset.failed_cells -ne 0) { + throw "存在 FAILED Cell" +} + +Write-Step "STEP 7 - Fresh Dataset confirmed" + +Write-Host "Dataset ID : $DatasetId" +Write-Host "Name : $($Dataset.name)" +Write-Host "SourceRoot : $($Dataset.source_root)" +Write-Host "Cells : $($Dataset.cells)" +Write-Host "DONE : $($Dataset.done_cells)" +Write-Host "FAILED : $($Dataset.failed_cells)" + +# ---------------------------------------------------------------------- +# STEP 8 - Dataset-aware mapping gates +# ---------------------------------------------------------------------- + +$GapAudit = ".\build\production\cm95_global_mapping_gap_audit_dataset_${DatasetId}.json" +$GapClosure = ".\build\production\cm95_global_mapping_gap_closure_dataset_${DatasetId}.json" +$MappingContract = ".\build\production\cm95_mapping_contract_check_dataset_${DatasetId}.json" + +Invoke-Checked "STEP 8A - Global mapping gap audit (fresh Dataset)" { + & $Python ".\tools\cm95_global_mapping_gap_audit_v1.py" ` + --dataset-id $DatasetId ` + --mapping ".\config\mappings\cm95_to_navsea_v1.yaml" ` + --output $GapAudit +} + +Invoke-Checked "STEP 8B - Mapping gap classification closure" { + & $Python ".\tools\cm95_global_mapping_gap_closure_audit_v2.py" ` + --gap-audit $GapAudit ` + --mapping ".\config\mappings\cm95_to_navsea_v1.yaml" ` + --disposition ".\config\mappings\cm95_gap_disposition_v1.yaml" ` + --output $GapClosure +} + +$Closure = Get-Content $GapClosure -Raw | ConvertFrom-Json + +if ([string]$Closure.overall -ne "PASS") { + Write-Host "" + Write-Host "NEW DATASET MAPPING GATE STOPPED PIPELINE." + Write-Host "新 Japan Dataset 有当前 disposition 尚未收口的 gap variant。" + Write-Host "" + Write-Host "检查:" + Write-Host " $GapAudit" + Write-Host " $GapClosure" + throw "Mapping gap closure FAIL;PBF generation intentionally stopped." +} + +Invoke-Checked "STEP 8C - Mapping / Style / Sprite static contract" { + & $Python ".\tools\cm95_mapping_contract_check_v1.py" ` + --mapping ".\config\mappings\cm95_to_navsea_v1.yaml" ` + --style ".\config\style\style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json" ` + --sprite-json ".\config\sprite\semantic-sprite-20260808.json" ` + --output $MappingContract +} + +$MapContract = Get-Content $MappingContract -Raw | ConvertFrom-Json + +if ([string]$MapContract.overall -ne "PASS") { + throw "Mapping / Style / Sprite static contract FAIL" +} + +# ---------------------------------------------------------------------- +# STEP 8D - Build Dataset-specific effective gap disposition +# ---------------------------------------------------------------------- + +$EffectiveDisposition = ".\build\production\cm95_gap_disposition_dataset_${DatasetId}_effective.yaml" +$EffectiveDispositionPy = Join-Path $TempRoot "build_effective_disposition.py" + +@' +from __future__ import annotations + +import copy +import sys +from pathlib import Path + +import yaml + +template_path = Path(sys.argv[1]) +gap_path = Path(sys.argv[2]) +closure_path = Path(sys.argv[3]) +dataset_id = int(sys.argv[4]) +out_path = Path(sys.argv[5]) + +template = yaml.safe_load(template_path.read_text(encoding="utf-8")) or {} +gap = yaml.safe_load(gap_path.read_text(encoding="utf-8")) or {} +closure = yaml.safe_load(closure_path.read_text(encoding="utf-8")) or {} + +template_by_key = { + ( + str(v.get("object_class") or ""), + str(v.get("geometry_type") or "").upper(), + ): v + for v in template.get("variants") or [] + if isinstance(v, dict) +} + +effective_variants = [] + +for item in gap.get("gap_variants") or []: + key = ( + str(item.get("object_class") or ""), + str(item.get("geometry_type") or "").upper(), + ) + + src = template_by_key.get(key) + if src is None: + raise RuntimeError( + f"unclassified gap variant while building effective disposition: {key}" + ) + + row = copy.deepcopy(src) + row["object_class"] = key[0] + row["geometry_type"] = key[1] + row["feature_count"] = int(item.get("feature_count") or 0) + + if item.get("object_class_id") is not None: + row["object_class_id"] = item.get("object_class_id") + + if item.get("dictionary_description") is not None: + row["dictionary_description"] = item.get("dictionary_description") + + if item.get("gap_reason") is not None: + row["gap_reason_v1"] = item.get("gap_reason") + + effective_variants.append(row) + +pending = [ + v for v in effective_variants + if str(v.get("disposition") or "") + == "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW" +] + +delivery = [ + v for v in effective_variants + if str(v.get("disposition") or "") + == "DELIVERY_MAPPED_V1_4_3" +] + +existing = [ + v for v in effective_variants + if str(v.get("disposition") or "").startswith("EXISTING_") +] + +result = { + "schema": "navsea.cm95.gap-disposition/v1", + "version": "v1.4.5-dataset-effective", + "dataset_id": dataset_id, + "source_audit": str(gap_path), + "policy": ( + "Dataset-specific effective disposition generated from " + "cm95_gap_disposition_v1.yaml after current-dataset closure PASS." + ), + "summary": { + "observed_gap_variants": len(effective_variants), + "delivery_mapped_v1_4_3": len(delivery), + "existing_explicit_non_delivery": len(existing), + "pending_semantic_review": len(pending), + "delivery_mapped_v1_4_3_feature_rows": sum( + int(v.get("feature_count") or 0) for v in delivery + ), + "existing_explicit_non_delivery_feature_rows": sum( + int(v.get("feature_count") or 0) for v in existing + ), + "pending_semantic_review_feature_rows": sum( + int(v.get("feature_count") or 0) for v in pending + ), + }, + "variants": effective_variants, +} + +out_path.parent.mkdir(parents=True, exist_ok=True) +out_path.write_text( + yaml.safe_dump( + result, + allow_unicode=True, + sort_keys=False, + width=120, + ), + encoding="utf-8", +) + +print(f"Effective disposition: {out_path}") +print(f"Observed gap variants : {len(effective_variants)}") +print(f"Pending review : {len(pending)}") +print( + "Pending rows : " + f"{result['summary']['pending_semantic_review_feature_rows']}" +) +'@ | Set-Content $EffectiveDispositionPy -Encoding UTF8 + +Invoke-Checked "STEP 8D - Dataset-specific semantic disposition summary" { + & $Python $EffectiveDispositionPy ` + ".\config\mappings\cm95_gap_disposition_v1.yaml" ` + $GapAudit ` + $GapClosure ` + $DatasetId ` + $EffectiveDisposition +} + +# ---------------------------------------------------------------------- +# STEP 9 - Fresh deterministic FID manifest +# ---------------------------------------------------------------------- + +$Manifest = ".\build\cm95_fid_manifest_dataset_${DatasetId}_v1.sqlite" + +Invoke-Checked "STEP 9 - Rebuild FID manifest from zero" { + & $Cm95Pbf build-fid-manifest ` + --dataset-id $DatasetId ` + --manifest $Manifest ` + --rebuild-fid-manifest +} + +# ---------------------------------------------------------------------- +# STEP 10 - Fresh immutable production plan +# ---------------------------------------------------------------------- + +$Plan = ".\build\production\cm95_production_plan_dataset_${DatasetId}_v1_4_5.json" +$PlanAudit = ".\build\production\cm95_production_plan_audit_dataset_${DatasetId}_v1_4_5.json" + +Invoke-Checked "STEP 10A - plan-production z0-z12" { + & $Cm95Pbf plan-production ` + --dataset-id $DatasetId ` + --zooms 0-12 ` + --profile delivery ` + --manifest $Manifest ` + --output $Plan +} + +Invoke-Checked "STEP 10B - production plan audit" { + & $Python ".\tools\cm95_production_plan_audit_v1.py" ` + --plan $Plan ` + --expected-zooms 0-12 ` + --output $PlanAudit +} + +$PlanObj = Get-Content $Plan -Raw | ConvertFrom-Json +$PlanAuditObj = Get-Content $PlanAudit -Raw | ConvertFrom-Json + +if ([string]$PlanAuditObj.overall -ne "PASS") { + throw "Production plan audit FAIL" +} + +$ReleaseId = [string]$PlanObj.release_id + +if ([string]::IsNullOrWhiteSpace($ReleaseId)) { + throw "Plan 没有 release_id" +} + +Write-Host "" +Write-Host "Plan ID : $($PlanObj.plan_id)" +Write-Host "Release ID : $ReleaseId" +Write-Host "Jobs : $($PlanObj.job_count)" + +# ---------------------------------------------------------------------- +# STEP 11 - Full PBF build +# ---------------------------------------------------------------------- + +Invoke-Checked "STEP 11 - build-production FULL" { + & $Cm95Pbf build-production ` + --plan $Plan ` + --release-root ".\build\releases" ` + --workers $Workers ` + --max-attempts 3 +} + +# ---------------------------------------------------------------------- +# STEP 12 - Production status +# ---------------------------------------------------------------------- + +Write-Step "STEP 12 - Production status" + +$StatusText = ( + & $Cm95Pbf status-production ` + --plan $Plan ` + --release-root ".\build\releases" | + Out-String +).Trim() + +if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($StatusText)) { + throw "status-production FAILED" +} + +Write-Host $StatusText + +$Status = $StatusText | ConvertFrom-Json +$States = $Status.states + +$PassCount = Get-StateCount $States "PASS" +$FailedCount = Get-StateCount $States "FAILED" +$PendingCount = Get-StateCount $States "PENDING" +$RunningCount = Get-StateCount $States "RUNNING" + +if ($PassCount -ne [int]$Status.jobs -or + $FailedCount -ne 0 -or + $PendingCount -ne 0 -or + $RunningCount -ne 0) { + throw "Production state gate FAIL" +} + +# ---------------------------------------------------------------------- +# STEP 13 - Final release gate +# ---------------------------------------------------------------------- + +Invoke-Checked "STEP 13 - finalize-production" { + & $Cm95Pbf finalize-production ` + --plan $Plan ` + --release-root ".\build\releases" ` + --style ".\config\style\style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json" ` + --sprite-json ".\config\sprite\semantic-sprite-20260808.json" ` + --gap-disposition $EffectiveDisposition +} + +$ReleaseDir = Join-Path $ProjectRoot ("build\releases\" + $ReleaseId) +$ReleaseManifest = Join-Path $ReleaseDir "release_manifest_v1.json" + +if (-not (Test-Path $ReleaseManifest -PathType Leaf)) { + throw "finalize 已运行,但 release manifest 不存在: $ReleaseManifest" +} + +$Final = Get-Content $ReleaseManifest -Raw | ConvertFrom-Json + +if ([string]$Final.status -ne "PASS") { + throw "Final release manifest status != PASS" +} + +# ---------------------------------------------------------------------- +# STEP 14 - Save compact baseline summary +# ---------------------------------------------------------------------- + +$SummaryPath = ".\build\production\CM95_JAPAN_FULL_REBUILD_CURRENT.json" + +$Summary = [ordered]@{ + schema = "navsea.cm95.japan-full-rebuild-pipeline/v2" + completed_at = (Get-Date).ToString("o") + project_root = $ProjectRoot + source_root = $SourceRoot + database = $DbName + dataset_id = $DatasetId + source_cells = [int]$Audit.source_cells + source_geometry_validity_issues = [int]$Audit.geometry_validity_issues + audit_report = $AuditReport + mapping_gap_audit = $GapAudit + mapping_gap_closure = [string]$Closure.overall + effective_gap_disposition = $EffectiveDisposition + semantic_completeness = [string]$Final.semantic_completeness + semantic_backlog = $Final.semantic_backlog + fid_manifest = $Manifest + plan = $Plan + plan_id = [string]$PlanObj.plan_id + release_id = $ReleaseId + release_dir = $ReleaseDir + release_manifest = $ReleaseManifest + jobs = [int]$Status.jobs + pbf_files = [int]$Status.pbf_files + output_features = [int64]$Status.output_features + final_status = [string]$Final.status +} + +$Summary | + ConvertTo-Json -Depth 12 | + Set-Content $SummaryPath -Encoding UTF8 + +Write-Step "PIPELINE COMPLETE / PASS" + +Write-Host "Database : $DbName" +Write-Host "Dataset ID : $DatasetId" +Write-Host "Source cells : $($Audit.source_cells)" +Write-Host "Plan ID : $($PlanObj.plan_id)" +Write-Host "Release ID : $ReleaseId" +Write-Host "Jobs : $($Status.jobs) PASS" +Write-Host "PBF files : $($Status.pbf_files)" +Write-Host "Output features: $($Status.output_features)" +Write-Host "Final status : $($Final.status)" +Write-Host "Semantic : $($Final.semantic_completeness)" +Write-Host "" +Write-Host "Summary:" +Write-Host " $SummaryPath" +Write-Host "" +Write-Host "Release:" +Write-Host " $ReleaseDir" +Write-Host "" +Write-Host "Web test:" +Write-Host " cd `"$ProjectRoot`"" +Write-Host " & `".\.venv\Scripts\python.exe`" .\web\cm95_web.py --release-id `"$ReleaseId`"" + +} +finally { + Remove-Item $TempRoot -Recurse -Force -ErrorAction SilentlyContinue +} diff --git a/scripts/cm95_japan_v1_4_6_continue.ps1 b/scripts/cm95_japan_v1_4_6_continue.ps1 new file mode 100644 index 0000000..7485342 --- /dev/null +++ b/scripts/cm95_japan_v1_4_6_continue.ps1 @@ -0,0 +1,280 @@ +param( + [string]$ProjectRoot = "D:\React\cm93-mysql-importer-starter", + [string]$SourceRoot = "D:\Ship\CM93V2\CM93JAPAN", + [int]$DatasetId = 1, + [int]$ExpectedCells = 1492, + [int]$Workers = 4, + [switch]$SkipQueryEquivalence +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +function Step([string]$Text) { + Write-Host "" + Write-Host "======================================================================" + Write-Host $Text + Write-Host "======================================================================" +} + +function Run([string]$Label, [scriptblock]$Action) { + Step $Label + & $Action + $Code = $LASTEXITCODE + if ($null -ne $Code -and $Code -ne 0) { + throw "$Label FAILED (exit=$Code)" + } +} + +function StateCount($States, [string]$Name) { + if ($null -eq $States) { return 0 } + $P = $States.PSObject.Properties[$Name] + if ($null -eq $P) { return 0 } + return [int]$P.Value +} + +Set-Location $ProjectRoot + +$Python = ".\.venv\Scripts\python.exe" +$Cm95Pbf = ".\.venv\Scripts\cm95pbf.exe" +$Mapping = ".\config\mappings\cm95_to_navsea_v1.yaml" +$Disposition = ".\config\mappings\cm95_gap_disposition_japan_dataset_1_v1.yaml" +$Policy = ".\config\pbf\cm95_tile_policy_japan_full_detail_v1.yaml" +$Manifest = ".\build\cm95_fid_manifest_japan_dataset_1_v1.sqlite" +$GapAudit = ".\build\production\cm95_global_mapping_gap_audit_dataset_1.json" +$Closure = ".\build\production\cm95_global_mapping_gap_closure_dataset_1_v1_4_6.json" +$MappingContract = ".\build\production\cm95_mapping_contract_check_japan_dataset_1_v1_4_6.json" +$Plan = ".\build\production\cm95_production_plan_japan_full_detail_v1_4_6.json" +$PlanAudit = ".\build\production\cm95_production_plan_audit_japan_full_detail_v1_4_6.json" + +foreach ($Path in @($Python,$Cm95Pbf,$Mapping,$Disposition,$Policy)) { + if (-not (Test-Path $Path)) { + throw "Missing required file: $Path" + } +} + +Run "STEP 0A - pip install v1.4.6 editable" { + & $Python -m pip install -e . +} + +Run "STEP 0B - CM95 v1.4.6 preflight" { + & $Python ".\tools\cm95_v1_4_6_preflight.py" +} + +# Verify the existing fresh Japan Dataset. No import / no DROP database. +Step "STEP 1 - Verify existing Japan Dataset" + +$Tmp = Join-Path $env:TEMP ("cm95_japan_v146_" + $PID) +Remove-Item $Tmp -Recurse -Force -ErrorAction SilentlyContinue +New-Item -ItemType Directory -Path $Tmp | Out-Null + +try { + $Helper = Join-Path $Tmp "verify_dataset.py" +@' +from pathlib import Path +from dotenv import load_dotenv +import os, sys, json, pymysql + +project_root = Path(sys.argv[1]).resolve() +dataset_id = int(sys.argv[2]) +expected_root = str(Path(sys.argv[3]).resolve()) +load_dotenv(dotenv_path=project_root / ".env") + +conn = pymysql.connect( + host=os.getenv("CM93_DB_HOST", "127.0.0.1"), + port=int(os.getenv("CM93_DB_PORT", "3306")), + user=os.getenv("CM93_DB_USER", "root"), + password=os.getenv("CM93_DB_PASSWORD", ""), + database=os.getenv("CM93_DB_NAME", "cm93_chart"), + charset=os.getenv("CM93_DB_CHARSET", "utf8mb4"), + cursorclass=pymysql.cursors.DictCursor, +) +try: + with conn.cursor() as cur: + cur.execute( + """ + SELECT d.id,d.name,d.source_root, + COUNT(c.id) cells, + SUM(c.import_status='DONE') done_cells, + SUM(c.import_status='FAILED') failed_cells + FROM chart_dataset d + LEFT JOIN chart_cell c ON c.dataset_id=d.id + WHERE d.id=%s + GROUP BY d.id,d.name,d.source_root + """, + (dataset_id,), + ) + row = cur.fetchone() + if not row: + raise RuntimeError(f"dataset {dataset_id} not found") + actual_root = str(Path(row["source_root"]).resolve()) + if actual_root.lower() != expected_root.lower(): + raise RuntimeError(f"source_root mismatch: {actual_root} != {expected_root}") + print(json.dumps({ + "id": int(row["id"]), + "name": row["name"], + "source_root": actual_root, + "cells": int(row["cells"] or 0), + "done_cells": int(row["done_cells"] or 0), + "failed_cells": int(row["failed_cells"] or 0), + }, ensure_ascii=False)) +finally: + conn.close() +'@ | Set-Content $Helper -Encoding UTF8 + + $DatasetText = (& $Python $Helper $ProjectRoot $DatasetId $SourceRoot | Out-String).Trim() + if ($LASTEXITCODE -ne 0) { throw "Dataset verification failed" } + $Dataset = $DatasetText | ConvertFrom-Json + if ([int]$Dataset.cells -ne $ExpectedCells -or + [int]$Dataset.done_cells -ne $ExpectedCells -or + [int]$Dataset.failed_cells -ne 0) { + throw "Dataset state mismatch: $DatasetText" + } + Write-Host $DatasetText +} +finally { + Remove-Item $Tmp -Recurse -Force -ErrorAction SilentlyContinue +} + +if (-not $SkipQueryEquivalence) { + Run "STEP 2 - v1.4.5 vs v1.4.6 candidate query equivalence + SPATIAL plan" { + & $Python ".\tools\cm95_v1_4_6_query_equivalence.py" ` + --dataset-id $DatasetId + } +} +else { + Step "STEP 2 - Query equivalence SKIPPED by user" +} + +Run "STEP 3A - Re-run mapping gap audit" { + & $Python ".\tools\cm95_global_mapping_gap_audit_v1.py" ` + --dataset-id $DatasetId ` + --mapping $Mapping ` + --output $GapAudit +} + +Run "STEP 3B - Japan gap closure" { + & $Python ".\tools\cm95_global_mapping_gap_closure_audit_v2.py" ` + --gap-audit $GapAudit ` + --mapping $Mapping ` + --disposition $Disposition ` + --output $Closure +} + +$C = Get-Content $Closure -Raw | ConvertFrom-Json +if ([string]$C.overall -ne "PASS") { throw "Mapping gap closure != PASS" } +if (@($C.unclassified_variants).Count -ne 0) { throw "Unclassified gap variants remain" } + +Run "STEP 3C - Mapping / Style / Sprite contract" { + & $Python ".\tools\cm95_mapping_contract_check_v1.py" ` + --mapping $Mapping ` + --style ".\config\style\style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json" ` + --sprite-json ".\config\sprite\semantic-sprite-20260808.json" ` + --output $MappingContract +} + +$MC = Get-Content $MappingContract -Raw | ConvertFrom-Json +if ([string]$MC.overall -ne "PASS") { throw "Mapping/style/sprite contract != PASS" } + +# FID manifest is independent from builder query implementation; reuse when valid. +if (-not (Test-Path $Manifest)) { + Run "STEP 4 - FID manifest missing; rebuild" { + & $Cm95Pbf build-fid-manifest ` + --dataset-id $DatasetId ` + --manifest $Manifest ` + --rebuild-fid-manifest + } +} +else { + Step "STEP 4 - Reuse existing FID manifest" + Write-Host $Manifest +} + +# v1.4.6 builder contract changes the immutable plan hash, so create a NEW plan/release. +Run "STEP 5A - Create NEW v1.4.6 production plan" { + & $Cm95Pbf plan-production ` + --dataset-id $DatasetId ` + --zooms 0-12 ` + --profile delivery ` + --mapping $Mapping ` + --policy $Policy ` + --manifest $Manifest ` + --output $Plan +} + +Run "STEP 5B - Audit v1.4.6 production plan" { + & $Python ".\tools\cm95_production_plan_audit_v1.py" ` + --plan $Plan ` + --expected-zooms 0-12 ` + --output $PlanAudit +} + +$PA = Get-Content $PlanAudit -Raw | ConvertFrom-Json +if ([string]$PA.overall -ne "PASS") { throw "Production plan audit != PASS" } + +$PlanObj = Get-Content $Plan -Raw | ConvertFrom-Json +if ([string]$PlanObj.builder_contract_version -ne "cm95pbf-builder/0.4.6-spatial-candidate-query") { + throw "Wrong builder contract in plan: $($PlanObj.builder_contract_version)" +} + +$ReleaseId = [string]$PlanObj.release_id +Write-Host "" +Write-Host "Plan ID : $($PlanObj.plan_id)" +Write-Host "Release ID : $ReleaseId" +Write-Host "Jobs : $($PlanObj.job_count)" +Write-Host "Workers : $Workers" + +# Deliberately do NOT migrate PASS jobs from v1.4.5 partial release. +# The new query must receive a clean production run for output equivalence/final gate. +Run "STEP 6 - Full v1.4.6 PBF production build" { + & $Cm95Pbf build-production ` + --plan $Plan ` + --release-root ".\build\releases" ` + --workers $Workers ` + --max-attempts 3 +} + +Step "STEP 7 - Production status" +$StatusText = ( + & $Cm95Pbf status-production ` + --plan $Plan ` + --release-root ".\build\releases" | + Out-String +).Trim() +if ($LASTEXITCODE -ne 0) { throw "status-production failed" } +Write-Host $StatusText +$S = $StatusText | ConvertFrom-Json +$Pass = StateCount $S.states "PASS" +$Fail = StateCount $S.states "FAILED" +$Pending = StateCount $S.states "PENDING" +$Running = StateCount $S.states "RUNNING" +if ($Pass -ne [int]$S.jobs -or $Fail -ne 0 -or $Pending -ne 0 -or $Running -ne 0) { + throw "Production state gate failed" +} + +Run "STEP 8 - Finalize v1.4.6 release" { + & $Cm95Pbf finalize-production ` + --plan $Plan ` + --release-root ".\build\releases" ` + --style ".\config\style\style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json" ` + --sprite-json ".\config\sprite\semantic-sprite-20260808.json" ` + --gap-disposition $Disposition +} + +$ReleaseManifest = ".\build\releases\$ReleaseId\release_manifest_v1.json" +if (-not (Test-Path $ReleaseManifest)) { throw "Release manifest missing" } +$Final = Get-Content $ReleaseManifest -Raw | ConvertFrom-Json +if ([string]$Final.status -ne "PASS") { throw "Final release status != PASS" } + +Step "CM95 JAPAN v1.4.6 COMPLETE / PASS" +Write-Host "Dataset ID : $DatasetId" +Write-Host "Release ID : $ReleaseId" +Write-Host "Jobs : $($S.jobs)" +Write-Host "PBF files : $($S.pbf_files)" +Write-Host "Output features : $($S.output_features)" +Write-Host "Final status : $($Final.status)" +Write-Host "Semantic status : $($Final.semantic_completeness)" +Write-Host "" +Write-Host "Web test:" +Write-Host " cd `"$ProjectRoot`"" +Write-Host " & `".\.venv\Scripts\python.exe`" .\web\cm95_web.py --release-id `"$ReleaseId`"" diff --git a/scripts/cm95_japan_v1_4_7_finalize_existing.ps1 b/scripts/cm95_japan_v1_4_7_finalize_existing.ps1 new file mode 100644 index 0000000..47ecf69 --- /dev/null +++ b/scripts/cm95_japan_v1_4_7_finalize_existing.ps1 @@ -0,0 +1,153 @@ +param( + [string]$ProjectRoot = "D:\React\cm93-mysql-importer-starter" +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +function Step([string]$Text) { + Write-Host "" + Write-Host "======================================================================" + Write-Host $Text + Write-Host "======================================================================" +} + +function Run([string]$Label, [scriptblock]$Action) { + Step $Label + & $Action + $Code = $LASTEXITCODE + if ($null -ne $Code -and $Code -ne 0) { + throw "$Label FAILED (exit=$Code)" + } +} + +Set-Location $ProjectRoot + +$Python = ".\.venv\Scripts\python.exe" +$Cm95Pbf = ".\.venv\Scripts\cm95pbf.exe" +$Plan = ".\build\production\cm95_production_plan_japan_full_detail_v1_4_6.json" +$ReleaseRoot = ".\build\releases" +$Disposition = ".\config\mappings\cm95_gap_disposition_japan_dataset_1_v1.yaml" +$ExpectedPlanId = "6bc3c1352da347b77256c83d8ab3b771fcde151d70332e8d96c6e50605cb5d8f" +$ExpectedReleaseId = "cm95-d1-62a85bd40d3a-6bc3c1352da3" +$ExpectedBuilder = "cm95pbf-builder/0.4.6-spatial-candidate-query" + +foreach ($Path in @($Python,$Cm95Pbf,$Plan,$Disposition)) { + if (-not (Test-Path $Path)) { + throw "Missing required path: $Path" + } +} + +Run "STEP 0A - pip install v1.4.7 editable" { + & $Python -m pip install -e . +} + +Run "STEP 0B - CM95 v1.4.7 preflight" { + & $Python ".\tools\cm95_v1_4_7_preflight.py" +} + +Step "STEP 1 - Verify existing v1.4.6 plan / release identity" +$PlanObj = Get-Content $Plan -Raw | ConvertFrom-Json +if ([string]$PlanObj.plan_id -ne $ExpectedPlanId) { + throw "Unexpected plan_id: $($PlanObj.plan_id)" +} +if ([string]$PlanObj.release_id -ne $ExpectedReleaseId) { + throw "Unexpected release_id: $($PlanObj.release_id)" +} +if ([string]$PlanObj.builder_contract_version -ne $ExpectedBuilder) { + throw "Unexpected builder contract: $($PlanObj.builder_contract_version)" +} +Write-Host "Plan ID : $($PlanObj.plan_id)" +Write-Host "Release ID : $($PlanObj.release_id)" +Write-Host "Builder : $($PlanObj.builder_contract_version)" +Write-Host "PBF rebuild : NO" + +Step "STEP 2 - Verify existing production is already 27038/27038 PASS" +$StatusText = ( + & $Cm95Pbf status-production ` + --plan $Plan ` + --release-root $ReleaseRoot | + Out-String +).Trim() +if ($LASTEXITCODE -ne 0) { throw "status-production failed" } +Write-Host $StatusText +$S = $StatusText | ConvertFrom-Json +if ([int]$S.jobs -ne 27038 -or + [int]$S.attempts -ne 27038 -or + [int64]$S.output_features -ne 2974375 -or + [int]$S.pbf_files -ne 27030 -or + [int]$S.states.PASS -ne 27038) { + throw "Existing production baseline does not match expected completed v1.4.6 release" +} + +$ReleaseDir = Join-Path $ReleaseRoot $ExpectedReleaseId +$AuditJson = ".\build\production\cm95_nav_name_conflicts_v1_4_7_precheck.json" +$AuditCsv = ".\build\production\cm95_nav_name_conflicts_v1_4_7_precheck.csv" + +Run "STEP 3 - Re-audit the 10 trace occurrences / 4 unique ambiguous outputs" { + & $Python ".\tools\cm95_nav_name_conflict_audit_v1.py" ` + --release-dir $ReleaseDir ` + --profile delivery ` + --output-json $AuditJson ` + --output-csv $AuditCsv +} + +$A = Get-Content $AuditJson -Raw | ConvertFrom-Json +if ([int]$A.report_name_conflict_occurrences -ne 10 -or + [int]$A.trace_name_conflict_occurrences -ne 10 -or + [int]$A.unique_conflict_outputs -ne 4 -or + [int]$A.affected_tiles -ne 3) { + throw "Nav name conflict baseline changed unexpectedly" +} + +Run "STEP 4 - Finalize EXISTING PBF release with audited ambiguous-name omission gate" { + & $Cm95Pbf finalize-production ` + --plan $Plan ` + --release-root $ReleaseRoot ` + --style ".\config\style\style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json" ` + --sprite-json ".\config\sprite\semantic-sprite-20260808.json" ` + --gap-disposition $Disposition +} + +$Manifest = Join-Path $ReleaseDir "release_manifest_v1.json" +if (-not (Test-Path $Manifest)) { + throw "release manifest missing: $Manifest" +} + +$F = Get-Content $Manifest -Raw | ConvertFrom-Json +if ([string]$F.status -ne "PASS") { + throw "release manifest status != PASS" +} +if ([string]$F.nav_name_conflict_audit.overall -ne "PASS") { + throw "nav_name_conflict_audit != PASS" +} +if ([int]$F.nav_name_conflict_audit.report_occurrences -ne 10 -or + [int]$F.nav_name_conflict_audit.trace_occurrences -ne 10 -or + [int]$F.nav_name_conflict_audit.safe_omission_occurrences -ne 10 -or + [int]$F.nav_name_conflict_audit.unique_conflict_outputs -ne 4 -or + [int]$F.nav_name_conflict_audit.affected_tiles -ne 3 -or + [int]$F.nav_name_conflict_audit.labeled_conflict_occurrences -ne 0 -or + [int]$F.nav_name_conflict_audit.missing_pbf_occurrences -ne 0) { + throw "audited ambiguous-name omission counts differ from expected baseline" +} +if ([int64]$F.planned_output_features -ne 2974375 -or + [int64]$F.decoded_pbf_features -ne 2974375) { + throw "feature count changed unexpectedly" +} +if ([string]$F.style_sprite_contract.overall -ne "PASS") { + throw "style/sprite contract != PASS" +} + +Step "CM95 JAPAN v1.4.7 FINALIZE COMPLETE / PASS" +Write-Host "Release ID : $ExpectedReleaseId" +Write-Host "PBF rebuilt : NO" +Write-Host "Jobs : 27038 / 27038 PASS" +Write-Host "Decoded features : $($F.decoded_pbf_features)" +Write-Host "Ambiguous-name occurrences: $($F.nav_name_conflict_audit.report_occurrences)" +Write-Host "Unique ambiguous outputs : $($F.nav_name_conflict_audit.unique_conflict_outputs)" +Write-Host "Labels safely omitted : $($F.nav_name_conflict_audit.safe_omission_occurrences)" +Write-Host "Unsafe labels : $($F.nav_name_conflict_audit.labeled_conflict_occurrences)" +Write-Host "Style/Sprite : $($F.style_sprite_contract.overall)" +Write-Host "Semantic completeness : $($F.semantic_completeness)" +Write-Host "FINAL STATUS : $($F.status)" +Write-Host "Manifest : $Manifest" diff --git a/src/cm95pbf/__init__.py b/src/cm95pbf/__init__.py new file mode 100644 index 0000000..d67eda0 --- /dev/null +++ b/src/cm95pbf/__init__.py @@ -0,0 +1,2 @@ +__version__ = "0.4.7-production-audited-nav-name-conflict-omission" +BUILDER_CONTRACT_VERSION = "cm95pbf-builder/0.4.6-spatial-candidate-query" diff --git a/src/cm95pbf/builder.py b/src/cm95pbf/builder.py new file mode 100644 index 0000000..296ff92 --- /dev/null +++ b/src/cm95pbf/builder.py @@ -0,0 +1,1939 @@ +from __future__ import annotations + +from collections import Counter, defaultdict +from dataclasses import dataclass +import json +import math +from pathlib import Path +from typing import Any + +import mapbox_vector_tile +import pymysql +from shapely import wkb +from shapely.geometry import ( + GeometryCollection, + LineString, + MultiLineString, + MultiPoint, + MultiPolygon, + Point, + Polygon, + box, + mapping as shapely_mapping, + shape as shapely_shape, +) +from shapely.ops import transform, unary_union + +from cm93db.config import DbConfig + +from . import BUILDER_CONTRACT_VERSION +from .identity import ( + FidManifest, + ROLE_BOUNDARY, + ROLE_POINT_ON_SURFACE, + ROLE_PRIMARY, + ROLE_SECONDARY, + feature_source_key, + sounding_source_key, +) +from .mapping import ( + DELIVERY_DERIVED_STATUSES, + DELIVERY_MAIN_STATUSES, + NAV_COMPONENT_CLASSES, + MappingRegistry, + format_light_abbreviation, + first_direct_name, + unique_direct_names, + nav_icon_from_bcnlat, + nav_icon_from_bcnspp, + nav_icon_from_boyspp, + nav_icon_from_rtpbcn, + s57_light_color, +) +from .policy import ( + expanded_mercator_bounds, + lonlat_to_mercator, + mercator_to_lonlat, + xyz_tile_bounds, +) + + +@dataclass(frozen=True) +class TileJob: + z: int + x: int + y: int + + +@dataclass +class SourceFeature: + feature_id: int + cell_id: int + source_relative_path: str + source_record_index: int + object_class: str + geometry_type: str + native_scale: int + coverage_id: int | None + attrs: dict[str, Any] + geom_wgs84: Any + + @property + def source_id(self) -> str: + return feature_source_key( + 0, # replaced by builder source_id() + self.source_relative_path, + self.source_record_index, + self.geometry_type, + ) + + +def _json_dict(value: Any) -> dict[str, Any]: + if value is None: + return {} + if isinstance(value, dict): + return value + if isinstance(value, (bytes, bytearray, memoryview)): + value = bytes(value).decode("utf-8") + try: + parsed = json.loads(value) + except Exception: + return {} + return parsed if isinstance(parsed, dict) else {} + + +def _loads_wkb(value: Any): + if value is None: + return None + if isinstance(value, memoryview): + value = value.tobytes() + elif isinstance(value, bytearray): + value = bytes(value) + return wkb.loads(value) + + +def _to_mercator_geom(geom): + return transform( + lambda x, y, z=None: lonlat_to_mercator(x, y), + geom, + ) + + +def _quantized_xy(x: float, y: float, bounds, extent: int) -> tuple[int, int]: + minx, miny, maxx, maxy = bounds + sx = float(extent) / float(maxx - minx) + sy = float(extent) / float(maxy - miny) + # mapbox-vector-tile 的官方示例使用 int() 量化。 + return ( + int((float(x) - float(minx)) * sx), + int((float(y) - float(miny)) * sy), + ) + + +def _line_survives_mvt_quantization(geom, bounds, extent: int) -> bool: + """判断线几何量化后是否仍至少保留两个不同顶点。""" + if geom is None or geom.is_empty: + return False + if isinstance(geom, LineString): + q = [_quantized_xy(x, y, bounds, extent) for x, y, *rest in geom.coords] + return len(set(q)) >= 2 + if isinstance(geom, MultiLineString): + return any(_line_survives_mvt_quantization(g, bounds, extent) for g in geom.geoms) + return True + + +def _ring_survives_mvt_quantization(coords, bounds, extent: int) -> bool: + q = [_quantized_xy(x, y, bounds, extent) for x, y, *rest in coords] + if not q: + return False + compact = [q[0]] + for pt in q[1:]: + if pt != compact[-1]: + compact.append(pt) + if len(compact) > 1 and compact[0] == compact[-1]: + compact.pop() + if len(set(compact)) < 3: + return False + area2 = 0 + for i, (x1, y1) in enumerate(compact): + x2, y2 = compact[(i + 1) % len(compact)] + area2 += x1 * y2 - x2 * y1 + return area2 != 0 + + +def _polygon_survives_mvt_quantization(geom, bounds, extent: int) -> bool: + if geom is None or geom.is_empty: + return False + if isinstance(geom, Polygon): + return _ring_survives_mvt_quantization(geom.exterior.coords, bounds, extent) + if isinstance(geom, MultiPolygon): + return any(_polygon_survives_mvt_quantization(g, bounds, extent) for g in geom.geoms) + return True + + +def _geometry_survives_mvt_quantization(geom, bounds, extent: int) -> bool: + if geom is None or geom.is_empty: + return False + if isinstance(geom, (Point, MultiPoint)): + return True + if isinstance(geom, (LineString, MultiLineString)): + return _line_survives_mvt_quantization(geom, bounds, extent) + if isinstance(geom, (Polygon, MultiPolygon)): + return _polygon_survives_mvt_quantization(geom, bounds, extent) + parts = list(getattr(geom, "geoms", []) or []) + if parts: + return any(_geometry_survives_mvt_quantization(g, bounds, extent) for g in parts) + return True + + +def _extract_dimensional(geom, geometry_type: str): + if geom is None or geom.is_empty: + return None + + geometry_type = geometry_type.upper() + + if geometry_type == "POINT": + if isinstance(geom, (Point, MultiPoint)): + return geom + parts = [ + g + for g in getattr(geom, "geoms", []) + if isinstance(g, (Point, MultiPoint)) + ] + if not parts: + return None + points = [] + for part in parts: + if isinstance(part, Point): + points.append(part) + else: + points.extend(list(part.geoms)) + return MultiPoint(points) if len(points) > 1 else points[0] + + if geometry_type == "LINE": + if isinstance(geom, (LineString, MultiLineString)): + return geom + lines = [] + for g in getattr(geom, "geoms", []): + if isinstance(g, LineString): + lines.append(g) + elif isinstance(g, MultiLineString): + lines.extend(list(g.geoms)) + if not lines: + return None + return MultiLineString(lines) if len(lines) > 1 else lines[0] + + if geometry_type == "AREA": + if isinstance(geom, (Polygon, MultiPolygon)): + return geom + polygons = [] + for g in getattr(geom, "geoms", []): + if isinstance(g, Polygon): + polygons.append(g) + elif isinstance(g, MultiPolygon): + polygons.extend(list(g.geoms)) + if not polygons: + return None + return MultiPolygon(polygons) if len(polygons) > 1 else polygons[0] + + return None + + +def _sanitize_properties(props: dict[str, Any]) -> dict[str, Any]: + out: dict[str, Any] = {} + for key, value in props.items(): + if value is None: + continue + if isinstance(value, bool): + out[str(key)] = value + elif isinstance(value, (int, float, str)): + out[str(key)] = value + else: + out[str(key)] = json.dumps( + value, + ensure_ascii=False, + separators=(",", ":"), + default=str, + ) + return out + + +class Cm95TileBuilder: + def __init__( + self, + db: DbConfig, + dataset_id: int, + mapping_path: Path, + policy_path: Path, + fid_manifest_path: Path, + output_root: Path, + report_root: Path, + profile: str = "delivery", + ): + self.db = db + self.dataset_id = int(dataset_id) + self.mapping = MappingRegistry(Path(mapping_path)) + self.policy = self._load_policy(Path(policy_path)) + self.fid_manifest_path = Path(fid_manifest_path) + self.output_root = Path(output_root) + self.report_root = Path(report_root) + self.profile = str(profile) + if self.profile not in {"delivery", "engineering"}: + raise ValueError("profile must be delivery or engineering") + + @staticmethod + def _load_policy(path: Path) -> dict[str, Any]: + import yaml + return yaml.safe_load(path.read_text(encoding="utf-8")) + + def connect(self): + return pymysql.connect( + host=self.db.host, + port=self.db.port, + user=self.db.user, + password=self.db.password, + database=self.db.database, + charset=self.db.charset, + cursorclass=pymysql.cursors.DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + write_timeout=30, + ) + + def extent_for_zoom(self, z: int) -> int: + extents = self.policy.get("extent_by_zoom", {}) + if str(z) in extents: + return int(extents[str(z)]) + if z in extents: + return int(extents[z]) + return int(self.policy.get("default_extent", 4096)) + + def scale_ladder_for_zoom(self, z: int) -> list[int]: + ladders = self.policy.get("scale_ladders", {}) + raw = ladders.get(str(z), ladders.get(z)) + if not raw: + raise RuntimeError(f"no scale ladder configured for z{z}") + return [int(v) for v in raw] + + def source_id(self, row: SourceFeature) -> str: + return feature_source_key( + self.dataset_id, + row.source_relative_path, + row.source_record_index, + row.geometry_type, + ) + + def build_tile(self, job: TileJob) -> dict[str, Any]: + extent = self.extent_for_zoom(job.z) + buffer_px = float(self.policy.get("buffer_tile_pixels", 8)) + tile = xyz_tile_bounds(job.z, job.x, job.y) + expanded_m = expanded_mercator_bounds(tile, buffer_px) + expanded_box_m = box(*expanded_m) + tile_box_m = box(*tile.mercator_tuple) + west, south = mercator_to_lonlat(expanded_m[0], expanded_m[1]) + east, north = mercator_to_lonlat(expanded_m[2], expanded_m[3]) + query_bbox_wgs = (west, south, east, north) + scales = self.scale_ladder_for_zoom(job.z) + + report: dict[str, Any] = { + "schema": "navsea.cm95.tile-build-report/v1", + "dataset_id": self.dataset_id, + "profile": self.profile, + "builder_contract_version": BUILDER_CONTRACT_VERSION, + "tile": {"z": job.z, "x": job.x, "y": job.y}, + "extent": extent, + "buffer_tile_pixels": buffer_px, + "scale_ladder": scales, + "query_bbox_wgs84": query_bbox_wgs, + "scale_regions": [], + "input_feature_count": 0, + "output_feature_count": 0, + "output_layer_counts": {}, + "mapping_status_counts": {}, + "unmapped_class_counts": {}, + "navigation_composites": { + "groups": 0, + "component_rows": 0, + "standalone_lights": 0, + "named_from_direct_source": 0, + "name_conflict_groups": 0, + }, + "hard_gate_unmapped": [], + "warnings": [], + "non_renderable_omissions": [], + "quantization_fallbacks": [], + "quantization_omissions": [], + "encoder_drop_candidates": [], + "encoder_reconcile_passes": 0, + "encoder_dropped_features": [], + "planned_output_feature_count": 0, + } + + with self.connect() as conn, FidManifest(self.fid_manifest_path) as manifest: + manifest.init_schema() + self._validate_manifest_open(conn, manifest) + + scale_regions = self._build_scale_regions( + conn, + scales, + query_bbox_wgs, + expanded_box_m, + tile_box_m, + ) + report["scale_regions"] = [ + { + "scale": scale, + "coverage_area_fraction_of_tile": ( + float(region.area / tile_box_m.area) + if tile_box_m.area > 0 else 0.0 + ), + } + for scale, region in scale_regions + if not region.is_empty + ] + + layer_features: dict[str, list[dict[str, Any]]] = defaultdict(list) + trace_rows: list[dict[str, Any]] = [] + status_counts: Counter[str] = Counter() + unmapped_counts: Counter[str] = Counter() + + for scale, visible_region in scale_regions: + if visible_region.is_empty: + continue + + rows = self._fetch_scale_features( + conn, + scale, + query_bbox_wgs, + ) + report["input_feature_count"] += len(rows) + + selected: list[SourceFeature] = [] + for row in rows: + geom_m = _to_mercator_geom(row.geom_wgs84) + clipped = _extract_dimensional( + geom_m.intersection(visible_region).intersection(expanded_box_m), + row.geometry_type, + ) + if clipped is None or clipped.is_empty: + continue + row.geom_wgs84 = clipped # now projected; name retained for compact dataclass + selected.append(row) + + consumed: set[int] = set() + nav_outputs = self._compose_navigation_aids( + selected, + manifest, + scale, + consumed, + trace_rows, + ) + for output in nav_outputs: + layer_features[output["layer"]].append(output["feature"]) + report["navigation_composites"]["groups"] += sum( + 1 for o in nav_outputs if o.get("composite") + ) + report["navigation_composites"]["component_rows"] += sum( + len(o.get("component_feature_ids", [])) + for o in nav_outputs if o.get("composite") + ) + report["navigation_composites"]["standalone_lights"] += sum( + 1 for o in nav_outputs if o.get("standalone_light") + ) + report["navigation_composites"]["named_from_direct_source"] += sum( + 1 for o in nav_outputs if o.get("name_source") == "direct_source" + ) + report["navigation_composites"]["name_conflict_groups"] += sum( + 1 for o in nav_outputs if o.get("name_conflict") + ) + + for row in selected: + if row.feature_id in consumed: + continue + + rule = self.mapping.resolve(row.object_class, row.geometry_type) + if rule is None: + status_counts["NO_RULE"] += 1 + unmapped_counts[row.object_class] += 1 + if self.profile == "engineering": + self._append_unmapped( + layer_features, + manifest, + row, + "NO_RULE", + trace_rows, + ) + continue + + status = str(rule.get("mapping_status") or "") + status_counts[status] += 1 + + if ( + self.profile == "delivery" + and status not in DELIVERY_MAIN_STATUSES + ): + # Some rules intentionally have only derived delivery outputs. + self._append_derived_outputs( + layer_features, + manifest, + row, + rule, + trace_rows, + allow_delivery=True, + ) + continue + + if str(rule.get("target_source_layer")) == "cm95_unmapped": + unmapped_counts[row.object_class] += 1 + if self.profile == "engineering": + self._append_unmapped( + layer_features, + manifest, + row, + status, + trace_rows, + rule=rule, + ) + self._append_derived_outputs( + layer_features, + manifest, + row, + rule, + trace_rows, + allow_delivery=True, + ) + continue + + self._append_main_output( + layer_features, + manifest, + row, + rule, + trace_rows, + ) + self._append_derived_outputs( + layer_features, + manifest, + row, + rule, + trace_rows, + allow_delivery=True, + ) + + # Sounding points are rendered independently from the SOUNDG parent. + sounding_rows = self._fetch_scale_soundings( + conn, + scale, + query_bbox_wgs, + ) + report["input_feature_count"] += len(sounding_rows) + for srow in sounding_rows: + point_m = _to_mercator_geom(srow["geom_wgs84"]) + if not visible_region.covers(point_m): + continue + if not expanded_box_m.covers(point_m): + continue + self._append_sounding_output( + layer_features, + manifest, + srow, + point_m, + trace_rows, + ) + + # Delivery label renderability gate: + # label-only source layers must contain at least one property that the + # frozen NavSea style can actually render. A label feature without + # label content is not a hidden semantic object; it is a non-renderable + # delivery artifact and must be omitted explicitly rather than left as + # a permanent style-contract mismatch. + trace_by_output = { + int(t["output_id"]): t + for t in trace_rows + if t.get("output_id") is not None + } + if self.profile == "delivery": + label_requirements = { + "place_label_land": ("place_name_en", "chart_label_text"), + "seabed_text_point": ("chart_label_text",), + } + for layer_name, required_any in label_requirements.items(): + original_features = list(layer_features.get(layer_name, [])) + if not original_features: + continue + kept_features: list[dict[str, Any]] = [] + for feature in original_features: + props = feature.get("properties") or {} + renderable = any( + key in props + and props.get(key) is not None + and str(props.get(key)).strip() != "" + for key in required_any + ) + if renderable: + kept_features.append(feature) + continue + + output_id = int(feature["id"]) + trace = trace_by_output.get(output_id) + if trace is None: + raise RuntimeError( + f"non-renderable label missing trace: tile={job.z}/{job.x}/{job.y} " + f"layer={layer_name} id={output_id}" + ) + source_id = str(trace["source_id"]) + trace["delivery_omitted"] = True + trace["delivery_omission_reason"] = "label_layer_missing_renderable_text" + report["non_renderable_omissions"].append( + { + "source_id": source_id, + "layer": layer_name, + "output_id": output_id, + "canonical_object_type": props.get("canonical_object_type"), + "required_any": list(required_any), + "reason": "label_layer_missing_renderable_text", + } + ) + layer_features[layer_name] = kept_features + + # MVT 编码前量化预检: + # 1) 所有几何先按当前 tile extent 预量化;不可绘制的 tile-local 亚像素片段 + # 明确记录后省略,禁止等 encoder 静默丢弃; + # 2) 对必须维持“对象存在性”的安全图层,退化线/面转换到现有 point layer; + # 3) depth_contour / baseline_line 等线性参考几何若量化后无两个像素点, + # 省略的是当前 tile 内不可绘制片段,不伪造一个点语义。 + # trace_by_output was created by the label renderability gate above. + point_fallbacks = { + "clearance_limit_line": ("clearance_limit_point", ROLE_SECONDARY, "clearance"), + "navigation_hazard_area": ("navigation_hazard_point", ROLE_POINT_ON_SURFACE, "hazard"), + "navigation_hazard_outline": ("navigation_hazard_point", ROLE_POINT_ON_SURFACE, "hazard"), + "anchor_caution_hazard_area": ("anchor_caution_hazard_point", ROLE_POINT_ON_SURFACE, "anchor_hazard"), + "anchor_caution_hazard_outline": ("anchor_caution_hazard_point", ROLE_POINT_ON_SURFACE, "anchor_hazard"), + } + + for layer_name in list(layer_features.keys()): + original_features = list(layer_features.get(layer_name, [])) + if not original_features: + continue + kept_features: list[dict[str, Any]] = [] + for feature in original_features: + geom = shapely_shape(feature["geometry"]) + if _geometry_survives_mvt_quantization(geom, tile.mercator_tuple, extent): + kept_features.append(feature) + continue + + original_id = int(feature["id"]) + trace = trace_by_output.get(original_id) + if trace is None: + raise RuntimeError( + f"quantization preflight missing trace: tile={job.z}/{job.x}/{job.y} " + f"layer={layer_name} id={original_id}" + ) + source_id = str(trace["source_id"]) + trace["quantization_omitted"] = True + trace["quantization_omission_reason"] = "geometry_collapsed_after_mvt_quantization" + + fallback_spec = point_fallbacks.get(layer_name) + if fallback_spec is not None: + target_layer, role_code, fallback_kind = fallback_spec + point = geom.representative_point() + if point is None or point.is_empty: + raise RuntimeError( + f"quantization fallback cannot create point: {source_id}" + ) + fallback_id = manifest.mvt_id(source_id, role_code) + target_features = layer_features[target_layer] + already_present = any( + int(existing.get("id")) == int(fallback_id) + for existing in target_features + if existing.get("id") is not None + ) + if not already_present: + props = dict(feature.get("properties") or {}) + if fallback_kind == "hazard": + props.setdefault("chart_symbol_code", "obstruction") + props.setdefault("chart_icon_image", "obstruction") + elif fallback_kind == "anchor_hazard": + canonical = str(props.get("canonical_object_type") or "") + if canonical == "fish_reef": + props.setdefault("chart_symbol_code", "fish_reef") + props.setdefault("chart_icon_image", "reef_fish") + else: + props.setdefault("chart_symbol_code", "obstruction") + props.setdefault("chart_icon_image", "obstruction") + fallback_feature = { + "id": fallback_id, + "geometry": shapely_mapping(point), + "properties": props, + } + target_features.append(fallback_feature) + trace_rows.append( + { + "output_id": fallback_id, + "output_layer": target_layer, + "source_id": source_id, + "native_scale": trace.get("native_scale"), + "mapping_rule_id": trace.get("mapping_rule_id"), + "mapping_status": f"{trace.get('mapping_status')}:QUANTIZATION_FALLBACK_POINT", + } + ) + report["quantization_fallbacks"].append( + { + "source_id": source_id, + "from_layer": layer_name, + "to_layer": target_layer, + "original_output_id": original_id, + "fallback_output_id": fallback_id, + "fallback_already_present": already_present, + "reason": "geometry_collapsed_after_mvt_quantization", + } + ) + else: + report["quantization_omissions"].append( + { + "source_id": source_id, + "layer": layer_name, + "output_id": original_id, + "reason": "tile_local_geometry_not_drawable_at_current_extent", + } + ) + layer_features[layer_name] = kept_features + + output_path = ( + self.output_root + / str(job.z) + / str(job.x) + / f"{job.y}.pbf" + ) + output_path.parent.mkdir(parents=True, exist_ok=True) + + def _encode_and_reconcile_snapshot(): + encoded_layers: list[dict[str, Any]] = [] + for layer_name, features in sorted(layer_features.items()): + if not features: + continue + encoded_layers.append( + { + "name": layer_name, + "features": features, + } + ) + + planned_counts = { + k: len(v) for k, v in sorted(layer_features.items()) if v + } + planned_ids = { + layer: {int(f["id"]) for f in features} + for layer, features in layer_features.items() + if features + } + planned_count = sum(planned_counts.values()) + + if not encoded_layers: + return { + "data": None, + "planned_counts": planned_counts, + "planned_ids": planned_ids, + "planned_count": planned_count, + "actual_counts": {}, + "actual_ids": {}, + "actual_count": 0, + "dropped": [], + "unexpected": [], + } + + data = mapbox_vector_tile.encode( + encoded_layers, + default_options={ + "quantize_bounds": tile.mercator_tuple, + "extents": extent, + }, + ) + decoded = mapbox_vector_tile.decode(data) + actual_counts = { + name: len(payload.get("features", [])) + for name, payload in decoded.items() + } + actual_ids = { + layer: { + int(f["id"]) + for f in payload.get("features", []) + if f.get("id") is not None + } + for layer, payload in decoded.items() + } + actual_count = sum(actual_counts.values()) + + dropped: list[dict[str, Any]] = [] + unexpected: list[dict[str, Any]] = [] + for layer, ids in planned_ids.items(): + for fid in sorted(ids - actual_ids.get(layer, set())): + dropped.append({"layer": layer, "output_id": fid}) + for layer, ids in actual_ids.items(): + for fid in sorted(ids - planned_ids.get(layer, set())): + unexpected.append({"layer": layer, "output_id": fid}) + + return { + "data": data, + "planned_counts": planned_counts, + "planned_ids": planned_ids, + "planned_count": planned_count, + "actual_counts": actual_counts, + "actual_ids": actual_ids, + "actual_count": actual_count, + "dropped": dropped, + "unexpected": unexpected, + } + + def _remove_feature_by_id(layer_name: str, output_id: int): + features = list(layer_features.get(layer_name, [])) + found = None + kept = [] + for feature in features: + if int(feature.get("id")) == int(output_id) and found is None: + found = feature + else: + kept.append(feature) + if found is not None: + layer_features[layer_name] = kept + return found + + def _record_encoder_confirmed_drop(layer_name: str, output_id: int) -> None: + # mapbox-vector-tile 在内部还会做 geometry clean-up;其结果是 + # 比我们自己的整数预量化模拟更权威的“可编码/不可编码”判据。 + # 对非安全、tile-local 不可绘制片段,明确 omission 后重编码; + # 对需要维持对象存在性的安全图层,降级到现有 point layer。 + feature = _remove_feature_by_id(layer_name, output_id) + if feature is None: + raise RuntimeError( + f"encoder reconciliation missing planned feature: " + f"tile={job.z}/{job.x}/{job.y} layer={layer_name} id={output_id}" + ) + + trace_by_output_now = { + int(t["output_id"]): t + for t in trace_rows + if t.get("output_id") is not None + } + trace = trace_by_output_now.get(int(output_id)) + if trace is None: + raise RuntimeError( + f"encoder reconciliation missing trace: " + f"tile={job.z}/{job.x}/{job.y} layer={layer_name} id={output_id}" + ) + + source_id = str(trace["source_id"]) + trace["quantization_omitted"] = True + trace["quantization_omission_reason"] = "encoder_confirmed_geometry_drop" + geom = shapely_shape(feature["geometry"]) + + fallback_spec = point_fallbacks.get(layer_name) + if fallback_spec is not None: + target_layer, role_code, fallback_kind = fallback_spec + point = geom.representative_point() + if point is None or point.is_empty: + raise RuntimeError( + f"encoder reconciliation fallback cannot create point: {source_id}" + ) + fallback_id = manifest.mvt_id(source_id, role_code) + target_features = layer_features[target_layer] + already_present = any( + int(existing.get("id")) == int(fallback_id) + for existing in target_features + if existing.get("id") is not None + ) + if not already_present: + props = dict(feature.get("properties") or {}) + if fallback_kind == "hazard": + props.setdefault("chart_symbol_code", "obstruction") + props.setdefault("chart_icon_image", "obstruction") + elif fallback_kind == "anchor_hazard": + canonical = str(props.get("canonical_object_type") or "") + if canonical == "fish_reef": + props.setdefault("chart_symbol_code", "fish_reef") + props.setdefault("chart_icon_image", "reef_fish") + else: + props.setdefault("chart_symbol_code", "obstruction") + props.setdefault("chart_icon_image", "obstruction") + target_features.append( + { + "id": fallback_id, + "geometry": shapely_mapping(point), + "properties": props, + } + ) + trace_rows.append( + { + "output_id": fallback_id, + "output_layer": target_layer, + "source_id": source_id, + "native_scale": trace.get("native_scale"), + "mapping_rule_id": trace.get("mapping_rule_id"), + "mapping_status": f"{trace.get('mapping_status')}:ENCODER_RECONCILE_FALLBACK_POINT", + } + ) + report["quantization_fallbacks"].append( + { + "source_id": source_id, + "from_layer": layer_name, + "to_layer": target_layer, + "original_output_id": int(output_id), + "fallback_output_id": int(fallback_id), + "fallback_already_present": already_present, + "reason": "encoder_confirmed_geometry_drop", + } + ) + else: + report["quantization_omissions"].append( + { + "source_id": source_id, + "layer": layer_name, + "output_id": int(output_id), + "reason": "encoder_confirmed_tile_local_geometry_not_drawable", + } + ) + + # 第一遍编码是真实 encoder probe。若 encoder 内部清理掉了预检未识别的 + # tile-local 几何,则以实际 decode 结果为权威做一次 reconciliation, + # 再重编码。最多允许 3 次 reconciliation,最终仍必须严格一致。 + max_reconcile_passes = 3 + snapshot = None + for reconcile_pass in range(max_reconcile_passes + 1): + snapshot = _encode_and_reconcile_snapshot() + report["encoder_reconcile_passes"] = reconcile_pass + + mismatch = ( + bool(snapshot["dropped"]) + or bool(snapshot["unexpected"]) + or int(snapshot["actual_count"]) != int(snapshot["planned_count"]) + ) + if not mismatch: + break + + report["encoder_drop_candidates"].append( + { + "pass": reconcile_pass, + "dropped": list(snapshot["dropped"]), + "unexpected": list(snapshot["unexpected"]), + "planned_count": int(snapshot["planned_count"]), + "actual_count": int(snapshot["actual_count"]), + } + ) + + # 只能自动处理“planned 中存在,但 encoder 实际没有”的对象。 + # 出现 unexpected ID 或无法由 dropped 数量解释的 count mismatch, + # 说明不是普通量化退化,继续 fail-closed。 + if snapshot["unexpected"]: + break + if int(snapshot["planned_count"]) - int(snapshot["actual_count"]) != len(snapshot["dropped"]): + break + if not snapshot["dropped"] or reconcile_pass >= max_reconcile_passes: + break + + for item in snapshot["dropped"]: + _record_encoder_confirmed_drop( + str(item["layer"]), + int(item["output_id"]), + ) + + assert snapshot is not None + report["planned_output_feature_count"] = int(snapshot["planned_count"]) + report["output_layer_counts"] = { + k: int(v) for k, v in sorted(snapshot["actual_counts"].items()) + } + report["output_feature_count"] = int(snapshot["actual_count"]) + + final_mismatch = ( + bool(snapshot["dropped"]) + or bool(snapshot["unexpected"]) + or int(snapshot["actual_count"]) != int(snapshot["planned_count"]) + ) + report["encoder_dropped_features"] = list(snapshot["dropped"]) + + if final_mismatch: + report["warnings"].append( + "MVT encoder output does not match reconciled planned feature IDs/counts" + ) + report_path = ( + self.report_root + / self.profile + / str(job.z) + / str(job.x) + / f"{job.y}.json" + ) + report_path.parent.mkdir(parents=True, exist_ok=True) + report_path.write_text( + json.dumps(report, ensure_ascii=False, indent=2, default=str), + encoding="utf-8", + ) + raise RuntimeError( + f"MVT encoder reconciliation failed in tile {job.z}/{job.x}/{job.y}: " + f"dropped={snapshot['dropped']} unexpected={snapshot['unexpected']} " + f"planned={snapshot['planned_count']} actual={snapshot['actual_count']}" + ) + + if snapshot["data"] is not None: + output_path.write_bytes(snapshot["data"]) + else: + if output_path.exists(): + output_path.unlink() + report["output_layer_counts"] = {} + report["output_feature_count"] = 0 + report["mapping_status_counts"] = dict(status_counts) + report["unmapped_class_counts"] = dict(unmapped_counts) + + # Hard-gate classes with no safe delivery rule are recorded as a gate failure. + for key, count in unmapped_counts.items(): + rule_candidates = [ + rule for (obj, _geom), rule in self.mapping.rules.items() + if obj == key + ] + if any(str(r.get("safety_class")) == "hard_gate" for r in rule_candidates): + report["hard_gate_unmapped"].append( + {"object_class": key, "count": int(count)} + ) + + report_path = ( + self.report_root + / self.profile + / str(job.z) + / str(job.x) + / f"{job.y}.json" + ) + report_path.parent.mkdir(parents=True, exist_ok=True) + report_path.write_text( + json.dumps(report, ensure_ascii=False, indent=2, default=str), + encoding="utf-8", + ) + + trace_path = report_path.with_suffix(".trace.jsonl") + with trace_path.open("w", encoding="utf-8") as f: + for item in trace_rows: + f.write( + json.dumps(item, ensure_ascii=False, default=str) + + "\n" + ) + + return { + "tile": f"{job.z}/{job.x}/{job.y}", + "profile": self.profile, + "output_path": str(output_path), + "report_path": str(report_path), + "written": output_path.exists(), + "output_feature_count": report["output_feature_count"], + "output_layer_count": len(report["output_layer_counts"]), + "hard_gate_unmapped": report["hard_gate_unmapped"], + } + + def _validate_manifest_open(self, conn, manifest: FidManifest) -> None: + from .identity import dataset_fingerprint + expected = dataset_fingerprint(conn, self.dataset_id) + if manifest.get_meta("dataset_id") != str(self.dataset_id): + raise RuntimeError("fid manifest dataset_id mismatch") + if manifest.get_meta("dataset_fingerprint") != expected: + raise RuntimeError("fid manifest fingerprint mismatch; rebuild required") + + def _build_scale_regions( + self, + conn, + scales: list[int], + query_bbox_wgs: tuple[float, float, float, float], + expanded_box_m, + tile_box_m, + ) -> list[tuple[int, Any]]: + occupied = None + regions: list[tuple[int, Any]] = [] + for scale in scales: + coverage = self._coverage_for_scale( + conn, + scale, + query_bbox_wgs, + expanded_box_m, + ) + if coverage is None or coverage.is_empty: + regions.append((scale, GeometryCollection())) + continue + + coverage = coverage.intersection(expanded_box_m) + visible = coverage if occupied is None else coverage.difference(occupied) + visible = visible.intersection(expanded_box_m) + + if occupied is None: + occupied = coverage + else: + occupied = unary_union([occupied, coverage]) + + regions.append((scale, visible)) + return regions + + def _coverage_for_scale( + self, + conn, + scale: int, + query_bbox_wgs: tuple[float, float, float, float], + expanded_box_m, + ): + west, south, east, north = query_bbox_wgs + with conn.cursor() as cur: + cur.execute( + """ + SELECT + id, + bbox_min_lon, + bbox_min_lat, + bbox_max_lon, + bbox_max_lat + FROM chart_cell + WHERE dataset_id=%s + AND native_scale=%s + AND bbox_max_lon >= %s + AND bbox_min_lon <= %s + AND bbox_max_lat >= %s + AND bbox_min_lat <= %s + """, + ( + self.dataset_id, + scale, + west, + east, + south, + north, + ), + ) + cells = list(cur.fetchall()) + + if not cells: + return None + + cell_ids = [int(c["id"]) for c in cells] + placeholders = ",".join(["%s"] * len(cell_ids)) + with conn.cursor() as cur: + cur.execute( + f""" + SELECT + cell_id, + ST_AsWKB(geom) AS geom_wkb + FROM chart_coverage + WHERE dataset_id=%s + AND cell_id IN ({placeholders}) + """, + (self.dataset_id, *cell_ids), + ) + coverage_rows = list(cur.fetchall()) + + by_cell: dict[int, list[Any]] = defaultdict(list) + for row in coverage_rows: + geom = _loads_wkb(row["geom_wkb"]) + if geom is not None and not geom.is_empty: + by_cell[int(row["cell_id"])].append(_to_mercator_geom(geom)) + + pieces = [] + for cell in cells: + cid = int(cell["id"]) + if by_cell.get(cid): + pieces.append(unary_union(by_cell[cid])) + continue + minx, miny = lonlat_to_mercator( + float(cell["bbox_min_lon"]), + float(cell["bbox_min_lat"]), + ) + maxx, maxy = lonlat_to_mercator( + float(cell["bbox_max_lon"]), + float(cell["bbox_max_lat"]), + ) + pieces.append(box(minx, miny, maxx, maxy)) + + return unary_union(pieces).intersection(expanded_box_m) + + def _tile_envelope_wkt( + self, + bbox_wgs: tuple[float, float, float, float], + ) -> str: + west, south, east, north = bbox_wgs + return ( + "POLYGON((" + f"{west:.17g} {south:.17g}," + f"{east:.17g} {south:.17g}," + f"{east:.17g} {north:.17g}," + f"{west:.17g} {north:.17g}," + f"{west:.17g} {south:.17g}" + "))" + ) + + def _fetch_scale_features( + self, + conn, + scale: int, + bbox_wgs: tuple[float, float, float, float], + ) -> list[SourceFeature]: + west, south, east, north = bbox_wgs + envelope_wkt = self._tile_envelope_wkt(bbox_wgs) + rows: list[SourceFeature] = [] + + # v1.4.6: geometry table + R-tree SPATIAL index must drive candidate + # lookup. The previous chart_feature-first query caused MySQL 5.7 to + # inspect hundreds of thousands of feature rows per high-zoom tile. + # Keep the legacy numeric feature bbox predicates as a second gate so + # the candidate semantics remain bounded by the frozen v1.4.5 contract. + table_by_geom = { + "POINT": ("chart_point_geometry", "spx_point_geom"), + "LINE": ("chart_line_geometry", "spx_line_geom"), + "AREA": ("chart_area_geometry", "spx_area_geom"), + } + + for geometry_type, (table, spatial_index) in table_by_geom.items(): + geom_rows: list[SourceFeature] = [] + with conn.cursor() as cur: + cur.execute( + f""" + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class, + f.geometry_type, + f.native_scale, + f.coverage_id, + f.attributes_json, + ST_AsWKB(g.geom) AS geom_wkb + FROM {table} g FORCE INDEX ({spatial_index}) + STRAIGHT_JOIN chart_feature f ON f.id=g.feature_id + JOIN chart_cell c ON c.id=f.cell_id + WHERE MBRIntersects( + g.geom, + ST_GeomFromText(%s, 4326) + ) + AND f.dataset_id=%s + AND f.native_scale=%s + AND f.geometry_type=%s + AND f.bbox_max_lon >= %s + AND f.bbox_min_lon <= %s + AND f.bbox_max_lat >= %s + AND f.bbox_min_lat <= %s + """, + ( + envelope_wkt, + self.dataset_id, + scale, + geometry_type, + west, + east, + south, + north, + ), + ) + for row in cur.fetchall(): + geom = _loads_wkb(row["geom_wkb"]) + if geom is None or geom.is_empty: + continue + geom_rows.append( + SourceFeature( + feature_id=int(row["feature_id"]), + cell_id=int(row["cell_id"]), + source_relative_path=str(row["source_relative_path"]), + source_record_index=int(row["source_record_index"]), + object_class=str(row["object_class"]), + geometry_type=str(row["geometry_type"]), + native_scale=int(row["native_scale"]), + coverage_id=( + int(row["coverage_id"]) + if row["coverage_id"] is not None + else None + ), + attrs=_json_dict(row["attributes_json"]), + geom_wgs84=geom, + ) + ) + + # Preserve the exact v1.4.5 deterministic order *within each + # geometry class*. The outer POINT -> LINE -> AREA loop is also + # intentionally unchanged. Sorting in Python avoids MySQL + # temporary/filesort work on JSON + WKB rows. + geom_rows.sort( + key=lambda row: ( + row.source_relative_path, + row.source_record_index, + ) + ) + rows.extend(geom_rows) + + return rows + + def _fetch_scale_soundings( + self, + conn, + scale: int, + bbox_wgs: tuple[float, float, float, float], + ) -> list[dict[str, Any]]: + envelope_wkt = self._tile_envelope_wkt(bbox_wgs) + with conn.cursor() as cur: + cur.execute( + """ + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.native_scale, + f.attributes_json, + s.point_index, + s.depth, + ST_AsWKB(s.geom) AS geom_wkb + FROM chart_sounding_point s FORCE INDEX (spx_sounding_geom) + STRAIGHT_JOIN chart_feature f ON f.id=s.feature_id + JOIN chart_cell c ON c.id=f.cell_id + WHERE MBRContains( + ST_GeomFromText(%s, 4326), + s.geom + ) + AND f.dataset_id=%s + AND f.native_scale=%s + """, + ( + envelope_wkt, + self.dataset_id, + scale, + ), + ) + out = [] + for row in cur.fetchall(): + geom = _loads_wkb(row["geom_wkb"]) + if geom is None or geom.is_empty: + continue + out.append( + { + "feature_id": int(row["feature_id"]), + "cell_id": int(row["cell_id"]), + "source_relative_path": str(row["source_relative_path"]), + "source_record_index": int(row["source_record_index"]), + "native_scale": int(row["native_scale"]), + "attrs": _json_dict(row["attributes_json"]), + "point_index": int(row["point_index"]), + "depth": float(row["depth"]), + "geom_wgs84": geom, + } + ) + + out.sort( + key=lambda row: ( + row["source_relative_path"], + row["source_record_index"], + row["point_index"], + ) + ) + return out + + def _compose_navigation_aids( + self, + rows: list[SourceFeature], + manifest: FidManifest, + scale: int, + consumed: set[int], + trace_rows: list[dict[str, Any]], + ) -> list[dict[str, Any]]: + point_rows = [ + row + for row in rows + if row.geometry_type == "POINT" + and row.object_class in NAV_COMPONENT_CLASSES + ] + groups: dict[tuple[int, Any], list[SourceFeature]] = defaultdict(list) + standalone_lights: list[SourceFeature] = [] + + for row in point_rows: + relation = row.attrs.get("_cm93_relation20_raw") + if relation is None: + if row.object_class == "LIGHTS": + standalone_lights.append(row) + continue + groups[(row.cell_id, relation)].append(row) + + outputs: list[dict[str, Any]] = [] + + precedence = { + "BCNLAT": 0, + "BCNSPP": 1, + "BOYSPP": 2, + "RTPBCN": 3, + "TOWERS": 4, + "_extgn": 5, + } + + for (_cell_id, relation), members in sorted( + groups.items(), + key=lambda item: (item[0][0], str(item[0][1])), + ): + lights = [m for m in members if m.object_class == "LIGHTS"] + bases = [ + m for m in members + if m.object_class in precedence + ] + if not lights or not bases: + continue + + base = sorted( + bases, + key=lambda row: ( + precedence.get(row.object_class, 99), + row.source_record_index, + ), + )[0] + + props, name_meta = self._navigation_composite_properties(base, lights) + source_id = self.source_id(base) + fid = manifest.mvt_id(source_id, ROLE_PRIMARY) + + feature = { + "id": fid, + "geometry": shapely_mapping(base.geom_wgs84), + "properties": self._final_properties( + props, + base, + source_id, + mapping_rule_id="CM95-NAV-COMPOSITE", + mapping_status="COMPOSITE", + extra_engineering={ + "relation20": relation, + "source_component_ids": [ + self.source_id(m) for m in members + ], + "nav_name_source": name_meta["source"], + "nav_name_candidates": name_meta["candidates"], + "nav_name_conflict": name_meta["conflict"], + }, + ), + } + outputs.append( + { + "layer": "navigation_marks", + "feature": feature, + "composite": True, + "component_feature_ids": [m.feature_id for m in members], + "name_source": name_meta["source"], + "name_conflict": name_meta["conflict"], + } + ) + for member in members: + consumed.add(member.feature_id) + + trace_rows.append( + { + "output_id": fid, + "output_layer": "navigation_marks", + "source_id": source_id, + "source_component_ids": [ + self.source_id(m) for m in members + ], + "relation20": relation, + "native_scale": scale, + "mapping_rule_id": "CM95-NAV-COMPOSITE", + "mapping_status": "COMPOSITE", + "nav_name_source": name_meta["source"], + "nav_name_candidates": name_meta["candidates"], + "nav_name_conflict": name_meta["conflict"], + } + ) + + for light in standalone_lights: + rule = self.mapping.resolve("LIGHTS", "POINT") + if rule is None: + continue + props = self.mapping.evaluate_fields( + rule.get("style_fields", {}), + light.attrs, + ) + props.setdefault("canonical_object_type", "minor_light") + props.setdefault("chart_symbol_code", "minor_light") + props.setdefault("chart_icon_image", "light_minor") + direct_name = first_direct_name(light.attrs) + if direct_name: + props.setdefault("chart_label_text", direct_name) + source_id = self.source_id(light) + fid = manifest.mvt_id(source_id, ROLE_PRIMARY) + feature = { + "id": fid, + "geometry": shapely_mapping(light.geom_wgs84), + "properties": self._final_properties( + props, + light, + source_id, + mapping_rule_id=str(rule.get("rule_id")), + mapping_status="COMPOSITE_STANDALONE_LIGHT", + extra_engineering={ + "nav_name_source": ( + "direct_source" if direct_name else "none" + ), + "nav_name_candidates": ( + [direct_name] if direct_name else [] + ), + "nav_name_conflict": False, + }, + ), + } + outputs.append( + { + "layer": "navigation_marks", + "feature": feature, + "standalone_light": True, + "name_source": ( + "direct_source" if direct_name else "none" + ), + "name_conflict": False, + } + ) + consumed.add(light.feature_id) + trace_rows.append( + { + "output_id": fid, + "output_layer": "navigation_marks", + "source_id": source_id, + "native_scale": scale, + "mapping_rule_id": str(rule.get("rule_id")), + "mapping_status": "COMPOSITE_STANDALONE_LIGHT", + "nav_name_source": ( + "direct_source" if direct_name else "none" + ), + "nav_name_candidates": ( + [direct_name] if direct_name else [] + ), + "nav_name_conflict": False, + } + ) + + return outputs + + def _navigation_composite_properties( + self, + base: SourceFeature, + lights: list[SourceFeature], + ) -> tuple[dict[str, Any], dict[str, Any]]: + # Prefer the richest LIGHTS record; groups with multiple lights remain one semantic mark. + light = sorted( + lights, + key=lambda item: ( + -sum(1 for v in item.attrs.values() if v not in (None, "", [], {})), + item.source_record_index, + ), + )[0] + lattrs = light.attrs + battrs = base.attrs + + props: dict[str, Any] = { + "chart_text_style": "light_label", + "chart_text_color": "#000000", + "chart_label_position_code": "l", + "light_color_code": s57_light_color(lattrs.get("COLOUR")), + "light_sector_mode": ( + "sector" + if lattrs.get("SECTR1") is not None or lattrs.get("SECTR2") is not None + else "omni" + ), + } + + # Name contract v1: + # - only source-owned OBJNAM/NOBJNM are eligible; + # - _texto proximity is never used; + # - base name wins when present; + # - otherwise one unique light name is accepted; + # - multiple conflicting light names are kept only in engineering trace. + base_name = first_direct_name(battrs) + light_names = unique_direct_names([item.attrs for item in lights]) + all_name_candidates: list[str] = [] + if base_name: + all_name_candidates.append(base_name) + for item in light_names: + if item not in all_name_candidates: + all_name_candidates.append(item) + + label = None + name_source = "none" + name_conflict = False + if base_name: + label = base_name + name_source = "direct_source" + elif len(light_names) == 1: + label = light_names[0] + name_source = "direct_source" + elif len(light_names) > 1: + name_conflict = True + name_source = "conflict" + + if label: + props["chart_label_text"] = label + + subtexts = [] + for item in lights: + text = format_light_abbreviation(item.attrs) + if text and text not in subtexts: + subtexts.append(text) + if subtexts: + props["chart_label_subtext"] = " / ".join(subtexts) + + if base.object_class == "BCNLAT": + props.update( + { + "canonical_object_type": "light_beacon", + "chart_symbol_code": "beacon", + "chart_icon_image": nav_icon_from_bcnlat(battrs, lighted=True), + } + ) + elif base.object_class == "BCNSPP": + props.update( + { + "canonical_object_type": "light_beacon", + "chart_symbol_code": "beacon", + "chart_icon_image": nav_icon_from_bcnspp(battrs, lighted=True), + } + ) + elif base.object_class == "BOYSPP": + props.update( + { + "canonical_object_type": "lattice_buoy", + "chart_symbol_code": "buoy", + "chart_icon_image": nav_icon_from_boyspp(battrs, lighted=True), + } + ) + elif base.object_class == "RTPBCN": + props.update( + { + "canonical_object_type": "light_beacon", + "chart_symbol_code": "beacon", + "chart_icon_image": nav_icon_from_rtpbcn(battrs, lighted=True), + } + ) + elif base.object_class == "TOWERS": + try: + height = max( + float(lattrs.get("HEIGHT") or 0), + float(battrs.get("VERLEN") or 0), + ) + except Exception: + height = 0 + try: + nominal_range = float(lattrs.get("VALNMR") or 0) + except Exception: + nominal_range = 0 + props.update( + { + "canonical_object_type": ( + "coastal_lighthouse_over_15m" + if height >= 15 or nominal_range >= 10 + else "harbor_lighthouse" + ), + "chart_symbol_code": "lighthouse", + "chart_icon_image": "lighthouse_harbor", + } + ) + else: + props.update( + { + "canonical_object_type": "minor_light", + "chart_symbol_code": "minor_light", + "chart_icon_image": "light_minor", + } + ) + + clean_props = { + key: value + for key, value in props.items() + if value is not None and value != "" + } + return clean_props, { + "source": name_source, + "candidates": all_name_candidates, + "conflict": name_conflict, + } + + def _append_main_output( + self, + layer_features, + manifest, + row: SourceFeature, + rule: dict[str, Any], + trace_rows, + ) -> None: + target = str(rule.get("target_source_layer")) + props = { + "canonical_object_type": str(rule.get("canonical_object_type") or ""), + } + props.update( + self.mapping.evaluate_fields( + rule.get("style_fields", {}), + row.attrs, + ) + ) + + fill_style = props.get("chart_fill_style") + if isinstance(fill_style, str) and fill_style.startswith("depth_zone_"): + props["canonical_object_type"] = fill_style[len("depth_zone_"):] + + source_id = self.source_id(row) + fid = manifest.mvt_id(source_id, ROLE_PRIMARY) + + layer_features[target].append( + { + "id": fid, + "geometry": shapely_mapping(row.geom_wgs84), + "properties": self._final_properties( + props, + row, + source_id, + mapping_rule_id=str(rule.get("rule_id")), + mapping_status=str(rule.get("mapping_status")), + ), + } + ) + trace_rows.append( + { + "output_id": fid, + "output_layer": target, + "source_id": source_id, + "native_scale": row.native_scale, + "mapping_rule_id": str(rule.get("rule_id")), + "mapping_status": str(rule.get("mapping_status")), + } + ) + + def _append_derived_outputs( + self, + layer_features, + manifest, + row: SourceFeature, + rule: dict[str, Any], + trace_rows, + allow_delivery: bool, + ) -> None: + derived_outputs = rule.get("derived_outputs") or [] + if not derived_outputs: + return + + status = str(rule.get("mapping_status") or "") + if self.profile == "delivery" and status not in DELIVERY_DERIVED_STATUSES: + return + + for item in derived_outputs: + if not self.mapping.eval_condition(item.get("condition"), row.attrs): + continue + + geometry_mode = str(item.get("geometry") or "") + if geometry_mode == "boundary": + geom = row.geom_wgs84.boundary + role = ROLE_BOUNDARY + geom_type = "LINE" + elif geometry_mode == "point_on_surface": + geom = row.geom_wgs84.representative_point() + role = ROLE_POINT_ON_SURFACE + geom_type = "POINT" + else: + continue + + geom = _extract_dimensional(geom, geom_type) + if geom is None or geom.is_empty: + continue + + target = str(item.get("source_layer") or "") + if not target or target == "cm95_unmapped": + continue + + props = self.mapping.evaluate_fields( + item.get("style_fields", {}), + row.attrs, + ) + props.setdefault( + "canonical_object_type", + str(rule.get("canonical_object_type") or ""), + ) + + source_id = self.source_id(row) + fid = manifest.mvt_id(source_id, role) + layer_features[target].append( + { + "id": fid, + "geometry": shapely_mapping(geom), + "properties": self._final_properties( + props, + row, + source_id, + mapping_rule_id=str(rule.get("rule_id")), + mapping_status=f"{status}:DERIVED:{geometry_mode}", + ), + } + ) + trace_rows.append( + { + "output_id": fid, + "output_layer": target, + "source_id": source_id, + "native_scale": row.native_scale, + "mapping_rule_id": str(rule.get("rule_id")), + "mapping_status": f"{status}:DERIVED:{geometry_mode}", + } + ) + + def _append_unmapped( + self, + layer_features, + manifest, + row: SourceFeature, + status: str, + trace_rows, + rule: dict[str, Any] | None = None, + ) -> None: + source_id = self.source_id(row) + fid = manifest.mvt_id(source_id, ROLE_PRIMARY) + props = { + "canonical_object_type": ( + str(rule.get("canonical_object_type")) + if rule else "unmapped" + ), + "source_object_class": row.object_class, + "mapping_status": status, + "source_attr_json": json.dumps( + row.attrs, + ensure_ascii=False, + separators=(",", ":"), + default=str, + ), + } + layer_features["cm95_unmapped"].append( + { + "id": fid, + "geometry": shapely_mapping(row.geom_wgs84), + "properties": self._final_properties( + props, + row, + source_id, + mapping_rule_id=( + str(rule.get("rule_id")) if rule else "NO_RULE" + ), + mapping_status=status, + ), + } + ) + trace_rows.append( + { + "output_id": fid, + "output_layer": "cm95_unmapped", + "source_id": source_id, + "native_scale": row.native_scale, + "mapping_rule_id": ( + str(rule.get("rule_id")) if rule else "NO_RULE" + ), + "mapping_status": status, + } + ) + + def _append_sounding_output( + self, + layer_features, + manifest, + row: dict[str, Any], + point_m, + trace_rows, + ) -> None: + rule = self.mapping.resolve("SOUNDG", "SOUNDING") + if rule is None: + return + + source_id = sounding_source_key( + self.dataset_id, + row["source_relative_path"], + row["source_record_index"], + row["point_index"], + ) + fid = manifest.mvt_id(source_id, ROLE_PRIMARY) + attrs = dict(row["attrs"]) + context = { + "chart_sounding_point": { + "depth": row["depth"], + } + } + props = { + "canonical_object_type": str(rule.get("canonical_object_type") or "sounding"), + } + props.update( + self.mapping.evaluate_fields( + rule.get("style_fields", {}), + attrs, + context=context, + ) + ) + + fake = SourceFeature( + feature_id=row["feature_id"], + cell_id=row["cell_id"], + source_relative_path=row["source_relative_path"], + source_record_index=row["source_record_index"], + object_class="SOUNDG", + geometry_type="SOUNDING", + native_scale=row["native_scale"], + coverage_id=None, + attrs=attrs, + geom_wgs84=point_m, + ) + + layer_features["seabed_text_point"].append( + { + "id": fid, + "geometry": shapely_mapping(point_m), + "properties": self._final_properties( + props, + fake, + source_id, + mapping_rule_id=str(rule.get("rule_id")), + mapping_status=str(rule.get("mapping_status")), + extra_engineering={"sounding_point_index": row["point_index"]}, + ), + } + ) + trace_rows.append( + { + "output_id": fid, + "output_layer": "seabed_text_point", + "source_id": source_id, + "native_scale": row["native_scale"], + "mapping_rule_id": str(rule.get("rule_id")), + "mapping_status": str(rule.get("mapping_status")), + } + ) + + def _final_properties( + self, + props: dict[str, Any], + row: SourceFeature, + source_id: str, + mapping_rule_id: str, + mapping_status: str, + extra_engineering: dict[str, Any] | None = None, + ) -> dict[str, Any]: + props = _sanitize_properties(props) + + if self.profile == "delivery": + return self.mapping.minimize_delivery_properties(props) + + engineering = dict(props) + engineering.update( + { + "fid": str(source_id), + "source_id": source_id, + "source_dataset_id": self.dataset_id, + "source_cell": row.source_relative_path, + "source_record_index": row.source_record_index, + "source_object_class": row.object_class, + "source_geometry_type": row.geometry_type, + "native_scale": row.native_scale, + "mapping_rule_id": mapping_rule_id, + "mapping_status": mapping_status, + "source_attr_json": json.dumps( + row.attrs, + ensure_ascii=False, + separators=(",", ":"), + default=str, + ), + } + ) + if extra_engineering: + engineering.update(extra_engineering) + return _sanitize_properties(engineering) diff --git a/src/cm95pbf/cli.py b/src/cm95pbf/cli.py new file mode 100644 index 0000000..73472df --- /dev/null +++ b/src/cm95pbf/cli.py @@ -0,0 +1,360 @@ +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +from cm93db.config import load_config + +from .builder import Cm95TileBuilder, TileJob +from .identity import build_manifest +from .policy import child_tiles +from .production import ( + create_production_plan, + migrate_production_release, + parse_zooms, + production_status, + run_production_plan, +) +from .release import finalize_release + + +DEFAULT_MAPPING = Path("config/mappings/cm95_to_navsea_v1.yaml") +DEFAULT_POLICY = Path("config/pbf/cm95_tile_policy_v1.yaml") +DEFAULT_MANIFEST = Path("build/cm95_fid_manifest_v1.sqlite") + + +def _add_common_db(p): + p.add_argument("--dataset-id", type=int, default=1) + + +def build_parser() -> argparse.ArgumentParser: + p = argparse.ArgumentParser( + prog="cm95pbf", + description="CM95 MySQL → NavSea-compatible MVT/PBF pilot generator", + ) + sub = p.add_subparsers(dest="command", required=True) + + manifest = sub.add_parser( + "build-fid-manifest", + help="建立全 Dataset 确定性 int32 MVT Feature ID 清单", + ) + _add_common_db(manifest) + manifest.add_argument("--manifest", default=str(DEFAULT_MANIFEST)) + manifest.add_argument("--rebuild-fid-manifest", action="store_true") + + tile = sub.add_parser( + "build-tile", + help="生成单张 CM95 NavSea-compatible PBF", + ) + _add_common_db(tile) + tile.add_argument("--z", type=int, required=True) + tile.add_argument("--x", type=int, required=True) + tile.add_argument("--y", type=int, required=True) + tile.add_argument("--profile", choices=["engineering", "delivery"], default="delivery") + tile.add_argument("--mapping", default=str(DEFAULT_MAPPING)) + tile.add_argument("--policy", default=str(DEFAULT_POLICY)) + tile.add_argument("--manifest", default=str(DEFAULT_MANIFEST)) + tile.add_argument("--output-root", default="build/pbf") + tile.add_argument("--report-root", default="build/pbf-reports") + + sample = sub.add_parser( + "build-sample-aoi", + help="生成 z10 parent + z11 children + z12 grandchildren,共 21 张测试 tile", + ) + _add_common_db(sample) + sample.add_argument("--z10-x", type=int, default=914) + sample.add_argument("--z10-y", type=int, default=385) + sample.add_argument( + "--profiles", + default="engineering,delivery", + help="逗号分隔:engineering,delivery", + ) + sample.add_argument("--mapping", default=str(DEFAULT_MAPPING)) + sample.add_argument("--policy", default=str(DEFAULT_POLICY)) + sample.add_argument("--manifest", default=str(DEFAULT_MANIFEST)) + sample.add_argument("--output-root", default="build/pbf") + sample.add_argument("--report-root", default="build/pbf-reports") + + + prod_plan = sub.add_parser( + "plan-production", + help="按 Dataset coverage 枚举生产 tile,并冻结不可变生成计划", + ) + _add_common_db(prod_plan) + prod_plan.add_argument("--zooms", default="0-12", help="缩放级别,支持 0-12 或 0,1,...,12") + prod_plan.add_argument("--profile", choices=["engineering", "delivery"], default="delivery") + prod_plan.add_argument("--mapping", default=str(DEFAULT_MAPPING)) + prod_plan.add_argument("--policy", default=str(DEFAULT_POLICY)) + prod_plan.add_argument("--manifest", default=str(DEFAULT_MANIFEST)) + prod_plan.add_argument("--output", default="build/production/cm95_production_plan_v1.json") + + prod_build = sub.add_parser( + "build-production", + help="按冻结计划批量生成,支持断点续跑、并发和失败重试", + ) + prod_build.add_argument("--plan", default="build/production/cm95_production_plan_v1.json") + prod_build.add_argument("--release-root", default="build/releases") + prod_build.add_argument("--workers", type=int, default=4) + prod_build.add_argument("--max-attempts", type=int, default=3) + + prod_migrate = sub.add_parser( + "migrate-production-release", + help="把旧 release 的 delivery-equivalent PASS tile 复用到新计划,只重建受影响/失败任务(支持 builder contract 升级)", + ) + prod_migrate.add_argument("--old-release-dir", required=True) + prod_migrate.add_argument("--new-plan", default="build/production/cm95_production_plan_v1_4_5.json") + prod_migrate.add_argument("--release-root", default="build/releases") + prod_migrate.add_argument("--copy-mode", choices=["hardlink", "copy"], default="hardlink") + prod_migrate.add_argument( + "--invalidate-tiles-file", + default=None, + help="每行一个 z/x/y;这些旧 PASS tile 强制留为 PENDING,适用于 builder contract 的定向重建", + ) + + prod_status = sub.add_parser( + "status-production", + help="查看生产计划当前账本状态", + ) + prod_status.add_argument("--plan", default="build/production/cm95_production_plan_v1.json") + prod_status.add_argument("--release-root", default="build/releases") + + prod_final = sub.add_parser( + "finalize-production", + help="对完成的生产产物做三方计数/FID/哈希盘点并生成 release manifest", + ) + prod_final.add_argument("--plan", default="build/production/cm95_production_plan_v1.json") + prod_final.add_argument("--release-root", default="build/releases") + prod_final.add_argument("--style", default="config/style/style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json") + prod_final.add_argument("--sprite-json", default="config/sprite/semantic-sprite-20260808.json") + prod_final.add_argument("--gap-disposition", default="config/mappings/cm95_gap_disposition_v1.yaml") + + return p + + +def ensure_manifest(dataset_id: int, manifest_path: Path) -> dict: + cfg = load_config() + with __import__("pymysql").connect( + host=cfg.host, + port=cfg.port, + user=cfg.user, + password=cfg.password, + database=cfg.database, + charset=cfg.charset, + cursorclass=__import__("pymysql").cursors.DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + ) as conn: + return build_manifest( + conn, + dataset_id, + manifest_path, + rebuild=False, + ) + + +def main() -> None: + args = build_parser().parse_args() + cfg = load_config() + + if args.command == "plan-production": + manifest_path = Path(args.manifest) + if not manifest_path.exists(): + print("FID manifest 不存在,先自动建立。") + print(json.dumps(ensure_manifest(args.dataset_id, manifest_path), ensure_ascii=False, indent=2)) + result = create_production_plan( + db=cfg, + dataset_id=args.dataset_id, + mapping_path=Path(args.mapping), + policy_path=Path(args.policy), + manifest_path=manifest_path, + output_path=Path(args.output), + zooms=parse_zooms(args.zooms), + profile=args.profile, + ) + print(json.dumps({ + "plan_id": result["plan_id"], + "release_id": result["release_id"], + "job_count": result["job_count"], + "source_stats": result["source_stats"], + "output": str(Path(args.output)), + }, ensure_ascii=False, indent=2)) + return + + if args.command == "build-production": + result = run_production_plan( + db=cfg, + plan_path=Path(args.plan), + release_root=Path(args.release_root), + workers=args.workers, + max_attempts=args.max_attempts, + ) + print(json.dumps(result, ensure_ascii=False, indent=2)) + states = result.get("states") or {} + if states.get("FAILED", 0) or states.get("PENDING", 0) or states.get("RUNNING", 0): + raise SystemExit(2) + return + + if args.command == "migrate-production-release": + result = migrate_production_release( + old_release_dir=Path(args.old_release_dir), + new_plan_path=Path(args.new_plan), + release_root=Path(args.release_root), + copy_mode=args.copy_mode, + invalidate_tiles_file=(Path(args.invalidate_tiles_file) if args.invalidate_tiles_file else None), + ) + print(json.dumps(result, ensure_ascii=False, indent=2)) + return + + if args.command == "status-production": + print(json.dumps(production_status(Path(args.plan), Path(args.release_root)), ensure_ascii=False, indent=2)) + return + + if args.command == "finalize-production": + result = finalize_release( + Path(args.plan), + Path(args.release_root), + Path(args.style) if args.style else None, + Path(args.sprite_json) if args.sprite_json else None, + Path(args.gap_disposition) if args.gap_disposition else None, + ) + print(json.dumps({ + "status": result["status"], + "release_id": result["release_id"], + "planned_tile_jobs": result["planned_tile_jobs"], + "pbf_file_count": result["pbf_file_count"], + "planned_output_features": result["planned_output_features"], + "decoded_pbf_features": result["decoded_pbf_features"], + "semantic_completeness": result.get("semantic_completeness"), + "semantic_backlog": result.get("semantic_backlog"), + "non_renderable_omissions": result.get("non_renderable_omissions"), + "non_renderable_omission_layers": result.get("non_renderable_omission_layers"), + "style_sprite_contract": { + "overall": (result.get("style_sprite_contract") or {}).get("overall"), + "contract_unmatched_count": (result.get("style_sprite_contract") or {}).get("contract_unmatched_count"), + "sprite_missing_count": (result.get("style_sprite_contract") or {}).get("sprite_missing_count"), + }, + "quantization_fallbacks": result.get("quantization_fallbacks"), + "quantization_omissions": result.get("quantization_omissions"), + "nav_name_conflict_audit": { + "overall": (result.get("nav_name_conflict_audit") or {}).get("overall"), + "policy": (result.get("nav_name_conflict_audit") or {}).get("policy"), + "report_occurrences": (result.get("nav_name_conflict_audit") or {}).get("report_occurrences"), + "trace_occurrences": (result.get("nav_name_conflict_audit") or {}).get("trace_occurrences"), + "safe_omission_occurrences": (result.get("nav_name_conflict_audit") or {}).get("safe_omission_occurrences"), + "unique_conflict_outputs": (result.get("nav_name_conflict_audit") or {}).get("unique_conflict_outputs"), + "affected_tiles": (result.get("nav_name_conflict_audit") or {}).get("affected_tiles"), + }, + "failures": result["failures"], + }, ensure_ascii=False, indent=2)) + if result["status"] != "PASS": + raise SystemExit(2) + return + + if args.command == "build-fid-manifest": + import pymysql + with pymysql.connect( + host=cfg.host, + port=cfg.port, + user=cfg.user, + password=cfg.password, + database=cfg.database, + charset=cfg.charset, + cursorclass=pymysql.cursors.DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + ) as conn: + result = build_manifest( + conn, + args.dataset_id, + Path(args.manifest), + rebuild=bool(args.rebuild_fid_manifest), + ) + print(json.dumps(result, ensure_ascii=False, indent=2)) + return + + manifest_path = Path(args.manifest) + if not manifest_path.exists(): + print("FID manifest 不存在,先自动建立。") + print( + json.dumps( + ensure_manifest(args.dataset_id, manifest_path), + ensure_ascii=False, + indent=2, + ) + ) + + if args.command == "build-tile": + builder = Cm95TileBuilder( + db=cfg, + dataset_id=args.dataset_id, + mapping_path=Path(args.mapping), + policy_path=Path(args.policy), + fid_manifest_path=manifest_path, + output_root=Path(args.output_root) / args.profile, + report_root=Path(args.report_root), + profile=args.profile, + ) + result = builder.build_tile( + TileJob(args.z, args.x, args.y) + ) + print(json.dumps(result, ensure_ascii=False, indent=2)) + return + + if args.command == "build-sample-aoi": + profiles = [ + token.strip() + for token in str(args.profiles).split(",") + if token.strip() + ] + for profile in profiles: + if profile not in {"engineering", "delivery"}: + raise SystemExit(f"invalid profile: {profile}") + + jobs = [(10, args.z10_x, args.z10_y)] + jobs.extend(child_tiles(10, args.z10_x, args.z10_y, 11)) + jobs.extend(child_tiles(10, args.z10_x, args.z10_y, 12)) + + results = [] + for profile in profiles: + builder = Cm95TileBuilder( + db=cfg, + dataset_id=args.dataset_id, + mapping_path=Path(args.mapping), + policy_path=Path(args.policy), + fid_manifest_path=manifest_path, + output_root=Path(args.output_root) / profile, + report_root=Path(args.report_root), + profile=profile, + ) + for z, x, y in jobs: + result = builder.build_tile(TileJob(z, x, y)) + results.append(result) + print( + f"[{profile}] {z}/{x}/{y} " + f"features={result['output_feature_count']} " + f"layers={result['output_layer_count']} " + f"hard_gate_unmapped={len(result['hard_gate_unmapped'])}" + ) + + summary = { + "dataset_id": args.dataset_id, + "root_tile": f"10/{args.z10_x}/{args.z10_y}", + "profiles": profiles, + "tile_count_per_profile": len(jobs), + "results": results, + } + summary_path = Path(args.report_root) / "sample_aoi_summary_v1.json" + summary_path.parent.mkdir(parents=True, exist_ok=True) + summary_path.write_text( + json.dumps(summary, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + print(f"SUMMARY: {summary_path}") + return + + +if __name__ == "__main__": + main() diff --git a/src/cm95pbf/identity.py b/src/cm95pbf/identity.py new file mode 100644 index 0000000..bd58d74 --- /dev/null +++ b/src/cm95pbf/identity.py @@ -0,0 +1,329 @@ +from __future__ import annotations + +import hashlib +from pathlib import Path +import sqlite3 +from typing import Iterable + +ROLE_PRIMARY = 0 +ROLE_BOUNDARY = 1 +ROLE_POINT_ON_SURFACE = 2 +ROLE_SECONDARY = 3 +ROLE_FACTOR = 16 +MAX_SIGNED_INT32 = (1 << 31) - 1 + + +def feature_source_key( + dataset_id: int, + source_relative_path: str, + source_record_index: int, + geometry_type: str, +) -> str: + path = str(source_relative_path).replace("\\", "/") + return ( + f"cm95:{int(dataset_id)}:{path}:" + f"{int(source_record_index)}:{str(geometry_type).lower()}" + ) + + +def sounding_source_key( + dataset_id: int, + source_relative_path: str, + source_record_index: int, + point_index: int, +) -> str: + return ( + feature_source_key( + dataset_id, + source_relative_path, + source_record_index, + "SOUNDING", + ) + + f":point:{int(point_index)}" + ) + + +def dataset_fingerprint(conn, dataset_id: int) -> str: + h = hashlib.sha256() + with conn.cursor() as cur: + cur.execute( + """ + SELECT + source_relative_path, + COALESCE(source_sha256,'') AS source_sha256, + source_size, + scale_code, + native_scale + FROM chart_cell + WHERE dataset_id=%s + ORDER BY source_relative_path + """, + (dataset_id,), + ) + for row in cur.fetchall(): + line = ( + f"{row['source_relative_path']}|{row['source_sha256']}|" + f"{row['source_size']}|{row['scale_code']}|{row['native_scale']}\n" + ) + h.update(line.encode("utf-8")) + return h.hexdigest() + + +class FidManifest: + def __init__(self, path: Path): + self.path = Path(path) + self.db: sqlite3.Connection | None = None + + def open(self) -> "FidManifest": + self.path.parent.mkdir(parents=True, exist_ok=True) + self.db = sqlite3.connect(self.path) + self.db.row_factory = sqlite3.Row + return self + + def close(self) -> None: + if self.db is not None: + self.db.close() + self.db = None + + def __enter__(self) -> "FidManifest": + return self.open() + + def __exit__(self, exc_type, exc, tb) -> None: + self.close() + + def _require(self) -> sqlite3.Connection: + if self.db is None: + raise RuntimeError("manifest not open") + return self.db + + def init_schema(self) -> None: + db = self._require() + db.executescript( + """ + CREATE TABLE IF NOT EXISTS manifest_meta ( + k TEXT PRIMARY KEY, + v TEXT NOT NULL + ); + CREATE TABLE IF NOT EXISTS manifest_identity ( + source_key TEXT PRIMARY KEY, + base_ord INTEGER NOT NULL UNIQUE, + source_kind TEXT NOT NULL + ); + CREATE INDEX IF NOT EXISTS idx_manifest_identity_ord + ON manifest_identity(base_ord); + """ + ) + db.commit() + + def clear(self) -> None: + db = self._require() + self.init_schema() + db.execute("DELETE FROM manifest_identity") + db.execute("DELETE FROM manifest_meta") + db.commit() + + def set_meta(self, key: str, value: str) -> None: + db = self._require() + db.execute( + "INSERT OR REPLACE INTO manifest_meta(k,v) VALUES(?,?)", + (str(key), str(value)), + ) + + def get_meta(self, key: str) -> str | None: + db = self._require() + row = db.execute( + "SELECT v FROM manifest_meta WHERE k=?", + (str(key),), + ).fetchone() + return None if row is None else str(row["v"]) + + def insert_many(self, rows: Iterable[tuple[str, int, str]]) -> None: + db = self._require() + db.executemany( + """ + INSERT INTO manifest_identity(source_key,base_ord,source_kind) + VALUES(?,?,?) + """, + rows, + ) + + def commit(self) -> None: + self._require().commit() + + def base_ord(self, source_key: str) -> int: + db = self._require() + row = db.execute( + "SELECT base_ord FROM manifest_identity WHERE source_key=?", + (source_key,), + ).fetchone() + if row is None: + raise KeyError(f"source identity missing from manifest: {source_key}") + return int(row["base_ord"]) + + def mvt_id(self, source_key: str, role_code: int = ROLE_PRIMARY) -> int: + if role_code < 0 or role_code >= ROLE_FACTOR: + raise ValueError(f"invalid role code: {role_code}") + value = self.base_ord(source_key) * ROLE_FACTOR + int(role_code) + if value > MAX_SIGNED_INT32: + raise RuntimeError( + "deterministic fid exceeded signed int32; " + "increase identity design before publishing" + ) + return value + + +def build_manifest( + mysql_conn, + dataset_id: int, + manifest_path: Path, + rebuild: bool = False, +) -> dict: + fingerprint = dataset_fingerprint(mysql_conn, dataset_id) + + with FidManifest(manifest_path) as manifest: + manifest.init_schema() + + old_dataset = manifest.get_meta("dataset_id") + old_fingerprint = manifest.get_meta("dataset_fingerprint") + + if old_dataset is not None and not rebuild: + if old_dataset == str(dataset_id) and old_fingerprint == fingerprint: + count = int( + manifest._require() + .execute("SELECT COUNT(*) FROM manifest_identity") + .fetchone()[0] + ) + return { + "status": "REUSED", + "dataset_id": dataset_id, + "dataset_fingerprint": fingerprint, + "identity_count": count, + "manifest": str(manifest_path), + } + raise RuntimeError( + "existing fid manifest belongs to a different dataset state; " + "run with --rebuild-fid-manifest" + ) + + manifest.clear() + + base_ord = 0 + batch: list[tuple[str, int, str]] = [] + + with mysql_conn.cursor() as cur: + cur.execute( + """ + SELECT + c.source_relative_path, + f.source_record_index, + f.geometry_type + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + ORDER BY + c.source_relative_path, + f.source_record_index, + f.geometry_type + """, + (dataset_id,), + ) + while True: + mysql_batch = cur.fetchmany(5000) + if not mysql_batch: + break + for row in mysql_batch: + base_ord += 1 + batch.append( + ( + feature_source_key( + dataset_id, + row["source_relative_path"], + row["source_record_index"], + row["geometry_type"], + ), + base_ord, + "feature", + ) + ) + manifest.insert_many(batch) + batch.clear() + + feature_identity_count = base_ord + + cur.execute( + """ + SELECT + c.source_relative_path, + f.source_record_index, + s.point_index + FROM chart_sounding_point s + JOIN chart_feature f ON f.id=s.feature_id + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + ORDER BY + c.source_relative_path, + f.source_record_index, + s.point_index + """, + (dataset_id,), + ) + while True: + mysql_batch = cur.fetchmany(5000) + if not mysql_batch: + break + for row in mysql_batch: + base_ord += 1 + batch.append( + ( + sounding_source_key( + dataset_id, + row["source_relative_path"], + row["source_record_index"], + row["point_index"], + ), + base_ord, + "sounding_point", + ) + ) + manifest.insert_many(batch) + batch.clear() + + manifest.set_meta("schema", "navsea.cm95.fid-manifest/v1") + manifest.set_meta("dataset_id", str(dataset_id)) + manifest.set_meta("dataset_fingerprint", fingerprint) + manifest.set_meta("role_factor", str(ROLE_FACTOR)) + manifest.set_meta("feature_identity_count", str(feature_identity_count)) + manifest.set_meta("identity_count", str(base_ord)) + manifest.commit() + + return { + "status": "BUILT", + "dataset_id": dataset_id, + "dataset_fingerprint": fingerprint, + "feature_identity_count": feature_identity_count, + "identity_count": base_ord, + "manifest": str(manifest_path), + } + + +def validate_manifest(mysql_conn, dataset_id: int, manifest_path: Path) -> dict: + fingerprint = dataset_fingerprint(mysql_conn, dataset_id) + with FidManifest(manifest_path) as manifest: + manifest.init_schema() + dataset = manifest.get_meta("dataset_id") + stored_fp = manifest.get_meta("dataset_fingerprint") + if dataset != str(dataset_id) or stored_fp != fingerprint: + raise RuntimeError( + "fid manifest does not match current dataset; rebuild required" + ) + count = int( + manifest._require() + .execute("SELECT COUNT(*) FROM manifest_identity") + .fetchone()[0] + ) + return { + "dataset_id": dataset_id, + "dataset_fingerprint": fingerprint, + "identity_count": count, + "manifest": str(manifest_path), + } diff --git a/src/cm95pbf/mapping.py b/src/cm95pbf/mapping.py new file mode 100644 index 0000000..1d0b23d --- /dev/null +++ b/src/cm95pbf/mapping.py @@ -0,0 +1,495 @@ +from __future__ import annotations + +import json +from pathlib import Path +from typing import Any + +import yaml + + +DELIVERY_PROPERTY_ALLOWLIST = frozenset( + { + "canonical_object_type", + "class_code", + "chart_fill_pattern", + "chart_fill_style", + "chart_icon_image", + "chart_label_position_code", + "chart_label_subtext", + "chart_label_text", + "chart_line_color", + "chart_line_width", + "chart_symbol_code", + "chart_text_color", + "chart_text_style", + "clearance_height_m", + "depth_value_m", + "display_code", + "least_depth_m", + "light_color_code", + "light_sector_mode", + "arc_id", + "arc_source_code", + "name_ja", + "place_name_en", + "shape_class_code", + } +) + +DELIVERY_MAIN_STATUSES = frozenset( + { + "MAPPED", + "MAPPED_CONDITIONAL", + "COMPOSITE", + "MAPPED_DERIVED_POINTS", + } +) + +DELIVERY_DERIVED_STATUSES = frozenset( + { + "MAPPED", + "MAPPED_CONDITIONAL", + "DERIVED_LABEL_ONLY", + } +) + +NAV_COMPONENT_CLASSES = frozenset( + { + "LIGHTS", + "BCNLAT", + "BCNSPP", + "BOYSPP", + "RTPBCN", + "TOWERS", + "_extgn", + } +) + +LIGHT_COLOUR = { + 1: ("white", "W"), + 3: ("red", "R"), + 4: ("green", "G"), + 6: ("yellow", "Y"), +} + +LIGHT_CHARACTER = { + 1: "F", + 2: "Fl", + 3: "LFl", + 4: "Q", + 5: "VQ", + 6: "UQ", + 7: "Iso", + 8: "Oc", + 9: "IQ", + 10: "IVQ", + 11: "IUQ", + 12: "Mo", + 13: "F+Fl", + 14: "Fl+LFl", + 15: "Oc+Fl", + 16: "F+LFl", + 17: "Al.Oc", + 18: "Al.LFl", + 19: "Al.Fl", + 20: "Al.Gr", + 21: "Q+LFl", + 22: "VQ+LFl", + 23: "UQ+LFl", +} + +NATSUR_TEXT = { + 1: "M", + 2: "Cy", + 3: "Si", + 4: "S", + 5: "St", + 6: "G", + 7: "P", + 8: "Cb", + 9: "R", + 11: "Lv", + 14: "Co", + 17: "Sh", + 18: "Bo", +} + + +def scalarize(value: Any) -> Any: + if value is None: + return None + if isinstance(value, bool): + return value + if isinstance(value, (int, float, str)): + return value + if isinstance(value, (list, dict, tuple)): + return json.dumps(value, ensure_ascii=False, separators=(",", ":")) + return str(value) + + +def get_path(data: dict[str, Any], path: str) -> Any: + cur: Any = data + for token in str(path).split("."): + if isinstance(cur, dict) and token in cur: + cur = cur[token] + else: + return None + return cur + + + +def first_direct_name(attrs: dict[str, Any]) -> str | None: + """Return a direct source-owned navigation name, never a proximity-derived text.""" + for key in ("OBJNAM", "NOBJNM"): + value = attrs.get(key) + if isinstance(value, str): + value = value.strip() + if value: + return value + return None + + +def unique_direct_names(rows: list[dict[str, Any]]) -> list[str]: + out: list[str] = [] + for attrs in rows: + value = first_direct_name(attrs) + if value and value not in out: + out.append(value) + return out + + +def format_number(value: Any) -> str: + if value is None: + return "" + try: + v = float(value) + except Exception: + return str(value) + if abs(v - round(v)) < 1e-9: + return str(int(round(v))) + return f"{v:.2f}".rstrip("0").rstrip(".") + + +def format_depth(value: Any) -> str | None: + if value is None: + return None + return format_number(value) + + +def format_clearance(value: Any) -> str | None: + if value is None: + return None + return f"{format_number(value)}m" + + +def _depth_token(value: Any) -> str: + return format_number(value) + + +# Current NavSea unified style only consumes these depth-area buckets. +# Keep this list aligned with style.navsea-delivery-full-semantic-unified-20260808. +NAVSEA_DEPTH_ZONE_INTERVALS: tuple[tuple[float, float, str], ...] = ( + (0, 2, "depth_zone_0-2m"), + (0, 5, "depth_zone_0-5m"), + (0, 10, "depth_zone_0-10m"), + (0, 20, "depth_zone_0-20m"), + (2, 5, "depth_zone_2-5m"), + (2, 10, "depth_zone_2-10m"), + (2, 20, "depth_zone_2-20m"), + (5, 10, "depth_zone_5-10m"), + (5, 20, "depth_zone_5-20m"), + (10, 20, "depth_zone_10-20m"), + (20, 100, "depth_zone_20-100m"), + (20, 200, "depth_zone_20-200m"), + (100, 200, "depth_zone_100-200m"), + (200, 500, "depth_zone_200-500m"), + (500, 1000, "depth_zone_500-1000m"), + (1000, 2000, "depth_zone_1000-2000m"), + (2000, 3000, "depth_zone_2000-3000m"), + (3000, 4000, "depth_zone_3000-4000m"), + (4000, 5000, "depth_zone_4000-5000m"), + (5000, 6000, "depth_zone_5000-6000m"), + (6000, 7000, "depth_zone_6000-7000m"), + (7000, 8000, "depth_zone_7000-8000m"), + (8000, 9000, "depth_zone_8000-9000m"), +) + + +def _smallest_supported_depth_bucket(lo: float, hi: float | None) -> str | None: + if lo >= 9000 and (hi is None or hi >= lo): + return "depth_zone_over_9000m" + + candidates: list[tuple[float, float, float, str]] = [] + for bucket_lo, bucket_hi, token in NAVSEA_DEPTH_ZONE_INTERVALS: + if hi is None: + # A lower-bounded zone uses the tightest bucket containing the lower bound. + if bucket_lo <= lo < bucket_hi: + width = bucket_hi - bucket_lo + edge_distance = abs(bucket_lo - lo) + candidates.append((width, edge_distance, -bucket_lo, token)) + else: + # Prefer the smallest supported interval that fully contains the source range. + if bucket_lo <= lo and hi <= bucket_hi: + width = bucket_hi - bucket_lo + edge_distance = abs(bucket_lo - lo) + abs(bucket_hi - hi) + candidates.append((width, edge_distance, -bucket_lo, token)) + + if not candidates: + return None + candidates.sort() + return candidates[0][3] + + +def depth_zone_style(lo: Any, hi: Any) -> str: + """Normalize CM95 depth ranges to the existing NavSea style vocabulary. + + Arbitrary CM95 intervals such as 7.5-10m, 13-20m or 20-50m must never + leak into delivery PBF because the current style does not consume them. + The chosen style bucket is the smallest existing NavSea interval that fully + contains the source range. The original DRVAL1/DRVAL2 remain available in + engineering trace/source attributes. + """ + if lo is None and hi is None: + return "water_area" + + try: + lv = float(lo) if lo is not None else 0.0 + except Exception: + return "water_area" + + hv: float | None + if hi is None: + hv = None + else: + try: + hv = float(hi) + except Exception: + hv = None + + if hv is not None and hv < lv: + lv, hv = hv, lv + + token = _smallest_supported_depth_bucket(lv, hv) + if token is not None: + return token + + # No truthful single bucket exists in the current style vocabulary. + # Use neutral water rather than inventing a style value that will not render. + return "water_area" + + +def format_natsur(natsur: Any, natqua: Any) -> str | None: + values = natsur if isinstance(natsur, list) else [natsur] if natsur is not None else [] + parts: list[str] = [] + for value in values: + try: + code = int(value) + except Exception: + code = None + text = NATSUR_TEXT.get(code, str(value) if value is not None else "") + if text and text not in parts: + parts.append(text) + if not parts: + return None + return "/".join(parts) + + +def s57_light_color(colour: Any) -> str | None: + values = colour if isinstance(colour, list) else [colour] if colour is not None else [] + for value in values: + try: + code = int(value) + except Exception: + continue + if code in LIGHT_COLOUR: + return LIGHT_COLOUR[code][0] + return None + + +def light_colour_abbrs(colour: Any) -> list[str]: + values = colour if isinstance(colour, list) else [colour] if colour is not None else [] + out: list[str] = [] + for value in values: + try: + code = int(value) + except Exception: + continue + item = LIGHT_COLOUR.get(code) + if item and item[1] not in out: + out.append(item[1]) + return out + + +def format_light_abbreviation(attrs: dict[str, Any]) -> str | None: + parts: list[str] = [] + litchr = attrs.get("LITCHR") + if litchr is not None: + try: + char = LIGHT_CHARACTER.get(int(litchr), f"L{int(litchr)}") + except Exception: + char = str(litchr) + siggrp = attrs.get("SIGGRP") + if siggrp and str(siggrp) not in {"(1)", "1"}: + char += str(siggrp) + parts.append(char) + + colours = light_colour_abbrs(attrs.get("COLOUR")) + if colours: + parts.append(",".join(colours)) + + if attrs.get("SIGPER") is not None: + parts.append(f"{format_number(attrs['SIGPER'])}s") + if attrs.get("HEIGHT") is not None: + parts.append(f"{format_number(attrs['HEIGHT'])}m") + if attrs.get("VALNMR") is not None: + parts.append(f"{format_number(attrs['VALNMR'])}M") + + if not parts: + colours = light_colour_abbrs(attrs.get("COLOUR")) + if colours: + return ",".join(colours) + return None + return " ".join(parts) + + +def nav_icon_from_bcnlat(attrs: dict[str, Any], lighted: bool = False) -> str: + try: + cat = int(attrs.get("CATLAM")) + except Exception: + cat = 0 + suffix = { + 1: "port", + 2: "starboard", + 3: "starboard", + 4: "port", + }.get(cat, "special") + if lighted: + return f"beacon_light_mark_{suffix}" + return f"beacon_small_{suffix}" + + +def nav_icon_from_bcnspp(attrs: dict[str, Any], lighted: bool = False) -> str: + return "beacon_light_mark_special" if lighted else "beacon_small_special" + + +def nav_icon_from_boyspp(attrs: dict[str, Any], lighted: bool = False) -> str: + try: + shape = int(attrs.get("BOYSHP")) + except Exception: + shape = 0 + if lighted: + if shape == 4: + return "buoy_pillar_light_special" + return "buoy_light_special" + return { + 1: "buoy_cone", + 2: "buoy_cylinder", + 3: "buoy_sphere", + 4: "buoy_pillar", + 6: "buoy_barrel_light", + }.get(shape, "buoy_lattice_special") + + +def nav_icon_from_rtpbcn(attrs: dict[str, Any], lighted: bool = False) -> str: + return "beacon_light" if lighted else "beacon_large" + + +class MappingRegistry: + def __init__(self, path: Path): + self.path = Path(path) + self.document = yaml.safe_load(self.path.read_text(encoding="utf-8")) + self.rules: dict[tuple[str, str], dict[str, Any]] = {} + for rule in self.document.get("rules", []): + key = ( + str(rule.get("cm95_object_class") or ""), + str(rule.get("geometry_type") or ""), + ) + self.rules[key] = rule + + def resolve(self, object_class: str, geometry_type: str) -> dict[str, Any] | None: + return self.rules.get((str(object_class), str(geometry_type))) + + def eval_condition(self, condition: Any, attrs: dict[str, Any]) -> bool: + if condition is None or condition == "": + return True + text = str(condition).strip() + if text.endswith(" present"): + field = text[:-8].strip() + return get_path(attrs, field) is not None + return False + + def evaluate_fields( + self, + field_spec: dict[str, Any], + attrs: dict[str, Any], + context: dict[str, Any] | None = None, + ) -> dict[str, Any]: + context = context or {} + merged = dict(attrs) + merged.update(context) + out: dict[str, Any] = {} + for field, spec in (field_spec or {}).items(): + value = self._evaluate_spec(spec, merged) + value = scalarize(value) + if value is not None and value != "": + out[str(field)] = value + return out + + def _evaluate_spec(self, spec: Any, attrs: dict[str, Any]) -> Any: + if not isinstance(spec, dict): + return spec + if "const" in spec: + return spec["const"] + if "from" in spec: + return get_path(attrs, str(spec["from"])) + derive = spec.get("derive") + if derive is None: + return None + text = str(derive) + + if text == "wreck_surveyed if VALSOU present else wreck_submerged_dangerous": + return "wreck_surveyed" if attrs.get("VALSOU") is not None else "wreck_submerged_dangerous" + if text == "rock_awash if WATLEV in [2,4,5] else rock_submerged": + try: + watlev = int(attrs.get("WATLEV")) + except Exception: + watlev = None + return "rock_awash" if watlev in {2, 4, 5} else "rock_submerged" + if text == "format_depth(VALDCO)": + return format_depth(attrs.get("VALDCO")) + if text == "format_depth(chart_sounding_point.depth)": + return format_depth(get_path(attrs, "chart_sounding_point.depth")) + if text == "depth_zone_style(DRVAL1,DRVAL2)": + return depth_zone_style(attrs.get("DRVAL1"), attrs.get("DRVAL2")) + if text == "depth_zone_style(DRVAL1,null)": + return depth_zone_style(attrs.get("DRVAL1"), None) + if text == "format_natsur(NATSUR,NATQUA)": + return format_natsur(attrs.get("NATSUR"), attrs.get("NATQUA")) + if text == "_texta.text": + return get_path(attrs, "_texta.text") + if text == "s57_colour_to_light_color(COLOUR)": + return s57_light_color(attrs.get("COLOUR")) + if text == "format_light_abbreviation(LITCHR,SIGGRP,SIGPER,COLOUR,HEIGHT,VALNMR)": + return format_light_abbreviation(attrs) + if text == "first_present(OBJNAM,NOBJNM)": + return first_direct_name(attrs) + if text == "sector if SECTR1/SECTR2 present else omni": + return "sector" if attrs.get("SECTR1") is not None or attrs.get("SECTR2") is not None else "omni" + if text == "format_clearance(VERCLR)": + return format_clearance(attrs.get("VERCLR")) + if text == "nav_icon_from_bcnlat_attributes": + return nav_icon_from_bcnlat(attrs, lighted=False) + if text == "nav_icon_from_bcnspp_attributes": + return nav_icon_from_bcnspp(attrs, lighted=False) + if text == "nav_icon_from_boyspp_attributes": + return nav_icon_from_boyspp(attrs, lighted=False) + if text == "nav_icon_from_rtpbcn_attributes": + return nav_icon_from_rtpbcn(attrs, lighted=False) + return None + + def minimize_delivery_properties(self, properties: dict[str, Any]) -> dict[str, Any]: + return { + key: scalarize(value) + for key, value in properties.items() + if key in DELIVERY_PROPERTY_ALLOWLIST and scalarize(value) is not None + } diff --git a/src/cm95pbf/policy.py b/src/cm95pbf/policy.py new file mode 100644 index 0000000..6828e81 --- /dev/null +++ b/src/cm95pbf/policy.py @@ -0,0 +1,98 @@ +from __future__ import annotations + +from dataclasses import dataclass +import math + +WEB_MERCATOR_HALF_WORLD = 20037508.342789244 +MAX_MERCATOR_LAT = 85.0511287798066 + + +@dataclass(frozen=True) +class TileBounds: + z: int + x: int + y: int + west_m: float + south_m: float + east_m: float + north_m: float + + @property + def width_m(self) -> float: + return self.east_m - self.west_m + + @property + def height_m(self) -> float: + return self.north_m - self.south_m + + @property + def mercator_tuple(self) -> tuple[float, float, float, float]: + return self.west_m, self.south_m, self.east_m, self.north_m + + @property + def wgs84_tuple(self) -> tuple[float, float, float, float]: + west, south = mercator_to_lonlat(self.west_m, self.south_m) + east, north = mercator_to_lonlat(self.east_m, self.north_m) + return west, south, east, north + + +def lonlat_to_mercator(lon: float, lat: float) -> tuple[float, float]: + lat = max(-MAX_MERCATOR_LAT, min(MAX_MERCATOR_LAT, float(lat))) + x = WEB_MERCATOR_HALF_WORLD * float(lon) / 180.0 + y = math.log(math.tan((90.0 + lat) * math.pi / 360.0)) / (math.pi / 180.0) + y = WEB_MERCATOR_HALF_WORLD * y / 180.0 + return x, y + + +def mercator_to_lonlat(x: float, y: float) -> tuple[float, float]: + lon = float(x) / WEB_MERCATOR_HALF_WORLD * 180.0 + lat = float(y) / WEB_MERCATOR_HALF_WORLD * 180.0 + lat = 180.0 / math.pi * ( + 2.0 * math.atan(math.exp(lat * math.pi / 180.0)) - math.pi / 2.0 + ) + return lon, lat + + +def xyz_tile_bounds(z: int, x: int, y: int) -> TileBounds: + n = 1 << int(z) + if x < 0 or y < 0 or x >= n or y >= n: + raise ValueError(f"invalid XYZ tile z={z} x={x} y={y}") + tile_size = (WEB_MERCATOR_HALF_WORLD * 2.0) / n + west = -WEB_MERCATOR_HALF_WORLD + x * tile_size + east = west + tile_size + north = WEB_MERCATOR_HALF_WORLD - y * tile_size + south = north - tile_size + return TileBounds( + z=z, + x=x, + y=y, + west_m=west, + south_m=south, + east_m=east, + north_m=north, + ) + + +def expanded_mercator_bounds( + tile: TileBounds, + buffer_tile_pixels: float, + nominal_tile_pixels: float = 256.0, +) -> tuple[float, float, float, float]: + pad = tile.width_m * float(buffer_tile_pixels) / float(nominal_tile_pixels) + return ( + tile.west_m - pad, + tile.south_m - pad, + tile.east_m + pad, + tile.north_m + pad, + ) + + +def child_tiles(z: int, x: int, y: int, child_z: int) -> list[tuple[int, int, int]]: + if child_z < z: + raise ValueError("child_z must be >= z") + factor = 1 << (child_z - z) + out: list[tuple[int, int, int]] = [] + for cx in range(x * factor, (x + 1) * factor): + for cy in range(y * factor, (y + 1) * factor): + out.append((child_z, cx, cy)) + return out diff --git a/src/cm95pbf/production.py b/src/cm95pbf/production.py new file mode 100644 index 0000000..a2f2e06 --- /dev/null +++ b/src/cm95pbf/production.py @@ -0,0 +1,826 @@ +from __future__ import annotations + +from concurrent.futures import ThreadPoolExecutor, as_completed +from collections import Counter +from dataclasses import dataclass +from datetime import datetime, timezone +import hashlib +import json +import math +import os +from pathlib import Path +import shutil +import sqlite3 +import threading +import traceback +from typing import Any, Iterable + +import pymysql +from shapely import wkb +from shapely.geometry import box +from shapely.ops import transform + +from cm93db.config import DbConfig + +from . import BUILDER_CONTRACT_VERSION +from .builder import Cm95TileBuilder, TileJob +from .identity import dataset_fingerprint, validate_manifest +from .policy import ( + WEB_MERCATOR_HALF_WORLD, + lonlat_to_mercator, + xyz_tile_bounds, +) + + +PRODUCTION_PLAN_SCHEMA = "navsea.cm95.production-plan/v1" +PRODUCTION_RUN_SCHEMA = "navsea.cm95.production-run/v1" + + +def utc_now() -> str: + return datetime.now(timezone.utc).isoformat(timespec="seconds").replace("+00:00", "Z") + + +def sha256_file(path: Path) -> str: + h = hashlib.sha256() + with Path(path).open("rb") as f: + for chunk in iter(lambda: f.read(1024 * 1024), b""): + h.update(chunk) + return h.hexdigest() + + +def canonical_sha256(obj: Any) -> str: + raw = json.dumps(obj, ensure_ascii=False, sort_keys=True, separators=(",", ":")).encode("utf-8") + return hashlib.sha256(raw).hexdigest() + + +def parse_zooms(value: str | Iterable[int]) -> list[int]: + if isinstance(value, str): + values: list[int] = [] + for token in value.split(","): + token = token.strip() + if not token: + continue + if "-" in token: + parts = token.split("-", 1) + if len(parts) != 2 or not parts[0].strip() or not parts[1].strip(): + raise ValueError(f"invalid zoom range: {token}") + start = int(parts[0].strip()) + end = int(parts[1].strip()) + if end < start: + raise ValueError(f"invalid zoom range: {token}") + values.extend(range(start, end + 1)) + else: + values.append(int(token)) + else: + values = [int(v) for v in value] + values = sorted(set(values)) + if not values: + raise ValueError("zooms 不能为空") + for z in values: + if z < 0 or z > 22: + raise ValueError(f"invalid zoom: {z}") + return values + + +def _load_policy(path: Path) -> dict[str, Any]: + import yaml + return yaml.safe_load(Path(path).read_text(encoding="utf-8")) + + +def _scale_ladder(policy: dict[str, Any], z: int) -> list[int]: + raw = (policy.get("scale_ladders") or {}).get(str(z)) + if not raw: + raise RuntimeError(f"no scale ladder configured for z{z}") + return [int(v) for v in raw] + + +def _enumeration_scales(policy: dict[str, Any], z: int) -> list[int]: + """Return scales allowed to materialize physical tiles at a zoom. + + This is intentionally distinct from scale_ladders: coarse fallback scales may + be read *inside* an already materialized tile, but they must not expand the + high-zoom production footprint. + """ + raw = (policy.get("enumeration_scales") or {}).get(str(z)) + if raw: + return [int(v) for v in raw] + return _scale_ladder(policy, z) + + +def _mercator_geom_from_wkb(value: Any): + if value is None: + return None + if isinstance(value, memoryview): + value = value.tobytes() + elif isinstance(value, bytearray): + value = bytes(value) + geom = wkb.loads(value) + if geom is None or geom.is_empty: + return None + return transform(lambda x, y, z=None: lonlat_to_mercator(x, y), geom) + + +def _mercator_tile_index(z: int, x_m: float, y_m: float) -> tuple[int, int]: + n = 1 << int(z) + world = WEB_MERCATOR_HALF_WORLD * 2.0 + tx = math.floor((float(x_m) + WEB_MERCATOR_HALF_WORLD) / world * n) + ty = math.floor((WEB_MERCATOR_HALF_WORLD - float(y_m)) / world * n) + return max(0, min(n - 1, tx)), max(0, min(n - 1, ty)) + + +def _tiles_intersecting_geom(z: int, geom) -> set[tuple[int, int, int]]: + if geom is None or geom.is_empty: + return set() + minx, miny, maxx, maxy = geom.bounds + x0, y1 = _mercator_tile_index(z, minx, miny) + x1, y0 = _mercator_tile_index(z, maxx, maxy) + xlo, xhi = sorted((x0, x1)) + ylo, yhi = sorted((y0, y1)) + out: set[tuple[int, int, int]] = set() + for x in range(xlo, xhi + 1): + for y in range(ylo, yhi + 1): + tile_box = box(*xyz_tile_bounds(z, x, y).mercator_tuple) + if geom.intersects(tile_box): + out.add((z, x, y)) + return out + + +def _connect(db: DbConfig): + return pymysql.connect( + host=db.host, + port=db.port, + user=db.user, + password=db.password, + database=db.database, + charset=db.charset, + cursorclass=pymysql.cursors.DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + write_timeout=30, + ) + + +def _fetch_plan_geometries(conn, dataset_id: int, scales: list[int]): + placeholders = ",".join(["%s"] * len(scales)) + with conn.cursor() as cur: + cur.execute( + f""" + SELECT + id, + native_scale, + bbox_min_lon, + bbox_min_lat, + bbox_max_lon, + bbox_max_lat + FROM chart_cell + WHERE dataset_id=%s + AND native_scale IN ({placeholders}) + ORDER BY native_scale, id + """, + (dataset_id, *scales), + ) + cells = list(cur.fetchall()) + + if not cells: + return [] + + cell_ids = [int(c["id"]) for c in cells] + ph = ",".join(["%s"] * len(cell_ids)) + with conn.cursor() as cur: + cur.execute( + f""" + SELECT cell_id, ST_AsWKB(geom) AS geom_wkb + FROM chart_coverage + WHERE dataset_id=%s + AND cell_id IN ({ph}) + ORDER BY cell_id, id + """, + (dataset_id, *cell_ids), + ) + coverage_rows = list(cur.fetchall()) + + by_cell: dict[int, list[Any]] = {} + for row in coverage_rows: + geom = _mercator_geom_from_wkb(row["geom_wkb"]) + if geom is None: + continue + by_cell.setdefault(int(row["cell_id"]), []).append(geom) + + pieces: list[tuple[int, int, Any, str]] = [] + for cell in cells: + cid = int(cell["id"]) + scale = int(cell["native_scale"]) + geoms = by_cell.get(cid) + if geoms: + for geom in geoms: + pieces.append((cid, scale, geom, "coverage")) + continue + minx, miny = lonlat_to_mercator(float(cell["bbox_min_lon"]), float(cell["bbox_min_lat"])) + maxx, maxy = lonlat_to_mercator(float(cell["bbox_max_lon"]), float(cell["bbox_max_lat"])) + pieces.append((cid, scale, box(minx, miny, maxx, maxy), "cell_bbox_fallback")) + return pieces + + +def create_production_plan( + db: DbConfig, + dataset_id: int, + mapping_path: Path, + policy_path: Path, + manifest_path: Path, + output_path: Path, + zooms: list[int], + profile: str = "delivery", +) -> dict[str, Any]: + if profile not in {"delivery", "engineering"}: + raise ValueError("profile must be delivery or engineering") + mapping_path = Path(mapping_path) + policy_path = Path(policy_path) + manifest_path = Path(manifest_path) + output_path = Path(output_path) + policy = _load_policy(policy_path) + zooms = parse_zooms(zooms) + + all_scales = sorted({s for z in zooms for s in _enumeration_scales(policy, z)}) + + with _connect(db) as conn: + try: + conn.cursor().execute("SET SESSION TRANSACTION READ ONLY") + except Exception: + pass + fingerprint = dataset_fingerprint(conn, dataset_id) + manifest_info = validate_manifest(conn, dataset_id, manifest_path) + pieces = _fetch_plan_geometries(conn, dataset_id, all_scales) + conn.rollback() + + jobs: set[tuple[int, int, int]] = set() + source_stats: dict[str, Any] = {} + for z in zooms: + ladder = _scale_ladder(policy, z) + enumeration = _enumeration_scales(policy, z) + enumeration_set = set(enumeration) + z_pieces = [(cid, scale, geom, src) for cid, scale, geom, src in pieces if scale in enumeration_set] + z_jobs: set[tuple[int, int, int]] = set() + fallback_pieces = 0 + for _cid, _scale, geom, source in z_pieces: + if source == "cell_bbox_fallback": + fallback_pieces += 1 + z_jobs |= _tiles_intersecting_geom(z, geom) + jobs |= z_jobs + source_stats[str(z)] = { + "enumeration_scales": enumeration, + "scale_ladder": ladder, + "coverage_pieces": len(z_pieces), + "cell_bbox_fallback_pieces": fallback_pieces, + "tile_count": len(z_jobs), + } + + job_rows = [ + {"z": z, "x": x, "y": y} + for z, x, y in sorted(jobs) + ] + + immutable = { + "schema": PRODUCTION_PLAN_SCHEMA, + "dataset_id": int(dataset_id), + "dataset_fingerprint": fingerprint, + "profile": profile, + "zooms": zooms, + "mapping_sha256": sha256_file(mapping_path), + "policy_sha256": sha256_file(policy_path), + "builder_contract_version": BUILDER_CONTRACT_VERSION, + "manifest_dataset_fingerprint": manifest_info["dataset_fingerprint"], + "manifest_identity_count": int(manifest_info["identity_count"]), + "jobs": job_rows, + } + plan_id = canonical_sha256(immutable) + plan = { + **immutable, + "plan_id": plan_id, + "release_id": f"cm95-d{int(dataset_id)}-{fingerprint[:12]}-{plan_id[:12]}", + "created_at": utc_now(), + "mapping_path": str(mapping_path), + "policy_path": str(policy_path), + "manifest_path": str(manifest_path), + "source_stats": source_stats, + "job_count": len(job_rows), + } + output_path.parent.mkdir(parents=True, exist_ok=True) + output_path.write_text(json.dumps(plan, ensure_ascii=False, indent=2), encoding="utf-8") + return plan + + +def load_plan(path: Path) -> dict[str, Any]: + obj = json.loads(Path(path).read_text(encoding="utf-8")) + if obj.get("schema") != PRODUCTION_PLAN_SCHEMA: + raise RuntimeError(f"unsupported plan schema: {obj.get('schema')}") + return obj + + +class ProductionLedger: + def __init__(self, path: Path): + self.path = Path(path) + self._lock = threading.Lock() + self.path.parent.mkdir(parents=True, exist_ok=True) + self._init() + + def _conn(self): + db = sqlite3.connect(self.path, timeout=30) + db.row_factory = sqlite3.Row + db.execute("PRAGMA journal_mode=WAL") + db.execute("PRAGMA synchronous=NORMAL") + return db + + def _init(self): + with self._conn() as db: + db.executescript( + """ + CREATE TABLE IF NOT EXISTS run_meta ( + k TEXT PRIMARY KEY, + v TEXT NOT NULL + ); + CREATE TABLE IF NOT EXISTS tile_job ( + profile TEXT NOT NULL, + z INTEGER NOT NULL, + x INTEGER NOT NULL, + y INTEGER NOT NULL, + state TEXT NOT NULL, + attempts INTEGER NOT NULL DEFAULT 0, + updated_at TEXT NOT NULL, + output_feature_count INTEGER, + output_layer_count INTEGER, + written INTEGER, + last_error TEXT, + PRIMARY KEY(profile,z,x,y) + ); + CREATE INDEX IF NOT EXISTS idx_tile_job_state ON tile_job(state); + """ + ) + + def set_meta(self, key: str, value: str): + with self._conn() as db: + db.execute( + "INSERT INTO run_meta(k,v) VALUES(?,?) ON CONFLICT(k) DO UPDATE SET v=excluded.v", + (key, value), + ) + + def get_meta(self, key: str) -> str | None: + with self._conn() as db: + row = db.execute("SELECT v FROM run_meta WHERE k=?", (key,)).fetchone() + return None if row is None else str(row[0]) + + def seed(self, profile: str, jobs: list[dict[str, int]]): + now = utc_now() + with self._conn() as db: + db.executemany( + """ + INSERT OR IGNORE INTO tile_job(profile,z,x,y,state,attempts,updated_at) + VALUES(?,?,?,?, 'PENDING', 0, ?) + """, + [(profile, int(j["z"]), int(j["x"]), int(j["y"]), now) for j in jobs], + ) + db.execute( + "UPDATE tile_job SET state='PENDING', updated_at=? WHERE state='RUNNING'", + (now,), + ) + + def runnable(self, profile: str, max_attempts: int) -> list[sqlite3.Row]: + with self._conn() as db: + return list( + db.execute( + """ + SELECT * FROM tile_job + WHERE profile=? + AND state!='PASS' + AND attempts < ? + ORDER BY z,x,y + """, + (profile, int(max_attempts)), + ).fetchall() + ) + + def mark_running(self, profile: str, z: int, x: int, y: int): + with self._lock, self._conn() as db: + db.execute( + """ + UPDATE tile_job + SET state='RUNNING', attempts=attempts+1, updated_at=?, last_error=NULL + WHERE profile=? AND z=? AND x=? AND y=? + """, + (utc_now(), profile, z, x, y), + ) + + def mark_pass(self, profile: str, z: int, x: int, y: int, result: dict[str, Any]): + with self._lock, self._conn() as db: + db.execute( + """ + UPDATE tile_job + SET state='PASS', updated_at=?, + output_feature_count=?, output_layer_count=?, written=?, last_error=NULL + WHERE profile=? AND z=? AND x=? AND y=? + """, + ( + utc_now(), + int(result.get("output_feature_count") or 0), + int(result.get("output_layer_count") or 0), + 1 if result.get("written") else 0, + profile, z, x, y, + ), + ) + + def mark_failed(self, profile: str, z: int, x: int, y: int, error: str): + with self._lock, self._conn() as db: + db.execute( + """ + UPDATE tile_job + SET state='FAILED', updated_at=?, last_error=? + WHERE profile=? AND z=? AND x=? AND y=? + """, + (utc_now(), error[-12000:], profile, z, x, y), + ) + + def summary(self, profile: str) -> dict[str, Any]: + with self._conn() as db: + states = { + str(r["state"]): int(r["n"]) + for r in db.execute( + "SELECT state,COUNT(*) AS n FROM tile_job WHERE profile=? GROUP BY state", + (profile,), + ).fetchall() + } + row = db.execute( + """ + SELECT + COUNT(*) AS jobs, + COALESCE(SUM(attempts),0) AS attempts, + COALESCE(SUM(output_feature_count),0) AS output_features, + COALESCE(SUM(CASE WHEN written=1 THEN 1 ELSE 0 END),0) AS pbf_files + FROM tile_job WHERE profile=? + """, + (profile,), + ).fetchone() + return { + "jobs": int(row["jobs"]), + "attempts": int(row["attempts"]), + "output_features": int(row["output_features"]), + "pbf_files": int(row["pbf_files"]), + "states": states, + } + + +def _validate_plan_inputs(db: DbConfig, plan: dict[str, Any]): + mapping_path = Path(plan["mapping_path"]) + policy_path = Path(plan["policy_path"]) + manifest_path = Path(plan["manifest_path"]) + if sha256_file(mapping_path) != plan["mapping_sha256"]: + raise RuntimeError("mapping file changed after plan creation") + if sha256_file(policy_path) != plan["policy_sha256"]: + raise RuntimeError("policy file changed after plan creation") + with _connect(db) as conn: + fp = dataset_fingerprint(conn, int(plan["dataset_id"])) + if fp != plan["dataset_fingerprint"]: + raise RuntimeError("dataset fingerprint changed after plan creation") + validate_manifest(conn, int(plan["dataset_id"]), manifest_path) + conn.rollback() + + +def run_production_plan( + db: DbConfig, + plan_path: Path, + release_root: Path, + workers: int = 4, + max_attempts: int = 3, +) -> dict[str, Any]: + plan = load_plan(plan_path) + _validate_plan_inputs(db, plan) + workers = max(1, int(workers)) + max_attempts = max(1, int(max_attempts)) + release_dir = Path(release_root) / str(plan["release_id"]) + output_root = release_dir / "pbf" / str(plan["profile"]) + report_root = release_dir / "reports" + ledger = ProductionLedger(release_dir / "production_run_v1.sqlite") + ledger.set_meta("schema", PRODUCTION_RUN_SCHEMA) + ledger.set_meta("plan_id", str(plan["plan_id"])) + ledger.set_meta("release_id", str(plan["release_id"])) + ledger.set_meta("plan_path", str(Path(plan_path))) + ledger.seed(str(plan["profile"]), list(plan["jobs"])) + + runnable = ledger.runnable(str(plan["profile"]), max_attempts) + if not runnable: + summary = ledger.summary(str(plan["profile"])) + _write_run_summary(plan, release_dir, summary) + return {"release_dir": str(release_dir), **summary} + + def work(row): + z, x, y = int(row["z"]), int(row["x"]), int(row["y"]) + profile = str(plan["profile"]) + ledger.mark_running(profile, z, x, y) + try: + builder = Cm95TileBuilder( + db=db, + dataset_id=int(plan["dataset_id"]), + mapping_path=Path(plan["mapping_path"]), + policy_path=Path(plan["policy_path"]), + fid_manifest_path=Path(plan["manifest_path"]), + output_root=output_root, + report_root=report_root, + profile=profile, + ) + result = builder.build_tile(TileJob(z, x, y)) + if result.get("hard_gate_unmapped"): + raise RuntimeError(f"hard-gate unmapped: {result['hard_gate_unmapped']}") + ledger.mark_pass(profile, z, x, y, result) + return (True, z, x, y, result) + except Exception as exc: + err = f"{type(exc).__name__}: {exc}\n{traceback.format_exc()}" + ledger.mark_failed(profile, z, x, y, err) + return (False, z, x, y, err) + + completed = 0 + failed = 0 + with ThreadPoolExecutor(max_workers=workers, thread_name_prefix="cm95pbf") as pool: + futures = [pool.submit(work, row) for row in runnable] + for fut in as_completed(futures): + ok, z, x, y, payload = fut.result() + completed += 1 + if ok: + print( + f"PASS {z}/{x}/{y} " + f"features={payload['output_feature_count']} layers={payload['output_layer_count']}" + ) + else: + failed += 1 + first = str(payload).splitlines()[0] + print(f"FAIL {z}/{x}/{y} {first}") + if completed % 50 == 0: + s = ledger.summary(str(plan["profile"])) + print(f"PROGRESS {completed}/{len(runnable)} states={s['states']}") + + # 同一调用内继续重试失败任务,直到 max_attempts 用尽。 + while True: + retry = ledger.runnable(str(plan["profile"]), max_attempts) + retry = [r for r in retry if str(r["state"]) == "FAILED"] + if not retry: + break + print(f"RETRY jobs={len(retry)}") + with ThreadPoolExecutor(max_workers=workers, thread_name_prefix="cm95pbf-retry") as pool: + futures = [pool.submit(work, row) for row in retry] + for fut in as_completed(futures): + ok, z, x, y, payload = fut.result() + if ok: + print(f"PASS retry {z}/{x}/{y}") + else: + print(f"FAIL retry {z}/{x}/{y} {str(payload).splitlines()[0]}") + + summary = ledger.summary(str(plan["profile"])) + _write_run_summary(plan, release_dir, summary) + return {"release_dir": str(release_dir), **summary} + + +def _write_run_summary(plan: dict[str, Any], release_dir: Path, summary: dict[str, Any]): + obj = { + "schema": PRODUCTION_RUN_SCHEMA, + "release_id": plan["release_id"], + "plan_id": plan["plan_id"], + "dataset_id": plan["dataset_id"], + "dataset_fingerprint": plan["dataset_fingerprint"], + "profile": plan["profile"], + "builder_contract_version": plan.get("builder_contract_version"), + "updated_at": utc_now(), + **summary, + } + path = Path(release_dir) / "production_run_summary_v1.json" + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(obj, ensure_ascii=False, indent=2), encoding="utf-8") + + +def production_status(plan_path: Path, release_root: Path) -> dict[str, Any]: + plan = load_plan(plan_path) + release_dir = Path(release_root) / str(plan["release_id"]) + ledger = ProductionLedger(release_dir / "production_run_v1.sqlite") + summary = ledger.summary(str(plan["profile"])) + return { + "release_id": plan["release_id"], + "release_dir": str(release_dir), + **summary, + } + + +def _load_delivery_changed_classes(mapping_path: Path) -> list[str]: + import yaml + obj = yaml.safe_load(Path(mapping_path).read_text(encoding="utf-8")) or {} + contract = obj.get("production_change_contract") or {} + values = contract.get("delivery_output_changed_object_classes") or [] + return sorted({str(v) for v in values if str(v).strip()}) + + +def _link_or_copy(src: Path, dst: Path, mode: str = "hardlink") -> str: + src = Path(src) + dst = Path(dst) + dst.parent.mkdir(parents=True, exist_ok=True) + if dst.exists(): + dst.unlink() + if mode == "copy": + shutil.copy2(src, dst) + return "copy" + try: + os.link(src, dst) + return "hardlink" + except OSError: + shutil.copy2(src, dst) + return "copy_fallback" + + +def _load_explicit_invalidate_tiles(path: Path | None) -> set[tuple[int, int, int]]: + if path is None: + return set() + path = Path(path) + if not path.exists(): + raise RuntimeError(f"invalidate tiles file not found: {path}") + out: set[tuple[int, int, int]] = set() + for lineno, raw in enumerate(path.read_text(encoding="utf-8").splitlines(), start=1): + line = raw.strip() + if not line or line.startswith("#"): + continue + parts = line.split("/") + if len(parts) != 3: + raise RuntimeError(f"invalid tile at {path}:{lineno}: {line}") + try: + z, x, y = (int(v) for v in parts) + except ValueError as exc: + raise RuntimeError(f"invalid tile at {path}:{lineno}: {line}") from exc + if z < 0 or x < 0 or y < 0 or x >= (1 << z) or y >= (1 << z): + raise RuntimeError(f"invalid XYZ at {path}:{lineno}: {line}") + out.add((z, x, y)) + return out + + +def migrate_production_release( + old_release_dir: Path, + new_plan_path: Path, + release_root: Path, + copy_mode: str = "hardlink", + invalidate_tiles_file: Path | None = None, +) -> dict[str, Any]: + """Reuse old PASS tiles in a new release when delivery-equivalent. + + Safety rules: + - old FAILED/RUNNING/PENDING are never reused; + - any old PASS report mentioning a class whose delivery output changed is rebuilt; + - old PASS with encoder drops, hard-gate unmapped, or planned/output mismatch is rebuilt; + - PBF/report are linked/copied only after checks pass; + - a fresh ledger resets attempts for all rebuilt jobs. + """ + old_release_dir = Path(old_release_dir) + new_plan = load_plan(Path(new_plan_path)) + if copy_mode not in {"hardlink", "copy"}: + raise ValueError("copy_mode must be hardlink or copy") + + old_ledger_path = old_release_dir / "production_run_v1.sqlite" + if not old_ledger_path.exists(): + raise RuntimeError(f"old production ledger not found: {old_ledger_path}") + old_ledger = ProductionLedger(old_ledger_path) + + old_summary_path = old_release_dir / "production_run_summary_v1.json" + old_summary = {} + if old_summary_path.exists(): + old_summary = json.loads(old_summary_path.read_text(encoding="utf-8")) + if str(old_summary.get("dataset_fingerprint") or "") != str(new_plan["dataset_fingerprint"]): + raise RuntimeError("old/new dataset fingerprint mismatch") + if str(old_summary.get("profile") or "") != str(new_plan["profile"]): + raise RuntimeError("old/new profile mismatch") + + profile = str(new_plan["profile"]) + new_release_dir = Path(release_root) / str(new_plan["release_id"]) + if new_release_dir.resolve() == old_release_dir.resolve(): + raise RuntimeError("new release must not overwrite old release") + + new_ledger = ProductionLedger(new_release_dir / "production_run_v1.sqlite") + new_ledger.set_meta("schema", PRODUCTION_RUN_SCHEMA) + new_ledger.set_meta("plan_id", str(new_plan["plan_id"])) + new_ledger.set_meta("release_id", str(new_plan["release_id"])) + new_ledger.set_meta("plan_path", str(Path(new_plan_path))) + new_ledger.set_meta("migrated_from_release", old_release_dir.name) + new_ledger.seed(profile, list(new_plan["jobs"])) + + new_jobs = { + (profile, int(j["z"]), int(j["x"]), int(j["y"])) + for j in new_plan["jobs"] + } + with old_ledger._conn() as db: + old_rows = list(db.execute( + "SELECT * FROM tile_job WHERE profile=? ORDER BY z,x,y", + (profile,), + ).fetchall()) + old_jobs = {(profile, int(r["z"]), int(r["x"]), int(r["y"])) for r in old_rows} + if old_jobs != new_jobs: + missing_old = len(new_jobs - old_jobs) + extra_old = len(old_jobs - new_jobs) + raise RuntimeError( + f"old/new job set mismatch: missing_old={missing_old} extra_old={extra_old}" + ) + + changed_classes = set(_load_delivery_changed_classes(Path(new_plan["mapping_path"]))) + explicit_invalidate_tiles = _load_explicit_invalidate_tiles(invalidate_tiles_file) + reused = 0 + rebuilt_old_failed = 0 + rebuilt_changed_class = 0 + rebuilt_integrity = 0 + rebuilt_explicit_invalidate = 0 + reused_pbf = 0 + reused_empty = 0 + copy_modes = Counter() + + for row in old_rows: + z, x, y = int(row["z"]), int(row["x"]), int(row["y"]) + if str(row["state"]) != "PASS": + rebuilt_old_failed += 1 + continue + if (z, x, y) in explicit_invalidate_tiles: + rebuilt_explicit_invalidate += 1 + continue + + old_report = old_release_dir / "reports" / profile / str(z) / str(x) / f"{y}.json" + if not old_report.exists(): + rebuilt_integrity += 1 + continue + try: + report = json.loads(old_report.read_text(encoding="utf-8")) + except Exception: + rebuilt_integrity += 1 + continue + + unmapped = set((report.get("unmapped_class_counts") or {}).keys()) + hard_gate_classes = { + str(item.get("object_class")) + for item in (report.get("hard_gate_unmapped") or []) + if isinstance(item, dict) and item.get("object_class") + } + if changed_classes & (unmapped | hard_gate_classes): + rebuilt_changed_class += 1 + continue + if report.get("encoder_dropped_features") or report.get("hard_gate_unmapped"): + rebuilt_integrity += 1 + continue + if int(report.get("planned_output_feature_count") or 0) != int(report.get("output_feature_count") or 0): + rebuilt_integrity += 1 + continue + + old_pbf = old_release_dir / "pbf" / profile / str(z) / str(x) / f"{y}.pbf" + new_pbf = new_release_dir / "pbf" / profile / str(z) / str(x) / f"{y}.pbf" + output_count = int(report.get("output_feature_count") or 0) + written = bool(row["written"]) + if output_count > 0 or written: + if not old_pbf.exists(): + rebuilt_integrity += 1 + continue + mode_used = _link_or_copy(old_pbf, new_pbf, copy_mode) + copy_modes[mode_used] += 1 + reused_pbf += 1 + else: + reused_empty += 1 + + new_report = new_release_dir / "reports" / profile / str(z) / str(x) / f"{y}.json" + copy_modes[_link_or_copy(old_report, new_report, copy_mode)] += 1 + old_trace = old_release_dir / "reports" / profile / str(z) / str(x) / f"{y}.trace.jsonl" + if old_trace.exists(): + new_trace = new_release_dir / "reports" / profile / str(z) / str(x) / f"{y}.trace.jsonl" + copy_modes[_link_or_copy(old_trace, new_trace, copy_mode)] += 1 + + new_ledger.mark_pass( + profile, z, x, y, + { + "output_feature_count": output_count, + "output_layer_count": len(report.get("output_layer_counts") or {}), + "written": written, + }, + ) + reused += 1 + + summary = new_ledger.summary(profile) + result = { + "schema": "navsea.cm95.production-migration/v1", + "created_at": utc_now(), + "old_release_dir": str(old_release_dir), + "new_release_dir": str(new_release_dir), + "new_release_id": str(new_plan["release_id"]), + "builder_contract_version": new_plan.get("builder_contract_version"), + "changed_delivery_classes": sorted(changed_classes), + "reused_pass_jobs": reused, + "reused_pbf_files": reused_pbf, + "reused_empty_jobs": reused_empty, + "pending_from_old_nonpass": rebuilt_old_failed, + "pending_changed_delivery_class": rebuilt_changed_class, + "pending_integrity_recheck": rebuilt_integrity, + "pending_explicit_invalidate_tiles": rebuilt_explicit_invalidate, + "explicit_invalidate_tile_count": len(explicit_invalidate_tiles), + "invalidate_tiles_file": str(Path(invalidate_tiles_file)) if invalidate_tiles_file else None, + "copy_modes": dict(sorted(copy_modes.items())), + **summary, + } + out = new_release_dir / "production_migration_summary_v1.json" + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8") + _write_run_summary(new_plan, new_release_dir, summary) + return result + diff --git a/src/cm95pbf/release.py b/src/cm95pbf/release.py new file mode 100644 index 0000000..8964d1d --- /dev/null +++ b/src/cm95pbf/release.py @@ -0,0 +1,466 @@ +from __future__ import annotations + +from collections import Counter +from datetime import datetime, timezone +import hashlib +import json +from pathlib import Path +from typing import Any + +import mapbox_vector_tile + +from .production import ProductionLedger, load_plan, sha256_file +from .style_contract import audit_pbf_style_and_sprite + + +RELEASE_SCHEMA = "navsea.cm95.release-manifest/v1" + + +def _utc_now(): + return datetime.now(timezone.utc).isoformat(timespec="seconds").replace("+00:00", "Z") + + + + +def _collect_nav_name_conflict_expectations( + report_root: Path, + conflict_reports: list[tuple[Path, int]], +) -> dict[str, Any]: + """Collect ambiguous navigation-name outputs that must remain unlabeled. + + This is intentionally fail-closed: + - a report-side conflict must have exactly matching trace rows; + - each trace row must explicitly say nav_name_source=conflict; + - there must be at least two distinct direct-name candidates; + - the corresponding PBF feature is validated later and must omit + chart_label_text rather than guessing one candidate. + """ + expected_refs: dict[tuple[str, str, int], dict[str, Any]] = {} + unique_outputs: dict[tuple[str, int], dict[str, Any]] = {} + issues: list[dict[str, Any]] = [] + trace_occurrences = 0 + + for report_path, report_count in conflict_reports: + rel_report = report_path.relative_to(report_root) + trace_path = report_path.with_name(report_path.stem + ".trace.jsonl") + pbf_rel = rel_report.with_suffix(".pbf").as_posix() + + if not trace_path.exists(): + issues.append({ + "type": "missing_trace_file", + "report": rel_report.as_posix(), + "expected_conflicts": int(report_count), + }) + continue + + tile_rows: list[dict[str, Any]] = [] + with trace_path.open("r", encoding="utf-8") as handle: + for lineno, raw in enumerate(handle, start=1): + raw = raw.strip() + if not raw: + continue + try: + row = json.loads(raw) + except json.JSONDecodeError as exc: + issues.append({ + "type": "invalid_trace_json", + "trace": str(trace_path.relative_to(report_root)), + "line": lineno, + "error": str(exc), + }) + continue + if isinstance(row, dict) and row.get("nav_name_conflict") is True: + tile_rows.append(row) + + trace_occurrences += len(tile_rows) + if len(tile_rows) != int(report_count): + issues.append({ + "type": "report_trace_conflict_count_mismatch", + "report": rel_report.as_posix(), + "report_count": int(report_count), + "trace_count": len(tile_rows), + }) + + for row in tile_rows: + output_id = row.get("output_id") + layer = str(row.get("output_layer") or "") + name_source = str(row.get("nav_name_source") or "") + raw_candidates = row.get("nav_name_candidates") or [] + candidates: list[str] = [] + for value in raw_candidates: + text = str(value).strip() + if text and text not in candidates: + candidates.append(text) + + if output_id is None or not layer: + issues.append({ + "type": "invalid_conflict_trace_identity", + "report": rel_report.as_posix(), + "row": row, + }) + continue + + try: + fid = int(output_id) + except (TypeError, ValueError): + issues.append({ + "type": "invalid_conflict_output_id", + "report": rel_report.as_posix(), + "output_id": output_id, + }) + continue + + if name_source != "conflict": + issues.append({ + "type": "conflict_trace_wrong_name_source", + "report": rel_report.as_posix(), + "output_id": fid, + "nav_name_source": name_source, + }) + + if len(candidates) < 2: + issues.append({ + "type": "conflict_trace_insufficient_candidates", + "report": rel_report.as_posix(), + "output_id": fid, + "candidates": candidates, + }) + + ref_key = (pbf_rel, layer, fid) + if ref_key in expected_refs: + issues.append({ + "type": "duplicate_conflict_trace_reference", + "pbf": pbf_rel, + "layer": layer, + "output_id": fid, + }) + expected_refs[ref_key] = { + "pbf": pbf_rel, + "layer": layer, + "output_id": fid, + "source_id": row.get("source_id"), + "relation20": row.get("relation20"), + "native_scale": row.get("native_scale"), + "candidates": candidates, + } + + unique_key = (layer, fid) + unique = unique_outputs.setdefault(unique_key, { + "output_id": fid, + "output_layer": layer, + "source_id": row.get("source_id"), + "relation20": row.get("relation20"), + "native_scale": row.get("native_scale"), + "nav_name_candidates": list(candidates), + "occurrences": 0, + "tiles": [], + }) + unique["occurrences"] += 1 + if pbf_rel not in unique["tiles"]: + unique["tiles"].append(pbf_rel) + for candidate in candidates: + if candidate not in unique["nav_name_candidates"]: + unique["nav_name_candidates"].append(candidate) + + return { + "report_occurrences": sum(int(count) for _path, count in conflict_reports), + "trace_occurrences": trace_occurrences, + "expected_refs": expected_refs, + "unique_outputs": unique_outputs, + "issues": issues, + "seen_refs": set(), + "labeled_conflicts": [], + } + + +def _observe_nav_name_conflict_feature( + state: dict[str, Any], + pbf_rel: str, + layer: str, + fid: Any, + properties: dict[str, Any], +) -> None: + if fid is None: + return + try: + key = (pbf_rel, str(layer), int(fid)) + except (TypeError, ValueError): + return + + expected = state["expected_refs"].get(key) + if expected is None: + return + + state["seen_refs"].add(key) + label = properties.get("chart_label_text") + if label is not None and str(label).strip(): + state["labeled_conflicts"].append({ + **expected, + "chart_label_text": str(label), + }) + + +def _finalize_nav_name_conflict_audit(state: dict[str, Any]) -> dict[str, Any]: + expected_keys = set(state["expected_refs"]) + seen_keys = set(state["seen_refs"]) + missing = sorted(expected_keys - seen_keys) + + issues = list(state["issues"]) + if state["report_occurrences"] != state["trace_occurrences"]: + issues.append({ + "type": "global_report_trace_conflict_count_mismatch", + "report_occurrences": state["report_occurrences"], + "trace_occurrences": state["trace_occurrences"], + }) + + for pbf_rel, layer, fid in missing: + issues.append({ + "type": "conflict_output_missing_from_pbf", + "pbf": pbf_rel, + "layer": layer, + "output_id": fid, + }) + + for item in state["labeled_conflicts"]: + issues.append({ + "type": "ambiguous_conflict_was_labeled", + **item, + }) + + unique_details = [] + for row in state["unique_outputs"].values(): + item = dict(row) + item["tiles"] = sorted(item.get("tiles") or []) + unique_details.append(item) + unique_details.sort( + key=lambda row: ( + int(row.get("native_scale") or 0), + str(row.get("source_id") or ""), + int(row.get("output_id") or 0), + ) + ) + + affected_tiles = sorted({ + key[0] for key in state["expected_refs"] + }) + safe_omissions = len(seen_keys) - len(state["labeled_conflicts"]) + + return { + "overall": "PASS" if not issues else "FAIL", + "policy": "AMBIGUOUS_DIRECT_NAMES_OMIT_LABEL_FAIL_CLOSED", + "report_occurrences": int(state["report_occurrences"]), + "trace_occurrences": int(state["trace_occurrences"]), + "safe_omission_occurrences": int(safe_omissions), + "unique_conflict_outputs": len(unique_details), + "affected_tiles": len(affected_tiles), + "labeled_conflict_occurrences": len(state["labeled_conflicts"]), + "missing_pbf_occurrences": len(missing), + "issues": issues, + "unique_conflicts": unique_details, + } + + +def finalize_release( + plan_path: Path, + release_root: Path, + style_path: Path | None = None, + sprite_json_path: Path | None = None, + gap_disposition_path: Path | None = None, +) -> dict[str, Any]: + plan = load_plan(plan_path) + release_dir = Path(release_root) / str(plan["release_id"]) + ledger = ProductionLedger(release_dir / "production_run_v1.sqlite") + status = ledger.summary(str(plan["profile"])) + if status["states"].get("FAILED", 0) or status["states"].get("PENDING", 0) or status["states"].get("RUNNING", 0): + raise RuntimeError(f"release has unfinished jobs: {status['states']}") + if status["states"].get("PASS", 0) != int(plan["job_count"]): + raise RuntimeError(f"PASS job count mismatch: {status['states']} plan={plan['job_count']}") + + pbf_root = release_dir / "pbf" / str(plan["profile"]) + report_root = release_dir / "reports" / str(plan["profile"]) + pbf_files = sorted(pbf_root.rglob("*.pbf")) if pbf_root.exists() else [] + report_files = sorted( + p for p in report_root.rglob("*.json") + if not p.name.endswith(".trace.json") + ) if report_root.exists() else [] + + hard_gate = [] + encoder_dropped = [] + name_conflicts = 0 + nav_name_conflict_reports: list[tuple[Path, int]] = [] + non_renderable_omissions = 0 + non_renderable_omission_layers = Counter() + quantization_fallbacks = 0 + quantization_omissions = 0 + quantization_omission_layers = Counter() + encoder_reconciled_candidates = 0 + encoder_reconciled_tiles = 0 + planned = 0 + output = 0 + report_layer_counts = Counter() + for path in report_files: + obj = json.loads(path.read_text(encoding="utf-8")) + hard_gate += [{"report": str(path.relative_to(release_dir)), **x} for x in obj.get("hard_gate_unmapped") or []] + encoder_dropped += [{"report": str(path.relative_to(release_dir)), **x} for x in obj.get("encoder_dropped_features") or []] + tile_name_conflicts = int((obj.get("navigation_composites") or {}).get("name_conflict_groups") or 0) + name_conflicts += tile_name_conflicts + if tile_name_conflicts: + nav_name_conflict_reports.append((path, tile_name_conflicts)) + label_omissions = obj.get("non_renderable_omissions") or [] + non_renderable_omissions += len(label_omissions) + for item in label_omissions: + if isinstance(item, dict): + non_renderable_omission_layers[str(item.get("layer") or "UNKNOWN")] += 1 + quantization_fallbacks += len(obj.get("quantization_fallbacks") or []) + omissions = obj.get("quantization_omissions") or [] + quantization_omissions += len(omissions) + reconcile_candidates = obj.get("encoder_drop_candidates") or [] + if reconcile_candidates: + encoder_reconciled_tiles += 1 + for candidate in reconcile_candidates: + if isinstance(candidate, dict): + encoder_reconciled_candidates += len(candidate.get("dropped") or []) + for item in omissions: + if isinstance(item, dict): + quantization_omission_layers[str(item.get("layer") or "UNKNOWN")] += 1 + planned += int(obj.get("planned_output_feature_count") or 0) + output += int(obj.get("output_feature_count") or 0) + report_layer_counts.update(obj.get("output_layer_counts") or {}) + + nav_name_conflict_state = _collect_nav_name_conflict_expectations( + report_root, + nav_name_conflict_reports, + ) + + inventory = [] + decoded_features = 0 + decoded_layers = Counter() + duplicate_feature_ids = [] + for path in pbf_files: + raw = path.read_bytes() + decoded = mapbox_vector_tile.decode(raw) + seen = set() + tile_features = 0 + for layer, payload in decoded.items(): + feats = payload.get("features", []) + decoded_layers[layer] += len(feats) + tile_features += len(feats) + pbf_rel = str(path.relative_to(pbf_root)).replace("\\", "/") + for feat in feats: + fid = feat.get("id") + _observe_nav_name_conflict_feature( + nav_name_conflict_state, + pbf_rel, + layer, + fid, + feat.get("properties") or {}, + ) + if fid is None: + continue + key = (layer, int(fid)) + if key in seen: + duplicate_feature_ids.append({"file": str(path.relative_to(release_dir)), "layer": layer, "id": int(fid)}) + seen.add(key) + decoded_features += tile_features + inventory.append({ + "path": str(path.relative_to(release_dir)).replace("\\", "/"), + "bytes": len(raw), + "sha256": hashlib.sha256(raw).hexdigest(), + "features": tile_features, + "layers": len(decoded), + }) + + style_sha = None + sprite_sha = None + style_contract = None + if style_path is not None: + style_path = Path(style_path) + style_sha = sha256_file(style_path) + if sprite_json_path is not None: + sprite_json_path = Path(sprite_json_path) + sprite_sha = sha256_file(sprite_json_path) + style_contract = audit_pbf_style_and_sprite( + pbf_root, + style_path, + sprite_json_path, + ) + + gap_disposition_sha = None + semantic_backlog = None + semantic_completeness = "NOT_AUDITED" + if gap_disposition_path is not None: + import yaml + gap_disposition_path = Path(gap_disposition_path) + if gap_disposition_path.exists(): + gap_disposition_sha = sha256_file(gap_disposition_path) + gap_obj = yaml.safe_load(gap_disposition_path.read_text(encoding="utf-8")) or {} + semantic_backlog = dict(gap_obj.get("summary") or {}) + pending = int((semantic_backlog or {}).get("pending_semantic_review") or 0) + semantic_completeness = "COMPLETE" if pending == 0 else "PENDING_REVIEW" + + nav_name_conflict_audit = _finalize_nav_name_conflict_audit( + nav_name_conflict_state + ) + + failures = [] + if hard_gate: + failures.append("hard_gate_unmapped") + if encoder_dropped: + failures.append("encoder_dropped_features") + if name_conflicts and nav_name_conflict_audit.get("overall") != "PASS": + failures.append("nav_name_conflict_audit") + if planned != output: + failures.append("planned_vs_report_output_mismatch") + if output != decoded_features: + failures.append("report_output_vs_decoded_pbf_mismatch") + if duplicate_feature_ids: + failures.append("duplicate_feature_ids_within_tile_layer") + if style_contract is not None and style_contract.get("overall") != "PASS": + failures.append("style_or_sprite_contract") + + result = { + "schema": RELEASE_SCHEMA, + "created_at": _utc_now(), + "status": "PASS" if not failures else "FAIL", + "release_id": plan["release_id"], + "plan_id": plan["plan_id"], + "dataset_id": plan["dataset_id"], + "dataset_fingerprint": plan["dataset_fingerprint"], + "profile": plan["profile"], + "zooms": plan["zooms"], + "mapping_sha256": plan["mapping_sha256"], + "policy_sha256": plan["policy_sha256"], + "builder_contract_version": plan.get("builder_contract_version"), + "style_sha256": style_sha, + "sprite_json_sha256": sprite_sha, + "gap_disposition_sha256": gap_disposition_sha, + "semantic_completeness": semantic_completeness, + "semantic_backlog": semantic_backlog, + "style_sprite_contract": style_contract, + "planned_tile_jobs": int(plan["job_count"]), + "pbf_file_count": len(pbf_files), + "report_file_count": len(report_files), + "planned_output_features": planned, + "report_output_features": output, + "decoded_pbf_features": decoded_features, + "non_renderable_omissions": non_renderable_omissions, + "non_renderable_omission_layers": dict(sorted(non_renderable_omission_layers.items())), + "quantization_fallbacks": quantization_fallbacks, + "quantization_omissions": quantization_omissions, + "quantization_omission_layers": dict(sorted(quantization_omission_layers.items())), + "encoder_reconciled_tiles": encoder_reconciled_tiles, + "encoder_reconciled_drop_candidates": encoder_reconciled_candidates, + "hard_gate_unmapped": hard_gate, + "encoder_dropped_features": encoder_dropped, + "nav_name_conflicts": name_conflicts, + "nav_name_conflict_omissions": nav_name_conflict_audit.get("safe_omission_occurrences", 0), + "nav_name_conflict_unique_outputs": nav_name_conflict_audit.get("unique_conflict_outputs", 0), + "nav_name_conflict_audit": nav_name_conflict_audit, + "duplicate_feature_ids": duplicate_feature_ids, + "output_layer_counts": dict(sorted(decoded_layers.items())), + "failures": failures, + "inventory": inventory, + } + out = release_dir / "release_manifest_v1.json" + out.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8") + return result diff --git a/src/cm95pbf/style_contract.py b/src/cm95pbf/style_contract.py new file mode 100644 index 0000000..d936f43 --- /dev/null +++ b/src/cm95pbf/style_contract.py @@ -0,0 +1,174 @@ +from __future__ import annotations + +from collections import Counter, defaultdict +import json +from pathlib import Path +from typing import Any + +import mapbox_vector_tile + + +SPRITE_PROPERTY_FIELDS = ( + "chart_icon_image", + "chart_fill_pattern", + "chart_line_pattern", +) + + +def ev(expr: Any, props: dict[str, Any]): + if not isinstance(expr, list): + return expr + if not expr: + return None + op = expr[0] + if op == "get": + return props.get(expr[1]) + if op == "has": + return expr[1] in props + if op == "!": + return not bool(ev(expr[1], props)) + if op == "all": + return all(bool(ev(x, props)) for x in expr[1:]) + if op == "any": + return any(bool(ev(x, props)) for x in expr[1:]) + if op == "==": + return ev(expr[1], props) == ev(expr[2], props) + if op == "!=": + return ev(expr[1], props) != ev(expr[2], props) + if op == "slice": + value = ev(expr[1], props) + if value is None: + return None + start = int(ev(expr[2], props)) + end = int(ev(expr[3], props)) if len(expr) > 3 else None + return str(value)[start:end] + if op == "to-number": + value = ev(expr[1], props) + try: + num = float(value) + return int(num) if num.is_integer() else num + except Exception: + return 0 + if op == "literal": + return expr[1] + if op == "match": + value = ev(expr[1], props) + pairs = expr[2:-1] + default = expr[-1] + for i in range(0, len(pairs), 2): + label = pairs[i] + output = pairs[i + 1] + if isinstance(label, list) and label and label[0] == "literal": + labels = label[1] + if value in labels: + return ev(output, props) + elif isinstance(label, list): + if value in label: + return ev(output, props) + elif value == label: + return ev(output, props) + return ev(default, props) + raise RuntimeError(f"unsupported style filter op: {op}") + + +def audit_pbf_style_and_sprite( + pbf_root: Path, + style_path: Path, + sprite_json_path: Path | None = None, +) -> dict[str, Any]: + pbf_root = Path(pbf_root) + style = json.loads(Path(style_path).read_text(encoding="utf-8")) + sprite_keys = None + if sprite_json_path is not None: + sprite_obj = json.loads(Path(sprite_json_path).read_text(encoding="utf-8")) + sprite_keys = set(sprite_obj) + + style_by_source_layer = defaultdict(list) + for layer in style.get("layers", []): + if layer.get("source") == "navsea_delivery" and layer.get("source-layer"): + style_by_source_layer[layer["source-layer"]].append(layer) + + files = sorted(pbf_root.rglob("*.pbf")) + contract_unmatched = Counter() + zoom_hidden = Counter() + visible = Counter() + sprite_missing = Counter() + sprite_values = Counter() + total_features = 0 + + for path in files: + rel = path.relative_to(pbf_root) + if len(rel.parts) < 3: + raise RuntimeError(f"PBF path must end with z/x/y.pbf: {path}") + z = int(rel.parts[-3]) + decoded = mapbox_vector_tile.decode(path.read_bytes()) + for source_layer, layer in decoded.items(): + style_layers = style_by_source_layer.get(source_layer, []) + for feature in layer.get("features", []): + total_features += 1 + props = feature.get("properties") or {} + + filter_matches = [] + for sl in style_layers: + flt = sl.get("filter") + if flt is None or bool(ev(flt, props)): + filter_matches.append(sl) + + key = (z, source_layer) + if not filter_matches: + contract_unmatched[key] += 1 + else: + zoom_matches = [] + for sl in filter_matches: + minz = sl.get("minzoom") + maxz = sl.get("maxzoom") + if minz is not None and z < minz: + continue + if maxz is not None and z >= maxz: + continue + zoom_matches.append(sl) + if zoom_matches: + visible[key] += 1 + else: + zoom_hidden[key] += 1 + + if sprite_keys is not None: + for field in SPRITE_PROPERTY_FIELDS: + value = props.get(field) + if isinstance(value, str) and value: + sprite_values[(field, value)] += 1 + if value not in sprite_keys: + sprite_missing[(field, value)] += 1 + + return { + "schema": "navsea.cm95.style-sprite-contract-audit/v1", + "pbf_file_count": len(files), + "feature_count": total_features, + "style_source_layer_count": len(style_by_source_layer), + "contract_unmatched_count": sum(contract_unmatched.values()), + "zoom_hidden_count": sum(zoom_hidden.values()), + "visible_count": sum(visible.values()), + "sprite_key_count": None if sprite_keys is None else len(sprite_keys), + "sprite_missing_count": sum(sprite_missing.values()), + "contract_unmatched": [ + {"z": z, "source_layer": sl, "count": count} + for (z, sl), count in sorted(contract_unmatched.items()) + ], + "zoom_hidden": [ + {"z": z, "source_layer": sl, "count": count} + for (z, sl), count in sorted(zoom_hidden.items()) + ], + "sprite_missing": [ + {"field": field, "sprite_key": key, "count": count} + for (field, key), count in sorted(sprite_missing.items()) + ], + "sprite_values": [ + {"field": field, "sprite_key": key, "count": count} + for (field, key), count in sorted(sprite_values.items()) + ], + "overall": ( + "PASS" + if sum(contract_unmatched.values()) == 0 and sum(sprite_missing.values()) == 0 + else "FAIL" + ), + } diff --git a/tools/cm95_global_mapping_gap_audit_v1.py b/tools/cm95_global_mapping_gap_audit_v1.py new file mode 100644 index 0000000..671ad72 --- /dev/null +++ b/tools/cm95_global_mapping_gap_audit_v1.py @@ -0,0 +1,611 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 全 Dataset → NavSea delivery Mapping Gap 审计 v1 + +目的 +==== +在已经完成 production 首轮生成后,对 Dataset 全量 chart_feature 与当前 +cm95_to_navsea_v1.yaml 做只读对照,找出“当前 delivery 不会输出”的真实 +object_class + geometry_type 组合。 + +这一步专门用于 production mapping 收口,不修改数据库、不生成 PBF。 + +默认输入: + dataset_id = 1 + mapping = config/mappings/cm95_to_navsea_v1.yaml + +默认输出: + build/production/cm95_global_mapping_gap_audit_v1.json + build/production/cm95_global_mapping_gap_variants_v1.csv + build/production/cm95_global_mapping_gap_samples_v1.jsonl + build/production/cm95_global_mapping_gap_summary_v1.txt + +审计内容: +- 全 Dataset object_class + geometry_type + native_scale 数量; +- 当前 YAML 是否存在 exact rule; +- 同 object_class 的其它 geometry rule; +- 已知 hard_gate 是否出现未覆盖 geometry variant; +- 显式 ENGINEERING_ONLY / cm95_unmapped; +- 每个 gap variant 的属性键频率、样本值、relation20 覆盖; +- 每个 gap variant 的代表 Feature 样本。 + +数据库连接直接读取项目 .env: + CM93_DB_HOST + CM93_DB_PORT + CM93_DB_NAME + CM93_DB_USER + CM93_DB_PASSWORD + +执行: + & ".\.venv\Scripts\python.exe" .\tools\cm95_global_mapping_gap_audit_v1.py ` + --dataset-id 1 ` + --mapping .\config\mappings\cm95_to_navsea_v1.yaml +""" + +from __future__ import annotations + +import argparse +import csv +import json +from collections import Counter, defaultdict +from pathlib import Path +from typing import Any + +import pymysql +import yaml + +from cm93db.config import load_config + + +DELIVERY_MAIN_STATUSES = { + "MAPPED", + "MAPPED_CONDITIONAL", + "COMPOSITE", + "MAPPED_DERIVED_POINTS", +} +DELIVERY_DERIVED_STATUSES = { + "MAPPED", + "MAPPED_CONDITIONAL", + "DERIVED_LABEL_ONLY", +} + + +def parse_args(): + p = argparse.ArgumentParser( + description="CM95 全 Dataset → NavSea delivery Mapping Gap 审计 v1" + ) + p.add_argument("--dataset-id", type=int, default=1) + p.add_argument( + "--mapping", + default=r"config\mappings\cm95_to_navsea_v1.yaml", + ) + p.add_argument( + "--output", + default=r"build\production\cm95_global_mapping_gap_audit_v1.json", + ) + p.add_argument("--sample-per-variant", type=int, default=6) + p.add_argument("--attribute-value-limit", type=int, default=12) + return p.parse_args() + + +def json_dict(value: Any) -> dict[str, Any]: + if value is None: + return {} + if isinstance(value, dict): + return value + if isinstance(value, (bytes, bytearray, memoryview)): + value = bytes(value).decode("utf-8", errors="replace") + try: + obj = json.loads(str(value)) + return obj if isinstance(obj, dict) else {} + except Exception: + return {} + + +def scalar_text(value: Any) -> str: + if isinstance(value, (dict, list)): + return json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":")) + return str(value) + + +def load_rules(path: Path): + obj = yaml.safe_load(path.read_text(encoding="utf-8")) or {} + rules = obj.get("rules") or obj.get("mappings") or [] + if not isinstance(rules, list): + raise RuntimeError("mapping YAML 中找不到 rules/mappings list") + + exact: dict[tuple[str, str], dict[str, Any]] = {} + by_class: dict[str, list[dict[str, Any]]] = defaultdict(list) + + for rule in rules: + if not isinstance(rule, dict): + continue + cls = str(rule.get("cm95_object_class") or "").strip() + geom = str(rule.get("geometry_type") or "").strip().upper() + if not cls or not geom: + continue + exact[(cls, geom)] = rule + by_class[cls].append(rule) + + return obj, exact, by_class + + +def has_delivery_output(rule: dict[str, Any]) -> bool: + status = str(rule.get("mapping_status") or "") + target = str(rule.get("target_source_layer") or "") + if target and target != "cm95_unmapped" and status in DELIVERY_MAIN_STATUSES: + return True + + derived = rule.get("derived_outputs") or [] + if derived and status in DELIVERY_DERIVED_STATUSES: + for item in derived: + if not isinstance(item, dict): + continue + layer = str(item.get("source_layer") or "") + if layer and layer != "cm95_unmapped": + return True + return False + + +def gap_reason( + cls: str, + geom: str, + exact_rules: dict[tuple[str, str], dict[str, Any]], + by_class: dict[str, list[dict[str, Any]]], +): + rule = exact_rules.get((cls, geom)) + class_rules = by_class.get(cls, []) + + if rule is None: + inherited_hard_gate = any( + str(r.get("safety_class") or "") == "hard_gate" + for r in class_rules + ) + return { + "is_gap": True, + "reason": ( + "NO_EXACT_RULE_KNOWN_HARD_GATE_VARIANT" + if inherited_hard_gate + else "NO_EXACT_RULE" + ), + "rule": None, + "inherited_hard_gate": inherited_hard_gate, + } + + if has_delivery_output(rule): + return { + "is_gap": False, + "reason": "DELIVERED", + "rule": rule, + "inherited_hard_gate": False, + } + + target = str(rule.get("target_source_layer") or "") + status = str(rule.get("mapping_status") or "") + if target == "cm95_unmapped": + reason = "EXPLICIT_ENGINEERING_ONLY" + else: + reason = f"NOT_DELIVERED_STATUS_{status or 'EMPTY'}" + + return { + "is_gap": True, + "reason": reason, + "rule": rule, + "inherited_hard_gate": ( + str(rule.get("safety_class") or "") == "hard_gate" + ), + } + + +def connect(): + cfg = load_config() + return pymysql.connect( + host=cfg.host, + port=cfg.port, + user=cfg.user, + password=cfg.password, + database=cfg.database, + charset=cfg.charset, + cursorclass=pymysql.cursors.DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + write_timeout=30, + ) + + +def main(): + a = parse_args() + mapping_path = Path(a.mapping).resolve() + output_path = Path(a.output).resolve() + outdir = output_path.parent + outdir.mkdir(parents=True, exist_ok=True) + + _mapping_obj, exact_rules, by_class = load_rules(mapping_path) + + with connect() as conn: + try: + conn.cursor().execute("SET SESSION TRANSACTION READ ONLY") + except Exception: + pass + + with conn.cursor() as cur: + cur.execute( + """ + SELECT + f.object_class_id, + f.object_class, + f.geometry_type, + f.native_scale, + COUNT(*) AS feature_count, + COUNT(DISTINCT f.cell_id) AS cell_count + FROM chart_feature f + WHERE f.dataset_id=%s + AND f.geometry_type IN ('POINT','LINE','AREA') + GROUP BY + f.object_class_id, + f.object_class, + f.geometry_type, + f.native_scale + ORDER BY + f.object_class, + f.geometry_type, + f.native_scale + """, + (a.dataset_id,), + ) + grouped = list(cur.fetchall()) + + cur.execute( + """ + SELECT + object_class_id, + object_class, + geometry_code, + display_code, + description + FROM chart_dictionary_object + WHERE dataset_id=%s + """, + (a.dataset_id,), + ) + dictionary_rows = list(cur.fetchall()) + + conn.rollback() + + dictionary = { + int(r["object_class_id"]): r + for r in dictionary_rows + if r.get("object_class_id") is not None + } + + variants: dict[tuple[str, str], dict[str, Any]] = {} + for row in grouped: + cls = str(row["object_class"]) + geom = str(row["geometry_type"]).upper() + key = (cls, geom) + v = variants.setdefault( + key, + { + "object_class_id": ( + int(row["object_class_id"]) + if row.get("object_class_id") is not None + else None + ), + "object_class": cls, + "geometry_type": geom, + "feature_count": 0, + "cell_count_max": 0, + "scale_counts": Counter(), + }, + ) + cnt = int(row["feature_count"]) + v["feature_count"] += cnt + v["cell_count_max"] = max(v["cell_count_max"], int(row["cell_count"])) + v["scale_counts"][str(int(row["native_scale"]))] += cnt + + gap_variants = [] + for key, v in sorted( + variants.items(), + key=lambda kv: (-kv[1]["feature_count"], kv[0][0], kv[0][1]), + ): + cls, geom = key + state = gap_reason(cls, geom, exact_rules, by_class) + if not state["is_gap"]: + continue + + oid = v["object_class_id"] + d = dictionary.get(oid) if oid is not None else None + rule = state["rule"] + class_rules = by_class.get(cls, []) + + item = { + "object_class_id": oid, + "object_class": cls, + "geometry_type": geom, + "feature_count": int(v["feature_count"]), + "cell_count": int(v["cell_count_max"]), + "scale_counts": dict(sorted(v["scale_counts"].items(), key=lambda x: int(x[0]))), + "gap_reason": state["reason"], + "dictionary_description": d.get("description") if d else None, + "dictionary_geometry_code": d.get("geometry_code") if d else None, + "dictionary_display_code": d.get("display_code") if d else None, + "exact_rule_id": str(rule.get("rule_id")) if rule else None, + "exact_rule_status": str(rule.get("mapping_status")) if rule else None, + "exact_rule_target": str(rule.get("target_source_layer")) if rule else None, + "exact_rule_safety": str(rule.get("safety_class")) if rule else None, + "class_known_geometry_rules": [ + { + "geometry_type": str(r.get("geometry_type") or ""), + "rule_id": str(r.get("rule_id") or ""), + "target_source_layer": str(r.get("target_source_layer") or ""), + "mapping_status": str(r.get("mapping_status") or ""), + "safety_class": str(r.get("safety_class") or ""), + "canonical_object_type": str(r.get("canonical_object_type") or ""), + } + for r in class_rules + ], + "inherited_hard_gate": bool(state["inherited_hard_gate"]), + "attribute_key_counts": {}, + "attribute_value_samples": {}, + "relation20_present": 0, + "relation20_missing": 0, + "sample_features": [], + } + gap_variants.append(item) + + gap_keys = {(x["object_class"], x["geometry_type"]) for x in gap_variants} + gap_classes = sorted({x[0] for x in gap_keys}) + + # Gap rows are normally a small subset of Dataset. Read them once and + # build attribute/sample evidence in Python, avoiding dozens of SQL round trips. + if gap_classes: + placeholders = ",".join(["%s"] * len(gap_classes)) + with connect() as conn: + try: + conn.cursor().execute("SET SESSION TRANSACTION READ ONLY") + except Exception: + pass + with conn.cursor() as cur: + cur.execute( + f""" + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class_id, + f.object_class, + f.geometry_type, + f.native_scale, + f.raw_geotype, + f.coverage_id, + f.bbox_min_lon, + f.bbox_min_lat, + f.bbox_max_lon, + f.bbox_max_lat, + f.attributes_json, + f.geometry_repaired, + f.geometry_issue + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.object_class IN ({placeholders}) + AND f.geometry_type IN ('POINT','LINE','AREA') + ORDER BY + f.object_class, + f.geometry_type, + f.native_scale, + c.source_relative_path, + f.source_record_index + """, + (a.dataset_id, *gap_classes), + ) + source_rows = list(cur.fetchall()) + conn.rollback() + else: + source_rows = [] + + item_by_key = { + (x["object_class"], x["geometry_type"]): x + for x in gap_variants + } + key_counters: dict[tuple[str, str], Counter] = defaultdict(Counter) + value_counters: dict[tuple[str, str, str], Counter] = defaultdict(Counter) + sample_counts: Counter = Counter() + + sample_jsonl_path = outdir / "cm95_global_mapping_gap_samples_v1.jsonl" + with sample_jsonl_path.open("w", encoding="utf-8") as sample_file: + for row in source_rows: + key = ( + str(row["object_class"]), + str(row["geometry_type"]).upper(), + ) + item = item_by_key.get(key) + if item is None: + continue + + attrs = json_dict(row.get("attributes_json")) + for attr_key, attr_value in attrs.items(): + key_counters[key][str(attr_key)] += 1 + value_counters[(key[0], key[1], str(attr_key))][scalar_text(attr_value)] += 1 + + rel = attrs.get("_cm93_relation20_raw") + if rel is None or rel == "": + item["relation20_missing"] += 1 + else: + item["relation20_present"] += 1 + + if sample_counts[key] < max(1, int(a.sample_per_variant)): + sample_counts[key] += 1 + sample = { + "feature_id": int(row["feature_id"]), + "cell_id": int(row["cell_id"]), + "source_relative_path": str(row["source_relative_path"]), + "source_record_index": int(row["source_record_index"]), + "object_class_id": ( + int(row["object_class_id"]) + if row.get("object_class_id") is not None + else None + ), + "object_class": key[0], + "geometry_type": key[1], + "native_scale": int(row["native_scale"]), + "raw_geotype": row.get("raw_geotype"), + "coverage_id": row.get("coverage_id"), + "bbox": [ + row.get("bbox_min_lon"), + row.get("bbox_min_lat"), + row.get("bbox_max_lon"), + row.get("bbox_max_lat"), + ], + "attributes": attrs, + "geometry_repaired": bool(row.get("geometry_repaired")), + "geometry_issue": row.get("geometry_issue"), + } + item["sample_features"].append(sample) + sample_file.write( + json.dumps(sample, ensure_ascii=False, separators=(",", ":"), default=str) + + "\n" + ) + + for item in gap_variants: + key = (item["object_class"], item["geometry_type"]) + item["attribute_key_counts"] = dict( + key_counters[key].most_common() + ) + values = {} + for attr_key, _count in key_counters[key].most_common(): + values[attr_key] = [ + {"value": value, "count": count} + for value, count in value_counters[ + (key[0], key[1], attr_key) + ].most_common(max(1, int(a.attribute_value_limit))) + ] + item["attribute_value_samples"] = values + + reason_counts = Counter() + gap_feature_total = 0 + no_exact_total = 0 + explicit_total = 0 + inherited_hard_gate_total = 0 + for item in gap_variants: + reason_counts[item["gap_reason"]] += 1 + gap_feature_total += int(item["feature_count"]) + if item["gap_reason"].startswith("NO_EXACT_RULE"): + no_exact_total += int(item["feature_count"]) + else: + explicit_total += int(item["feature_count"]) + if item["inherited_hard_gate"]: + inherited_hard_gate_total += int(item["feature_count"]) + + report = { + "schema": "navsea.cm95.global-mapping-gap-audit/v1", + "dataset_id": int(a.dataset_id), + "mapping_path": str(mapping_path), + "source_variant_count": len(variants), + "gap_variant_count": len(gap_variants), + "gap_object_class_count": len({x["object_class"] for x in gap_variants}), + "gap_feature_total": gap_feature_total, + "no_exact_rule_feature_total": no_exact_total, + "explicit_engineering_or_status_gap_feature_total": explicit_total, + "inherited_hard_gate_feature_total": inherited_hard_gate_total, + "gap_reason_counts": dict(reason_counts), + "gap_variants": gap_variants, + } + + output_path.write_text( + json.dumps(report, ensure_ascii=False, indent=2, default=str), + encoding="utf-8", + ) + + csv_path = outdir / "cm95_global_mapping_gap_variants_v1.csv" + with csv_path.open("w", encoding="utf-8-sig", newline="") as f: + fields = [ + "object_class_id", + "object_class", + "geometry_type", + "feature_count", + "cell_count", + "gap_reason", + "inherited_hard_gate", + "dictionary_description", + "dictionary_geometry_code", + "dictionary_display_code", + "exact_rule_id", + "exact_rule_status", + "exact_rule_target", + "exact_rule_safety", + "scale_counts", + "known_geometry_rules", + "attribute_keys", + "relation20_present", + "relation20_missing", + ] + w = csv.DictWriter(f, fieldnames=fields) + w.writeheader() + for item in gap_variants: + w.writerow( + { + "object_class_id": item["object_class_id"], + "object_class": item["object_class"], + "geometry_type": item["geometry_type"], + "feature_count": item["feature_count"], + "cell_count": item["cell_count"], + "gap_reason": item["gap_reason"], + "inherited_hard_gate": item["inherited_hard_gate"], + "dictionary_description": item["dictionary_description"], + "dictionary_geometry_code": item["dictionary_geometry_code"], + "dictionary_display_code": item["dictionary_display_code"], + "exact_rule_id": item["exact_rule_id"], + "exact_rule_status": item["exact_rule_status"], + "exact_rule_target": item["exact_rule_target"], + "exact_rule_safety": item["exact_rule_safety"], + "scale_counts": json.dumps(item["scale_counts"], ensure_ascii=False, separators=(",", ":")), + "known_geometry_rules": json.dumps(item["class_known_geometry_rules"], ensure_ascii=False, separators=(",", ":")), + "attribute_keys": json.dumps(item["attribute_key_counts"], ensure_ascii=False, separators=(",", ":")), + "relation20_present": item["relation20_present"], + "relation20_missing": item["relation20_missing"], + } + ) + + txt_path = outdir / "cm95_global_mapping_gap_summary_v1.txt" + lines = [ + "CM95 全 Dataset → NavSea delivery Mapping Gap 审计 v1", + "=" * 76, + f"Dataset ID : {a.dataset_id}", + f"Source variants : {len(variants)}", + f"Gap variants : {len(gap_variants)}", + f"Gap object classes : {report['gap_object_class_count']}", + f"Gap feature rows : {gap_feature_total}", + f"No exact rule rows : {no_exact_total}", + f"Explicit/status gap rows: {explicit_total}", + f"Inherited hard-gate rows: {inherited_hard_gate_total}", + "", + "Top gap variants:", + ] + for item in gap_variants[:80]: + scales = ",".join( + f"{k}:{v}" for k, v in item["scale_counts"].items() + ) + lines.append( + f" {item['object_class']:<10} {item['geometry_type']:<5} " + f"rows={item['feature_count']:<6} " + f"reason={item['gap_reason']:<34} " + f"hard={str(item['inherited_hard_gate']):<5} " + f"scales=[{scales}]" + ) + lines += [ + "", + f"JSON : {output_path}", + f"CSV : {csv_path}", + f"SAMPLES: {sample_jsonl_path}", + ] + txt_path.write_text("\n".join(lines), encoding="utf-8") + + print("\n".join(lines)) + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_global_mapping_gap_closure_audit_v2.py b/tools/cm95_global_mapping_gap_closure_audit_v2.py new file mode 100644 index 0000000..980fbff --- /dev/null +++ b/tools/cm95_global_mapping_gap_closure_audit_v2.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +import yaml + +DELIVERY_STATUSES = {"MAPPED", "MAPPED_CONDITIONAL", "COMPOSITE", "MAPPED_DERIVED_POINTS"} + + +def parse_args(): + p = argparse.ArgumentParser(description="CM95 全 Dataset Mapping Gap 分类收口审计 v2") + p.add_argument("--gap-audit", default="build/production/cm95_global_mapping_gap_audit_v1.json") + p.add_argument("--mapping", default="config/mappings/cm95_to_navsea_v1.yaml") + p.add_argument("--disposition", default="config/mappings/cm95_gap_disposition_v1.yaml") + p.add_argument("--output", default="build/production/cm95_global_mapping_gap_closure_audit_v2.json") + return p.parse_args() + + +def main(): + a = parse_args() + gap = json.loads(Path(a.gap_audit).read_text(encoding="utf-8")) + mapping = yaml.safe_load(Path(a.mapping).read_text(encoding="utf-8")) or {} + disposition = yaml.safe_load(Path(a.disposition).read_text(encoding="utf-8")) or {} + + rules = { + (str(r.get("cm95_object_class") or ""), str(r.get("geometry_type") or "").upper()): r + for r in mapping.get("rules") or [] + if isinstance(r, dict) + } + disp = { + (str(r.get("object_class") or ""), str(r.get("geometry_type") or "").upper()): r + for r in disposition.get("variants") or [] + if isinstance(r, dict) + } + + unclassified = [] + pending = [] + existing_non_delivery = [] + newly_delivery = [] + for item in gap.get("gap_variants") or []: + key = (str(item.get("object_class") or ""), str(item.get("geometry_type") or "").upper()) + d = disp.get(key) + if d is None: + unclassified.append({"object_class": key[0], "geometry_type": key[1], "feature_count": item.get("feature_count")}) + continue + state = str(d.get("disposition") or "") + row = { + "object_class": key[0], + "geometry_type": key[1], + "feature_count": int(item.get("feature_count") or 0), + "disposition": state, + } + if state == "ENGINEERING_ONLY_PENDING_SEMANTIC_REVIEW": + pending.append(row) + elif state == "DELIVERY_MAPPED_V1_4_3": + newly_delivery.append(row) + elif state.startswith("EXISTING_"): + existing_non_delivery.append(row) + + fish = rules.get(("FSHHAV", "AREA")) + fish_ok = bool( + fish + and str(fish.get("target_source_layer")) == "anchor_caution_hazard_area" + and str(fish.get("safety_class")) == "hard_gate" + and str(fish.get("mapping_status")) in DELIVERY_STATUSES + ) + + contract = mapping.get("production_change_contract") or {} + changed_classes = sorted({str(v) for v in contract.get("delivery_output_changed_object_classes") or []}) + changed_ok = changed_classes == ["FSHHAV"] + + result = { + "schema": "navsea.cm95.global-mapping-gap-closure-audit/v2", + "dataset_id": gap.get("dataset_id"), + "observed_gap_variants": len(gap.get("gap_variants") or []), + "unclassified_variants": unclassified, + "newly_delivery_mapped": newly_delivery, + "existing_explicit_non_delivery": existing_non_delivery, + "pending_semantic_review": pending, + "pending_semantic_review_feature_rows": sum(x["feature_count"] for x in pending), + "fshhav_area_hard_gate_mapping_ok": fish_ok, + "delivery_output_changed_object_classes": changed_classes, + "delivery_change_contract_ok": changed_ok, + "semantic_completeness": "COMPLETE" if not pending else "PENDING_REVIEW", + "overall": "PASS" if not unclassified and fish_ok and changed_ok else "FAIL", + } + Path(a.output).parent.mkdir(parents=True, exist_ok=True) + Path(a.output).write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8") + + print(f"Observed gap variants : {result['observed_gap_variants']}") + print(f"Unclassified variants : {len(unclassified)}") + print(f"New delivery mappings : {len(newly_delivery)}") + print(f"Pending semantic review : {len(pending)} variants / {result['pending_semantic_review_feature_rows']} rows") + print(f"FSHHAV AREA hard-gate : {'PASS' if fish_ok else 'FAIL'}") + print(f"Delivery change contract: {'PASS' if changed_ok else 'FAIL'} {changed_classes}") + print(f"Semantic completeness : {result['semantic_completeness']}") + print(f"OVERALL classification : {result['overall']}") + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_mapping_contract_check_v1.py b/tools/cm95_mapping_contract_check_v1.py new file mode 100644 index 0000000..6b33e73 --- /dev/null +++ b/tools/cm95_mapping_contract_check_v1.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 → NavSea Mapping Contract 静态检查 v1 + +检查: +1. mapping 的正式 target_source_layer 是否被当前 style 实际消费; +2. chart_icon_image / chart_fill_pattern / chart_line_pattern 常量是否存在于 semantic sprite; +3. cm95_unmapped 不视为正式 style layer; +4. 输出 PASS/FAIL JSON。 + +示例: +python .\tools\cm95_mapping_contract_check_v1.py ` + --mapping .\config\mappings\cm95_to_navsea_v1.yaml ` + --style D:\path\style.navsea-delivery-full-semantic-unified-20260808.json ` + --sprite-json D:\path\semantic-sprite\sprite.json +""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +import yaml + + +SPRITE_FIELDS = { + "chart_icon_image", + "chart_fill_pattern", + "chart_line_pattern", +} + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument("--mapping", required=True) + p.add_argument("--style", required=True) + p.add_argument("--sprite-json", required=True) + p.add_argument("--output", default="cm95_mapping_contract_check_v1.json") + return p.parse_args() + + +def const_value(v): + if isinstance(v, dict) and set(v.keys()) == {"const"}: + return v["const"] + if isinstance(v, str): + return v + return None + + +def collect_sprite_refs(style_fields, path="style_fields"): + out = [] + if not isinstance(style_fields, dict): + return out + for k, v in style_fields.items(): + p = f"{path}.{k}" + if k in SPRITE_FIELDS: + c = const_value(v) + if isinstance(c, str) and c: + out.append((p, c)) + if isinstance(v, dict): + out.extend(collect_sprite_refs(v, p)) + elif isinstance(v, list): + for i, item in enumerate(v): + if isinstance(item, dict): + out.extend( + collect_sprite_refs(item, f"{p}[{i}]") + ) + return out + + +def main(): + a = parse_args() + + mapping = yaml.safe_load( + Path(a.mapping).read_text(encoding="utf-8") + ) + style = json.loads( + Path(a.style).read_text(encoding="utf-8") + ) + sprite = json.loads( + Path(a.sprite_json).read_text(encoding="utf-8") + ) + + style_layers = { + layer.get("source-layer") + for layer in style.get("layers", []) + if layer.get("source") == "navsea_delivery" + and layer.get("source-layer") + } + sprite_keys = set(sprite) + + layer_failures = [] + sprite_failures = [] + + for rule in mapping.get("rules", []): + rid = rule.get("rule_id") + target = rule.get("target_source_layer") + + if ( + target + and target != "cm95_unmapped" + and target not in style_layers + ): + layer_failures.append({ + "rule_id": rid, + "target_source_layer": target, + }) + + for p, key in collect_sprite_refs( + rule.get("style_fields", {}) + ): + if key not in sprite_keys: + sprite_failures.append({ + "rule_id": rid, + "path": p, + "sprite_key": key, + }) + + for i, derived in enumerate( + rule.get("derived_outputs", []) or [] + ): + layer = derived.get("source_layer") + if ( + layer + and layer != "cm95_unmapped" + and layer not in style_layers + ): + layer_failures.append({ + "rule_id": rid, + "derived_index": i, + "target_source_layer": layer, + }) + + for p, key in collect_sprite_refs( + derived.get("style_fields", {}), + f"derived_outputs[{i}].style_fields", + ): + if key not in sprite_keys: + sprite_failures.append({ + "rule_id": rid, + "path": p, + "sprite_key": key, + }) + + result = { + "mapping": str(Path(a.mapping).resolve()), + "style": str(Path(a.style).resolve()), + "sprite_json": str(Path(a.sprite_json).resolve()), + "style_source_layer_count": len(style_layers), + "sprite_key_count": len(sprite_keys), + "rule_count": len(mapping.get("rules", [])), + "layer_failures": layer_failures, + "sprite_failures": sprite_failures, + "failure_count": ( + len(layer_failures) + len(sprite_failures) + ), + } + result["overall"] = ( + "PASS" if result["failure_count"] == 0 else "FAIL" + ) + + Path(a.output).write_text( + json.dumps(result, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + print( + f"Rules : {result['rule_count']}" + ) + print( + f"Style source layers : {result['style_source_layer_count']}" + ) + print( + f"Sprite keys : {result['sprite_key_count']}" + ) + print( + f"Layer failures : {len(layer_failures)}" + ) + print( + f"Sprite failures : {len(sprite_failures)}" + ) + print( + f"OVERALL : {result['overall']}" + ) + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_nav_aid_relation_audit_v1.py b/tools/cm95_nav_aid_relation_audit_v1.py new file mode 100644 index 0000000..1ac3c91 --- /dev/null +++ b/tools/cm95_nav_aid_relation_audit_v1.py @@ -0,0 +1,375 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 / CM93 助航 relation20 全 AOI 审计 v1 + +用途 +==== +验证选定 PBF AOI(默认 z10/914/385)中 CM93 助航对象的 +`_cm93_relation20_raw` 是否可以作为 CM95→NavSea `navigation_marks` +的稳定合成键。 + +重点检查: +- LIGHTS 与 BCNLAT / BCNSPP / BOYSPP / RTPBCN / TOWERS / _extgn 等是否共享 relation20; +- 同一 relation20 组的坐标是否一致; +- 是否存在一个 relation20 对应多个不相干坐标; +- LIGHTS 中有多少可以安全合并,有多少必须独立输出; +- relation20 缺失情况; +- 跨 Cell 不合并。 + +本脚本只读 MySQL,不修改 importer/schema。 + +默认 AOI: +z10/914/385 +lon 141.328125 .. 141.6796875 +lat 40.44694705960049 .. 40.71395582628604 +""" + +from __future__ import annotations + +import argparse +import csv +import getpass +import json +import math +from collections import Counter, defaultdict +from datetime import datetime +from pathlib import Path + +import pymysql +from pymysql.cursors import DictCursor + + +NAV_CLASSES = { + "LIGHTS", + "BCNLAT", + "BCNSPP", + "BOYSPP", + "RTPBCN", + "TOWERS", + "_extgn", + "SISTAT", + "SISTAW", +} + +BASE_CLASSES = { + "BCNLAT", + "BCNSPP", + "BOYSPP", + "RTPBCN", + "TOWERS", + "_extgn", + "SISTAT", + "SISTAW", +} + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument("--host", default="127.0.0.1") + p.add_argument("--port", type=int, default=3306) + p.add_argument("--user", default="root") + p.add_argument("--password", default=None) + p.add_argument("--database", default="cm93_chart") + p.add_argument("--dataset-id", type=int, default=1) + + p.add_argument("--min-lon", type=float, default=141.328125) + p.add_argument("--min-lat", type=float, default=40.44694705960049) + p.add_argument("--max-lon", type=float, default=141.6796875) + p.add_argument("--max-lat", type=float, default=40.71395582628604) + + p.add_argument( + "--coord-tolerance-deg", + type=float, + default=1e-7, + help="同 relation20 组坐标最大容差,默认约厘米级~十米级以下的严格检查", + ) + p.add_argument("--output-dir", default=".") + return p.parse_args() + + +def rel20(attrs): + if not isinstance(attrs, dict): + return None + v = attrs.get("_cm93_relation20_raw") + if v is None: + return None + try: + return int(v) + except Exception: + return str(v) + + +def coord_distance_deg(a, b): + return math.hypot(a[0] - b[0], a[1] - b[1]) + + +def write_csv(path, rows): + rows = list(rows) + if not rows: + path.write_text("", encoding="utf-8-sig") + return + keys = [] + seen = set() + for row in rows: + for k in row: + if k not in seen: + seen.add(k) + keys.append(k) + with path.open("w", encoding="utf-8-sig", newline="") as f: + w = csv.DictWriter(f, fieldnames=keys) + w.writeheader() + for row in rows: + out = {} + for k in keys: + v = row.get(k) + if isinstance(v, (list, dict, tuple)): + v = json.dumps(v, ensure_ascii=False, default=str) + out[k] = v + w.writerow(out) + + +def main(): + a = parse_args() + if a.password is None: + a.password = getpass.getpass("MySQL password: ") + + outdir = Path(a.output_dir).resolve() + outdir.mkdir(parents=True, exist_ok=True) + + conn = pymysql.connect( + host=a.host, + port=a.port, + user=a.user, + password=a.password, + database=a.database, + charset="utf8mb4", + cursorclass=DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + ) + + rows = [] + try: + with conn.cursor() as cur: + try: + cur.execute("SET SESSION TRANSACTION READ ONLY") + except Exception: + pass + try: + cur.execute("START TRANSACTION READ ONLY") + except Exception: + cur.execute("START TRANSACTION") + + placeholders = ",".join(["%s"] * len(NAV_CLASSES)) + sql = f""" + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class, + f.native_scale, + f.bbox_min_lon, + f.bbox_min_lat, + f.attributes_json + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.geometry_type='POINT' + AND f.object_class IN ({placeholders}) + AND f.bbox_min_lon BETWEEN %s AND %s + AND f.bbox_min_lat BETWEEN %s AND %s + ORDER BY + f.cell_id, + f.native_scale, + f.object_class, + f.source_record_index + """ + params = [ + a.dataset_id, + *sorted(NAV_CLASSES), + a.min_lon, + a.max_lon, + a.min_lat, + a.max_lat, + ] + cur.execute(sql, params) + rows = list(cur.fetchall()) + conn.rollback() + finally: + conn.close() + + for row in rows: + attrs = row.get("attributes_json") + if isinstance(attrs, str): + try: + attrs = json.loads(attrs) + except Exception: + attrs = {} + elif attrs is None: + attrs = {} + row["attributes"] = attrs + row["relation20"] = rel20(attrs) + row["lon"] = float(row["bbox_min_lon"]) + row["lat"] = float(row["bbox_min_lat"]) + row.pop("attributes_json", None) + + groups = defaultdict(list) + no_relation = [] + for row in rows: + rel = row["relation20"] + if rel is None: + no_relation.append(row) + else: + groups[(int(row["cell_id"]), rel)].append(row) + + group_rows = [] + light_total = 0 + light_with_relation = 0 + light_mergeable = 0 + light_relation_without_base = 0 + coord_conflict_groups = 0 + + for row in rows: + if row["object_class"] == "LIGHTS": + light_total += 1 + if row["relation20"] is not None: + light_with_relation += 1 + + for (cell_id, relation20), members in sorted(groups.items()): + classes = Counter(m["object_class"] for m in members) + coords = [(m["lon"], m["lat"]) for m in members] + base = coords[0] + max_spread = max(coord_distance_deg(base, c) for c in coords) + + has_light = classes["LIGHTS"] > 0 + base_members = [ + m for m in members + if m["object_class"] in BASE_CLASSES + ] + has_base = bool(base_members) + + if max_spread > a.coord_tolerance_deg: + coord_conflict_groups += 1 + + if has_light and has_base and max_spread <= a.coord_tolerance_deg: + light_mergeable += classes["LIGHTS"] + elif has_light and not has_base: + light_relation_without_base += classes["LIGHTS"] + + group_rows.append({ + "cell_id": cell_id, + "relation20": relation20, + "member_count": len(members), + "classes": dict(classes), + "has_light": has_light, + "has_base_component": has_base, + "base_classes": sorted( + set(m["object_class"] for m in base_members) + ), + "max_coord_spread_deg": max_spread, + "coord_ok": max_spread <= a.coord_tolerance_deg, + "members": [ + { + "feature_id": m["feature_id"], + "source_record_index": m["source_record_index"], + "object_class": m["object_class"], + "native_scale": m["native_scale"], + "lon": m["lon"], + "lat": m["lat"], + "attributes": m["attributes"], + } + for m in members + ], + }) + + no_relation_counts = Counter( + r["object_class"] for r in no_relation + ) + + standalone_lights = [ + r for r in rows + if r["object_class"] == "LIGHTS" + and ( + r["relation20"] is None + or not any( + g["cell_id"] == r["cell_id"] + and g["relation20"] == r["relation20"] + and g["has_base_component"] + and g["coord_ok"] + for g in group_rows + ) + ) + ] + + report = { + "version": "v1", + "generated_at": datetime.now().isoformat(timespec="seconds"), + "dataset_id": a.dataset_id, + "aoi_bbox": [ + a.min_lon, a.min_lat, a.max_lon, a.max_lat + ], + "coord_tolerance_deg": a.coord_tolerance_deg, + "counts": { + "nav_point_rows": len(rows), + "relation_groups": len(groups), + "rows_without_relation20": len(no_relation), + "coord_conflict_groups": coord_conflict_groups, + "light_total": light_total, + "light_with_relation20": light_with_relation, + "light_mergeable_by_relation20": light_mergeable, + "light_relation_without_base": light_relation_without_base, + "light_standalone_required": len(standalone_lights), + }, + "no_relation_by_class": dict(no_relation_counts), + "groups": group_rows, + "standalone_lights": standalone_lights, + "decision": ( + "PASS_RELATION20_PRIMARY_KEY" + if light_total > 0 + and light_mergeable > 0 + and coord_conflict_groups == 0 + else "REVIEW_RELATION20" + ), + } + + json_path = outdir / "cm95_nav_aid_relation_audit_v1.json" + csv_path = outdir / "cm95_nav_aid_relation_groups_v1.csv" + txt_path = outdir / "cm95_nav_aid_relation_audit_v1.txt" + + json_path.write_text( + json.dumps(report, ensure_ascii=False, indent=2, default=str), + encoding="utf-8", + ) + write_csv(csv_path, group_rows) + + lines = [ + "CM95 / CM93 助航 relation20 全 AOI 审计 v1", + "=" * 76, + f"NAV point rows : {len(rows)}", + f"Relation groups : {len(groups)}", + f"Rows without relation20 : {len(no_relation)}", + f"Coordinate conflict groups : {coord_conflict_groups}", + "", + f"LIGHTS total : {light_total}", + f"LIGHTS with relation20 : {light_with_relation}", + f"LIGHTS mergeable : {light_mergeable}", + f"LIGHTS relation no base : {light_relation_without_base}", + f"LIGHTS standalone required : {len(standalone_lights)}", + "", + f"DECISION : {report['decision']}", + ] + txt_path.write_text("\n".join(lines), encoding="utf-8") + + print("\n".join(lines)) + print("") + print("输出:") + print(json_path) + print(csv_path) + print(txt_path) + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_nav_name_candidate_audit_v1.py b/tools/cm95_nav_name_candidate_audit_v1.py new file mode 100644 index 0000000..9ec78b8 --- /dev/null +++ b/tools/cm95_nav_name_candidate_audit_v1.py @@ -0,0 +1,546 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 / CM93 助航名称候选审计 v1 + +目的 +==== +为 CM95→NavSea `navigation_marks.chart_label_text` 找到可审计的 CM95 自有名称来源, +不使用 NEWPEC/reference PBF 名称反灌。 + +默认检查第一测试 AOI: + z10/914/385 + lon 141.328125 .. 141.6796875 + lat 40.44694705960049 .. 40.71395582628604 +默认重点比例尺: + 1:200000 + +候选来源: +1. 助航组件自身 OBJNAM / NOBJNM; +2. 同 cell、同 native_scale 的 `_texto._texta.text`; +3. 同 native_scale、邻近 cell 的 `_texto._texta.text`,仅作为低置信参考。 + +关联原则: +- 助航组件仍然用 `(cell_id, _cm93_relation20_raw)` 合成; +- 本脚本只审计名称,不改变 relation20 合成规则; +- 不自动把最近文字当名称; +- 输出距离和来源,由下一步确定安全规则。 + +输出: + cm95_nav_name_candidates_v1.json + cm95_nav_name_candidates_v1.csv + cm95_nav_name_candidates_v1.txt + +执行: + python .\tools\cm95_nav_name_candidate_audit_v1.py ` + --host 127.0.0.1 ` + --port 3306 ` + --user root ` + --database cm93_chart ` + --dataset-id 1 ` + --native-scale 200000 +""" + +from __future__ import annotations + +import argparse +import csv +import getpass +import json +import math +from collections import defaultdict +from datetime import datetime +from pathlib import Path +from typing import Any + +import pymysql +from pymysql.cursors import DictCursor + + +NAV_CLASSES = { + "LIGHTS", + "BCNLAT", + "BCNSPP", + "BOYSPP", + "RTPBCN", + "TOWERS", + "_extgn", + "SISTAT", + "SISTAW", +} + +DIRECT_NAME_KEYS = ( + "OBJNAM", + "NOBJNM", +) + +DEFAULT_BBOX = ( + 141.328125, + 40.44694705960049, + 141.6796875, + 40.71395582628604, +) + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument("--host", default="127.0.0.1") + p.add_argument("--port", type=int, default=3306) + p.add_argument("--user", default="root") + p.add_argument("--password", default=None) + p.add_argument("--database", default="cm93_chart") + p.add_argument("--dataset-id", type=int, default=1) + p.add_argument("--native-scale", type=int, default=200000) + p.add_argument("--min-lon", type=float, default=DEFAULT_BBOX[0]) + p.add_argument("--min-lat", type=float, default=DEFAULT_BBOX[1]) + p.add_argument("--max-lon", type=float, default=DEFAULT_BBOX[2]) + p.add_argument("--max-lat", type=float, default=DEFAULT_BBOX[3]) + p.add_argument( + "--radius-m", + type=float, + default=800.0, + help="每个助航对象保存的文字候选搜索半径", + ) + p.add_argument( + "--candidate-limit", + type=int, + default=12, + ) + p.add_argument("--output-dir", default=".") + return p.parse_args() + + +def json_dict(value: Any) -> dict[str, Any]: + if value is None: + return {} + if isinstance(value, dict): + return value + if isinstance(value, (bytes, bytearray, memoryview)): + value = bytes(value).decode("utf-8", "replace") + try: + obj = json.loads(value) + except Exception: + return {} + return obj if isinstance(obj, dict) else {} + + +def relation20(attrs: dict[str, Any]): + value = attrs.get("_cm93_relation20_raw") + if value is None: + return None + try: + return int(value) + except Exception: + return str(value) + + +def texta(attrs: dict[str, Any]): + value = attrs.get("_texta") + if not isinstance(value, dict): + return None, None + text = value.get("text") + prefix = value.get("prefix") + if text is None: + return None, prefix + text = str(text).strip() + return (text or None), prefix + + +def direct_names(attrs: dict[str, Any]): + out = [] + for key in DIRECT_NAME_KEYS: + value = attrs.get(key) + if isinstance(value, str) and value.strip(): + out.append({ + "field": key, + "text": value.strip(), + }) + return out + + +def haversine_m(lon1, lat1, lon2, lat2): + r = 6371008.8 + p1 = math.radians(lat1) + p2 = math.radians(lat2) + dp = p2 - p1 + dl = math.radians(lon2 - lon1) + a = ( + math.sin(dp / 2) ** 2 + + math.cos(p1) * math.cos(p2) + * math.sin(dl / 2) ** 2 + ) + return 2 * r * math.asin(min(1.0, math.sqrt(a))) + + +def write_csv(path: Path, rows): + rows = list(rows) + fields = [ + "cell_id", + "source_relative_path", + "native_scale", + "relation20", + "lon", + "lat", + "component_classes", + "component_source_record_indices", + "direct_names", + "nearest_same_cell_text", + "nearest_same_cell_distance_m", + "nearest_any_cell_text", + "nearest_any_cell_distance_m", + "same_cell_candidate_count", + "all_candidate_count", + "candidate_summary", + ] + with path.open("w", encoding="utf-8-sig", newline="") as f: + w = csv.DictWriter(f, fieldnames=fields) + w.writeheader() + for row in rows: + out = dict(row) + for key in ( + "component_classes", + "component_source_record_indices", + "direct_names", + "candidate_summary", + ): + out[key] = json.dumps( + out.get(key), + ensure_ascii=False, + separators=(",", ":"), + ) + w.writerow(out) + + +def main(): + a = parse_args() + if a.password is None: + a.password = getpass.getpass("MySQL password: ") + + outdir = Path(a.output_dir).resolve() + outdir.mkdir(parents=True, exist_ok=True) + + conn = pymysql.connect( + host=a.host, + port=a.port, + user=a.user, + password=a.password, + database=a.database, + charset="utf8mb4", + cursorclass=DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + ) + + nav_rows = [] + text_rows = [] + + try: + with conn.cursor() as cur: + try: + cur.execute("SET SESSION TRANSACTION READ ONLY") + except Exception: + pass + try: + cur.execute("START TRANSACTION READ ONLY") + except Exception: + cur.execute("START TRANSACTION") + + placeholders = ",".join(["%s"] * len(NAV_CLASSES)) + cur.execute( + f""" + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class, + f.native_scale, + f.bbox_min_lon AS lon, + f.bbox_min_lat AS lat, + f.attributes_json + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.native_scale=%s + AND f.geometry_type='POINT' + AND f.object_class IN ({placeholders}) + AND f.bbox_min_lon BETWEEN %s AND %s + AND f.bbox_min_lat BETWEEN %s AND %s + ORDER BY + f.cell_id, + f.source_record_index + """, + ( + a.dataset_id, + a.native_scale, + *sorted(NAV_CLASSES), + a.min_lon, + a.max_lon, + a.min_lat, + a.max_lat, + ), + ) + nav_rows = list(cur.fetchall()) + + # 扩大少量边界,避免 tile 边缘的文字候选被切掉。 + lat_pad = a.radius_m / 111320.0 + mid_lat = (a.min_lat + a.max_lat) / 2.0 + lon_pad = ( + a.radius_m + / max(1.0, 111320.0 * math.cos(math.radians(mid_lat))) + ) + + cur.execute( + """ + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.native_scale, + f.bbox_min_lon AS lon, + f.bbox_min_lat AS lat, + f.attributes_json + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.native_scale=%s + AND f.geometry_type='POINT' + AND f.object_class='_texto' + AND f.bbox_min_lon BETWEEN %s AND %s + AND f.bbox_min_lat BETWEEN %s AND %s + ORDER BY + f.cell_id, + f.source_record_index + """, + ( + a.dataset_id, + a.native_scale, + a.min_lon - lon_pad, + a.max_lon + lon_pad, + a.min_lat - lat_pad, + a.max_lat + lat_pad, + ), + ) + text_rows = list(cur.fetchall()) + + conn.rollback() + finally: + conn.close() + + for row in nav_rows: + row["attributes"] = json_dict(row.pop("attributes_json")) + row["relation20"] = relation20(row["attributes"]) + row["lon"] = float(row["lon"]) + row["lat"] = float(row["lat"]) + + parsed_text = [] + for row in text_rows: + attrs = json_dict(row.pop("attributes_json")) + text, prefix = texta(attrs) + if not text: + continue + parsed_text.append({ + "feature_id": int(row["feature_id"]), + "cell_id": int(row["cell_id"]), + "source_relative_path": str(row["source_relative_path"]), + "source_record_index": int(row["source_record_index"]), + "native_scale": int(row["native_scale"]), + "lon": float(row["lon"]), + "lat": float(row["lat"]), + "text": text, + "prefix": prefix, + }) + + groups = defaultdict(list) + standalone = [] + + for row in nav_rows: + rel = row["relation20"] + if rel is None: + standalone.append([row]) + else: + groups[(int(row["cell_id"]), rel)].append(row) + + nav_groups = list(groups.values()) + standalone + + results = [] + + for members in nav_groups: + # relation20 组成员已由上一步证明同址; + # standalone 则只有一条。 + lon = sum(m["lon"] for m in members) / len(members) + lat = sum(m["lat"] for m in members) / len(members) + cell_id = int(members[0]["cell_id"]) + source_path = str(members[0]["source_relative_path"]) + rel = members[0]["relation20"] + + strong_names = [] + for m in members: + for n in direct_names(m["attributes"]): + strong_names.append({ + "object_class": m["object_class"], + "source_record_index": m["source_record_index"], + **n, + }) + + candidates = [] + for t in parsed_text: + distance = haversine_m( + lon, + lat, + t["lon"], + t["lat"], + ) + if distance > a.radius_m: + continue + candidates.append({ + **t, + "same_cell": t["cell_id"] == cell_id, + "distance_m": round(distance, 2), + }) + + candidates.sort( + key=lambda c: ( + not c["same_cell"], + c["distance_m"], + c["text"], + ) + ) + + same_cell = [ + c for c in candidates if c["same_cell"] + ] + + nearest_same = same_cell[0] if same_cell else None + nearest_any = ( + min(candidates, key=lambda c: c["distance_m"]) + if candidates + else None + ) + + results.append({ + "cell_id": cell_id, + "source_relative_path": source_path, + "native_scale": a.native_scale, + "relation20": rel, + "lon": lon, + "lat": lat, + "component_classes": [ + m["object_class"] for m in members + ], + "component_source_record_indices": [ + int(m["source_record_index"]) for m in members + ], + "direct_names": strong_names, + "nearest_same_cell_text": ( + nearest_same["text"] if nearest_same else None + ), + "nearest_same_cell_distance_m": ( + nearest_same["distance_m"] if nearest_same else None + ), + "nearest_any_cell_text": ( + nearest_any["text"] if nearest_any else None + ), + "nearest_any_cell_distance_m": ( + nearest_any["distance_m"] if nearest_any else None + ), + "same_cell_candidate_count": len(same_cell), + "all_candidate_count": len(candidates), + "candidate_summary": candidates[: a.candidate_limit], + }) + + results.sort( + key=lambda r: ( + r["cell_id"], + -1 if r["relation20"] is None else r["relation20"], + r["lon"], + r["lat"], + ) + ) + + direct_named = sum( + 1 for r in results if r["direct_names"] + ) + same_100 = sum( + 1 + for r in results + if r["nearest_same_cell_distance_m"] is not None + and r["nearest_same_cell_distance_m"] <= 100.0 + ) + same_250 = sum( + 1 + for r in results + if r["nearest_same_cell_distance_m"] is not None + and r["nearest_same_cell_distance_m"] <= 250.0 + ) + + report = { + "schema": "navsea.cm95.nav-name-candidate-audit/v1", + "generated_at": datetime.now().isoformat(timespec="seconds"), + "dataset_id": a.dataset_id, + "native_scale": a.native_scale, + "aoi_bbox": [ + a.min_lon, + a.min_lat, + a.max_lon, + a.max_lat, + ], + "search_radius_m": a.radius_m, + "counts": { + "nav_component_rows": len(nav_rows), + "nav_groups": len(results), + "texto_rows_with_text": len(parsed_text), + "groups_with_direct_OBJNAM_or_NOBJNM": direct_named, + "groups_with_same_cell_text_within_100m": same_100, + "groups_with_same_cell_text_within_250m": same_250, + }, + "groups": results, + "decision": ( + "DATA_READY_FOR_NAME_ASSOCIATION_REVIEW" + if results + else "NO_NAV_GROUPS" + ), + } + + json_path = outdir / "cm95_nav_name_candidates_v1.json" + csv_path = outdir / "cm95_nav_name_candidates_v1.csv" + txt_path = outdir / "cm95_nav_name_candidates_v1.txt" + + json_path.write_text( + json.dumps( + report, + ensure_ascii=False, + indent=2, + default=str, + ), + encoding="utf-8", + ) + write_csv(csv_path, results) + + lines = [ + "CM95 / CM93 助航名称候选审计 v1", + "=" * 76, + f"Native scale : {a.native_scale}", + f"Nav component rows : {len(nav_rows)}", + f"Nav groups : {len(results)}", + f"_texto rows with text : {len(parsed_text)}", + f"Groups with direct OBJNAM/NOBJNM : {direct_named}", + f"Same-cell text <=100m : {same_100}", + f"Same-cell text <=250m : {same_250}", + "", + "注意:最近文字只是候选,不代表自动确定为助航名称。", + "下一步由映射审计决定哪些关系可安全写入 chart_label_text。", + ] + txt_path.write_text("\n".join(lines), encoding="utf-8") + + print("\n".join(lines)) + print("") + print(json_path) + print(csv_path) + print(txt_path) + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_nav_name_conflict_audit_v1.py b/tools/cm95_nav_name_conflict_audit_v1.py new file mode 100644 index 0000000..219fbef --- /dev/null +++ b/tools/cm95_nav_name_conflict_audit_v1.py @@ -0,0 +1,285 @@ +from __future__ import annotations + +import argparse +import csv +import json +from collections import Counter, defaultdict +from pathlib import Path +from typing import Any + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser( + description="Audit CM95 navigation composite name conflicts from production trace reports." + ) + p.add_argument("--release-dir", required=True, type=Path) + p.add_argument( + "--profile", + default="delivery", + choices=["delivery", "engineering"], + ) + p.add_argument("--output-json", required=True, type=Path) + p.add_argument("--output-csv", required=True, type=Path) + return p.parse_args() + + +def tile_from_trace_path(trace_path: Path, trace_root: Path) -> str: + rel = trace_path.relative_to(trace_root) + parts = rel.parts + if len(parts) < 3: + return rel.as_posix() + z, x, y_name = parts[-3], parts[-2], parts[-1] + y = y_name.replace(".trace.jsonl", "") + return f"{z}/{x}/{y}" + + +def read_jsonl(path: Path): + with path.open("r", encoding="utf-8") as f: + for line_no, raw in enumerate(f, 1): + raw = raw.strip() + if not raw: + continue + try: + obj = json.loads(raw) + except json.JSONDecodeError as exc: + raise RuntimeError(f"{path}:{line_no}: invalid JSON: {exc}") from exc + if isinstance(obj, dict): + yield obj + + +def main() -> int: + args = parse_args() + release_dir = args.release_dir.resolve() + report_root = release_dir / "reports" / args.profile + + if not report_root.exists(): + raise SystemExit(f"report root not found: {report_root}") + + trace_files = sorted(report_root.rglob("*.trace.jsonl")) + report_files = sorted( + p for p in report_root.rglob("*.json") + if not p.name.endswith(".trace.json") + ) + + report_conflict_occurrences = 0 + for path in report_files: + try: + obj = json.loads(path.read_text(encoding="utf-8")) + except Exception: + continue + report_conflict_occurrences += int( + (obj.get("navigation_composites") or {}).get("name_conflict_groups") or 0 + ) + + raw_conflicts: list[dict[str, Any]] = [] + + for trace_path in trace_files: + tile = tile_from_trace_path(trace_path, report_root) + z = int(tile.split("/", 1)[0]) if "/" in tile else None + + for row in read_jsonl(trace_path): + if row.get("nav_name_conflict") is not True: + continue + + candidates = [ + str(v) for v in (row.get("nav_name_candidates") or []) + if v is not None and str(v) != "" + ] + components = [ + str(v) for v in (row.get("source_component_ids") or []) + if v is not None + ] + + raw_conflicts.append( + { + "tile": tile, + "zoom": z, + "output_id": row.get("output_id"), + "output_layer": row.get("output_layer"), + "source_id": row.get("source_id"), + "relation20": row.get("relation20"), + "native_scale": row.get("native_scale"), + "mapping_rule_id": row.get("mapping_rule_id"), + "mapping_status": row.get("mapping_status"), + "nav_name_source": row.get("nav_name_source"), + "nav_name_candidates": candidates, + "source_component_ids": components, + "trace_path": str(trace_path.relative_to(release_dir)).replace("\\", "/"), + } + ) + + unique: dict[str, dict[str, Any]] = {} + + for item in raw_conflicts: + output_id = item.get("output_id") + if output_id is not None: + key = f"output_id:{output_id}" + else: + key = json.dumps( + { + "source_id": item.get("source_id"), + "relation20": item.get("relation20"), + "native_scale": item.get("native_scale"), + "components": sorted(item.get("source_component_ids") or []), + }, + sort_keys=True, + ensure_ascii=False, + ) + + if key not in unique: + unique[key] = { + "key": key, + "output_id": item.get("output_id"), + "output_layer": item.get("output_layer"), + "source_id": item.get("source_id"), + "relation20": item.get("relation20"), + "native_scale": item.get("native_scale"), + "mapping_rule_id": item.get("mapping_rule_id"), + "mapping_status": item.get("mapping_status"), + "nav_name_candidates": list(item.get("nav_name_candidates") or []), + "source_component_ids": list(item.get("source_component_ids") or []), + "occurrences": 0, + "tiles": [], + "zooms": [], + "trace_paths": [], + } + + u = unique[key] + u["occurrences"] += 1 + + tile = item["tile"] + if tile not in u["tiles"]: + u["tiles"].append(tile) + + z = item.get("zoom") + if z is not None and z not in u["zooms"]: + u["zooms"].append(z) + + tpath = item["trace_path"] + if tpath not in u["trace_paths"]: + u["trace_paths"].append(tpath) + + # Preserve any candidates/components that differ across repeated tile occurrences. + for candidate in item.get("nav_name_candidates") or []: + if candidate not in u["nav_name_candidates"]: + u["nav_name_candidates"].append(candidate) + for component in item.get("source_component_ids") or []: + if component not in u["source_component_ids"]: + u["source_component_ids"].append(component) + + unique_rows = list(unique.values()) + + for row in unique_rows: + row["tiles"].sort() + row["zooms"].sort() + row["trace_paths"].sort() + + unique_rows.sort( + key=lambda r: ( + -(int(r.get("occurrences") or 0)), + int(r.get("native_scale") or 0), + str(r.get("source_id") or ""), + ) + ) + + zoom_occurrences = Counter( + int(x["zoom"]) for x in raw_conflicts if x.get("zoom") is not None + ) + scale_unique = Counter( + int(x["native_scale"]) for x in unique_rows if x.get("native_scale") is not None + ) + candidate_count_unique = Counter( + len(x.get("nav_name_candidates") or []) for x in unique_rows + ) + + tile_set = {x["tile"] for x in raw_conflicts} + + result = { + "schema": "navsea.cm95.nav-name-conflict-audit/v1", + "release_dir": str(release_dir), + "profile": args.profile, + "trace_file_count": len(trace_files), + "report_file_count": len(report_files), + "report_name_conflict_occurrences": report_conflict_occurrences, + "trace_name_conflict_occurrences": len(raw_conflicts), + "unique_conflict_outputs": len(unique_rows), + "affected_tiles": len(tile_set), + "occurrences_by_zoom": dict(sorted(zoom_occurrences.items())), + "unique_conflicts_by_native_scale": dict(sorted(scale_unique.items())), + "unique_conflicts_by_candidate_count": dict(sorted(candidate_count_unique.items())), + "unique_conflicts": unique_rows, + } + + args.output_json.parent.mkdir(parents=True, exist_ok=True) + args.output_json.write_text( + json.dumps(result, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + args.output_csv.parent.mkdir(parents=True, exist_ok=True) + with args.output_csv.open("w", encoding="utf-8-sig", newline="") as f: + writer = csv.DictWriter( + f, + fieldnames=[ + "output_id", + "source_id", + "relation20", + "native_scale", + "occurrences", + "tile_count", + "zooms", + "nav_name_candidates", + "source_component_ids", + "mapping_rule_id", + "mapping_status", + ], + ) + writer.writeheader() + for row in unique_rows: + writer.writerow( + { + "output_id": row.get("output_id"), + "source_id": row.get("source_id"), + "relation20": row.get("relation20"), + "native_scale": row.get("native_scale"), + "occurrences": row.get("occurrences"), + "tile_count": len(row.get("tiles") or []), + "zooms": "|".join(str(v) for v in row.get("zooms") or []), + "nav_name_candidates": " | ".join(row.get("nav_name_candidates") or []), + "source_component_ids": " | ".join(row.get("source_component_ids") or []), + "mapping_rule_id": row.get("mapping_rule_id"), + "mapping_status": row.get("mapping_status"), + } + ) + + print("CM95 navigation name conflict audit") + print("=" * 72) + print(f"Release : {release_dir}") + print(f"Report conflict occurrences : {report_conflict_occurrences}") + print(f"Trace conflict occurrences : {len(raw_conflicts)}") + print(f"Unique conflict outputs : {len(unique_rows)}") + print(f"Affected tiles : {len(tile_set)}") + print(f"JSON : {args.output_json}") + print(f"CSV : {args.output_csv}") + + if report_conflict_occurrences != len(raw_conflicts): + print("") + print("WARNING: report count and trace count differ; inspect reports before changing policy.") + + print("") + print("Top unique conflicts:") + for row in unique_rows[:20]: + print( + f" output_id={row.get('output_id')} " + f"scale={row.get('native_scale')} " + f"occ={row.get('occurrences')} " + f"tiles={len(row.get('tiles') or [])} " + f"relation20={row.get('relation20')} " + f"names={row.get('nav_name_candidates')}" + ) + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/cm95_nav_name_multiscale_audit_v2.py b/tools/cm95_nav_name_multiscale_audit_v2.py new file mode 100644 index 0000000..5cfcb60 --- /dev/null +++ b/tools/cm95_nav_name_multiscale_audit_v2.py @@ -0,0 +1,716 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 / CM93 助航名称多尺度与显式关系审计 v2 + +目标 +==== +确认 CM95 自身是否存在可安全写入 NavSea +`navigation_marks.chart_label_text` 的名称来源。 + +重点: +1. 同时检查 1:20,000 / 1:50,000 / 1:200,000; +2. 优先检查助航对象和 `_texto` 中的显式关系/索引字段; +3. 再检查同 Cell 最近文字; +4. 不自动把最近文字当名称; +5. 不读取或反灌 NEWPEC/reference PBF 名称; +6. 只读 MySQL,不修改 importer/schema。 + +默认 AOI: +z10/914/385 +lon 141.328125 .. 141.6796875 +lat 40.44694705960049 .. 40.71395582628604 + +输出: +- cm95_nav_name_multiscale_audit_v2.json +- cm95_nav_name_multiscale_groups_v2.csv +- cm95_nav_text_relation_fields_v2.csv +- cm95_nav_name_multiscale_audit_v2.txt +""" + +from __future__ import annotations + +import argparse +import csv +import getpass +import json +import math +from collections import Counter, defaultdict +from datetime import datetime +from pathlib import Path +from typing import Any + +import pymysql +from pymysql.cursors import DictCursor + + +NAV_CLASSES = { + "LIGHTS", + "BCNLAT", + "BCNSPP", + "BOYSPP", + "RTPBCN", + "TOWERS", + "_extgn", + "SISTAT", + "SISTAW", +} + +DEFAULT_SCALES = (20000, 50000, 200000) +DIRECT_NAME_KEYS = ("OBJNAM", "NOBJNM") + +RELATION_KEY_HINTS = ( + "relation", + "related", + "index", + "record", + "assoc", + "link", + "ref", + "cm93", +) + +DEFAULT_BBOX = ( + 141.328125, + 40.44694705960049, + 141.6796875, + 40.71395582628604, +) + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument("--host", default="127.0.0.1") + p.add_argument("--port", type=int, default=3306) + p.add_argument("--user", default="root") + p.add_argument("--password", default=None) + p.add_argument("--database", default="cm93_chart") + p.add_argument("--dataset-id", type=int, default=1) + p.add_argument( + "--scales", + default="20000,50000,200000", + help="逗号分隔,例如 20000,50000,200000", + ) + p.add_argument("--min-lon", type=float, default=DEFAULT_BBOX[0]) + p.add_argument("--min-lat", type=float, default=DEFAULT_BBOX[1]) + p.add_argument("--max-lon", type=float, default=DEFAULT_BBOX[2]) + p.add_argument("--max-lat", type=float, default=DEFAULT_BBOX[3]) + p.add_argument("--radius-m", type=float, default=800.0) + p.add_argument("--candidate-limit", type=int, default=12) + p.add_argument("--output-dir", default=".") + return p.parse_args() + + +def json_dict(value: Any) -> dict[str, Any]: + if value is None: + return {} + if isinstance(value, dict): + return value + if isinstance(value, (bytes, bytearray, memoryview)): + value = bytes(value).decode("utf-8", "replace") + try: + obj = json.loads(value) + except Exception: + return {} + return obj if isinstance(obj, dict) else {} + + +def relation20(attrs: dict[str, Any]): + value = attrs.get("_cm93_relation20_raw") + if value is None: + return None + try: + return int(value) + except Exception: + return str(value) + + +def texta(attrs: dict[str, Any]): + value = attrs.get("_texta") + if not isinstance(value, dict): + return None, None + text = value.get("text") + prefix = value.get("prefix") + if text is None: + return None, prefix + text = str(text).strip() + return (text or None), prefix + + +def direct_names(attrs: dict[str, Any]): + out = [] + for key in DIRECT_NAME_KEYS: + value = attrs.get(key) + if isinstance(value, str) and value.strip(): + out.append({"field": key, "text": value.strip()}) + return out + + +def relation_like_fields(attrs: dict[str, Any]): + out = {} + for key, value in attrs.items(): + lk = str(key).lower() + if any(h in lk for h in RELATION_KEY_HINTS): + out[key] = value + return out + + +def haversine_m(lon1, lat1, lon2, lat2): + r = 6371008.8 + p1 = math.radians(lat1) + p2 = math.radians(lat2) + dp = p2 - p1 + dl = math.radians(lon2 - lon1) + a = ( + math.sin(dp / 2) ** 2 + + math.cos(p1) * math.cos(p2) + * math.sin(dl / 2) ** 2 + ) + return 2 * r * math.asin(min(1.0, math.sqrt(a))) + + +def flatten_relation_values(obj: Any): + """用于审计,不解释语义。把标量/list/dict转成可比较字符串集合。""" + values = set() + + def walk(v): + if v is None: + return + if isinstance(v, dict): + for kk, vv in v.items(): + values.add(f"{kk}={json.dumps(vv, ensure_ascii=False, sort_keys=True, default=str)}") + walk(vv) + elif isinstance(v, list): + for item in v: + walk(item) + else: + values.add(str(v)) + + walk(obj) + return values + + +def write_csv(path: Path, rows, fields): + with path.open("w", encoding="utf-8-sig", newline="") as f: + w = csv.DictWriter(f, fieldnames=fields) + w.writeheader() + for row in rows: + out = {} + for field in fields: + value = row.get(field) + if isinstance(value, (dict, list, tuple)): + value = json.dumps( + value, + ensure_ascii=False, + separators=(",", ":"), + default=str, + ) + out[field] = value + w.writerow(out) + + +def main(): + a = parse_args() + scales = tuple( + sorted( + { + int(x.strip()) + for x in a.scales.split(",") + if x.strip() + } + ) + ) + if not scales: + raise SystemExit("scales 不能为空") + + if a.password is None: + a.password = getpass.getpass("MySQL password: ") + + outdir = Path(a.output_dir).resolve() + outdir.mkdir(parents=True, exist_ok=True) + + conn = pymysql.connect( + host=a.host, + port=a.port, + user=a.user, + password=a.password, + database=a.database, + charset="utf8mb4", + cursorclass=DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + ) + + nav_rows = [] + text_rows = [] + + try: + with conn.cursor() as cur: + try: + cur.execute("SET SESSION TRANSACTION READ ONLY") + except Exception: + pass + try: + cur.execute("START TRANSACTION READ ONLY") + except Exception: + cur.execute("START TRANSACTION") + + nav_ph = ",".join(["%s"] * len(NAV_CLASSES)) + scale_ph = ",".join(["%s"] * len(scales)) + + cur.execute( + f""" + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class, + f.native_scale, + f.bbox_min_lon AS lon, + f.bbox_min_lat AS lat, + f.attributes_json + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.native_scale IN ({scale_ph}) + AND f.geometry_type='POINT' + AND f.object_class IN ({nav_ph}) + AND f.bbox_min_lon BETWEEN %s AND %s + AND f.bbox_min_lat BETWEEN %s AND %s + ORDER BY + f.native_scale, + f.cell_id, + f.source_record_index + """, + ( + a.dataset_id, + *scales, + *sorted(NAV_CLASSES), + a.min_lon, + a.max_lon, + a.min_lat, + a.max_lat, + ), + ) + nav_rows = list(cur.fetchall()) + + lat_pad = a.radius_m / 111320.0 + mid_lat = (a.min_lat + a.max_lat) / 2.0 + lon_pad = ( + a.radius_m + / max( + 1.0, + 111320.0 * math.cos(math.radians(mid_lat)), + ) + ) + + cur.execute( + f""" + SELECT + f.id AS feature_id, + f.cell_id, + c.source_relative_path, + f.source_record_index, + f.object_class, + f.native_scale, + f.bbox_min_lon AS lon, + f.bbox_min_lat AS lat, + f.attributes_json + FROM chart_feature f + JOIN chart_cell c ON c.id=f.cell_id + WHERE f.dataset_id=%s + AND f.native_scale IN ({scale_ph}) + AND f.geometry_type='POINT' + AND f.object_class='_texto' + AND f.bbox_min_lon BETWEEN %s AND %s + AND f.bbox_min_lat BETWEEN %s AND %s + ORDER BY + f.native_scale, + f.cell_id, + f.source_record_index + """, + ( + a.dataset_id, + *scales, + a.min_lon - lon_pad, + a.max_lon + lon_pad, + a.min_lat - lat_pad, + a.max_lat + lat_pad, + ), + ) + text_rows = list(cur.fetchall()) + + conn.rollback() + finally: + conn.close() + + parsed_nav = [] + for row in nav_rows: + attrs = json_dict(row.pop("attributes_json")) + parsed_nav.append( + { + **row, + "feature_id": int(row["feature_id"]), + "cell_id": int(row["cell_id"]), + "source_record_index": int(row["source_record_index"]), + "native_scale": int(row["native_scale"]), + "lon": float(row["lon"]), + "lat": float(row["lat"]), + "attributes": attrs, + "relation20": relation20(attrs), + "direct_names": direct_names(attrs), + "relation_fields": relation_like_fields(attrs), + } + ) + + parsed_text = [] + relation_field_counter = Counter() + + for row in text_rows: + attrs = json_dict(row.pop("attributes_json")) + text, prefix = texta(attrs) + rel_fields = relation_like_fields(attrs) + for key in rel_fields: + relation_field_counter[ + (int(row["native_scale"]), str(key)) + ] += 1 + + parsed_text.append( + { + **row, + "feature_id": int(row["feature_id"]), + "cell_id": int(row["cell_id"]), + "source_record_index": int(row["source_record_index"]), + "native_scale": int(row["native_scale"]), + "lon": float(row["lon"]), + "lat": float(row["lat"]), + "text": text, + "prefix": prefix, + "attributes": attrs, + "relation_fields": rel_fields, + "relation_values": sorted( + flatten_relation_values(rel_fields) + ), + } + ) + + # relation20 仅在同 cell + 同 scale 内组成助航主组。 + grouped = defaultdict(list) + standalone = [] + + for row in parsed_nav: + rel = row["relation20"] + if rel is None: + standalone.append([row]) + else: + grouped[ + ( + row["native_scale"], + row["cell_id"], + rel, + ) + ].append(row) + + nav_groups = list(grouped.values()) + standalone + + results = [] + per_scale = {} + + for members in nav_groups: + scale = members[0]["native_scale"] + cell_id = members[0]["cell_id"] + rel = members[0]["relation20"] + lon = sum(m["lon"] for m in members) / len(members) + lat = sum(m["lat"] for m in members) / len(members) + + direct = [] + nav_relation_values = set() + for m in members: + for n in m["direct_names"]: + direct.append( + { + "object_class": m["object_class"], + "source_record_index": m["source_record_index"], + **n, + } + ) + nav_relation_values |= flatten_relation_values( + m["relation_fields"] + ) + + candidates = [] + + # 同比例尺;显式关系优先,同 cell 次之,距离只作证据。 + for t in parsed_text: + if t["native_scale"] != scale or not t["text"]: + continue + + distance = haversine_m( + lon, + lat, + t["lon"], + t["lat"], + ) + + explicit_overlap = sorted( + nav_relation_values.intersection( + set(t["relation_values"]) + ) + ) + + if distance <= a.radius_m or explicit_overlap: + candidates.append( + { + "feature_id": t["feature_id"], + "cell_id": t["cell_id"], + "source_relative_path": t["source_relative_path"], + "source_record_index": t["source_record_index"], + "native_scale": t["native_scale"], + "lon": t["lon"], + "lat": t["lat"], + "text": t["text"], + "prefix": t["prefix"], + "same_cell": t["cell_id"] == cell_id, + "distance_m": round(distance, 2), + "explicit_relation_overlap": explicit_overlap, + "text_relation_fields": t["relation_fields"], + } + ) + + candidates.sort( + key=lambda c: ( + not bool(c["explicit_relation_overlap"]), + not c["same_cell"], + c["distance_m"], + c["text"], + ) + ) + + explicit = [ + c + for c in candidates + if c["explicit_relation_overlap"] + ] + same = [c for c in candidates if c["same_cell"]] + + nearest_same = ( + min(same, key=lambda c: c["distance_m"]) + if same + else None + ) + + result = { + "native_scale": scale, + "cell_id": cell_id, + "source_relative_path": members[0]["source_relative_path"], + "relation20": rel, + "lon": lon, + "lat": lat, + "component_classes": [ + m["object_class"] for m in members + ], + "component_source_record_indices": [ + m["source_record_index"] for m in members + ], + "direct_names": direct, + "nav_relation_fields": { + str(m["source_record_index"]): m["relation_fields"] + for m in members + if m["relation_fields"] + }, + "explicit_text_candidates": explicit[ + : a.candidate_limit + ], + "nearest_same_cell_text": ( + nearest_same["text"] if nearest_same else None + ), + "nearest_same_cell_distance_m": ( + nearest_same["distance_m"] if nearest_same else None + ), + "same_cell_candidate_count": len(same), + "all_candidate_count": len(candidates), + "candidate_summary": candidates[ + : a.candidate_limit + ], + } + results.append(result) + + results.sort( + key=lambda r: ( + r["native_scale"], + r["cell_id"], + -1 if r["relation20"] is None else r["relation20"], + r["lon"], + r["lat"], + ) + ) + + for scale in scales: + subset = [r for r in results if r["native_scale"] == scale] + per_scale[str(scale)] = { + "nav_groups": len(subset), + "groups_with_direct_names": sum( + 1 for r in subset if r["direct_names"] + ), + "groups_with_explicit_text_candidates": sum( + 1 + for r in subset + if r["explicit_text_candidates"] + ), + "groups_with_same_cell_text_within_50m": sum( + 1 + for r in subset + if r["nearest_same_cell_distance_m"] is not None + and r["nearest_same_cell_distance_m"] <= 50 + ), + "groups_with_same_cell_text_within_100m": sum( + 1 + for r in subset + if r["nearest_same_cell_distance_m"] is not None + and r["nearest_same_cell_distance_m"] <= 100 + ), + "groups_with_same_cell_text_within_250m": sum( + 1 + for r in subset + if r["nearest_same_cell_distance_m"] is not None + and r["nearest_same_cell_distance_m"] <= 250 + ), + } + + relation_rows = [ + { + "native_scale": scale, + "field_name": field, + "occurrence_count": count, + } + for (scale, field), count in sorted( + relation_field_counter.items() + ) + ] + + report = { + "schema": "navsea.cm95.nav-name-multiscale-audit/v2", + "generated_at": datetime.now().isoformat(timespec="seconds"), + "dataset_id": a.dataset_id, + "scales": list(scales), + "aoi_bbox": [ + a.min_lon, + a.min_lat, + a.max_lon, + a.max_lat, + ], + "search_radius_m": a.radius_m, + "counts": { + "nav_component_rows": len(parsed_nav), + "nav_groups": len(results), + "texto_rows": len(parsed_text), + "texto_rows_with_text": sum( + 1 for t in parsed_text if t["text"] + ), + }, + "per_scale": per_scale, + "text_relation_field_counts": relation_rows, + "groups": results, + "decision": "READY_FOR_SAFE_NAME_RULE_REVIEW", + } + + json_path = ( + outdir / "cm95_nav_name_multiscale_audit_v2.json" + ) + groups_csv = ( + outdir / "cm95_nav_name_multiscale_groups_v2.csv" + ) + rel_csv = ( + outdir / "cm95_nav_text_relation_fields_v2.csv" + ) + txt_path = ( + outdir / "cm95_nav_name_multiscale_audit_v2.txt" + ) + + json_path.write_text( + json.dumps( + report, + ensure_ascii=False, + indent=2, + default=str, + ), + encoding="utf-8", + ) + + write_csv( + groups_csv, + results, + [ + "native_scale", + "cell_id", + "source_relative_path", + "relation20", + "lon", + "lat", + "component_classes", + "component_source_record_indices", + "direct_names", + "nav_relation_fields", + "explicit_text_candidates", + "nearest_same_cell_text", + "nearest_same_cell_distance_m", + "same_cell_candidate_count", + "all_candidate_count", + "candidate_summary", + ], + ) + + write_csv( + rel_csv, + relation_rows, + [ + "native_scale", + "field_name", + "occurrence_count", + ], + ) + + lines = [ + "CM95 / CM93 助航名称多尺度与显式关系审计 v2", + "=" * 82, + f"Dataset ID : {a.dataset_id}", + f"Scales : {','.join(map(str, scales))}", + f"Nav component rows : {len(parsed_nav)}", + f"Nav groups : {len(results)}", + f"_texto rows : {len(parsed_text)}", + "", + ] + + for scale in scales: + s = per_scale[str(scale)] + lines += [ + f"1:{scale}", + f" groups : {s['nav_groups']}", + f" direct names : {s['groups_with_direct_names']}", + f" explicit text relation: {s['groups_with_explicit_text_candidates']}", + f" same-cell <= 50m : {s['groups_with_same_cell_text_within_50m']}", + f" same-cell <= 100m : {s['groups_with_same_cell_text_within_100m']}", + f" same-cell <= 250m : {s['groups_with_same_cell_text_within_250m']}", + "", + ] + + lines += [ + "注意:", + "- 显式关系候选优先于距离候选。", + "- 最近文字仍不会被脚本自动写入 chart_label_text。", + "- 若 20k/50k/200k 都无安全来源,则该数据源的助航名称保持为空,不从 NEWPEC 反灌。", + ] + txt_path.write_text("\n".join(lines), encoding="utf-8") + + print("\n".join(lines)) + print("") + print(json_path) + print(groups_csv) + print(rel_csv) + print(txt_path) + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_pbf_build_reports_audit_v1.py b/tools/cm95_pbf_build_reports_audit_v1.py new file mode 100644 index 0000000..ace27ba --- /dev/null +++ b/tools/cm95_pbf_build_reports_audit_v1.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from __future__ import annotations + +import argparse +from collections import Counter +import json +from pathlib import Path + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument("--report-root", default="build/pbf-reports") + p.add_argument("--profile", choices=["delivery", "engineering"], default="delivery") + p.add_argument("--output", default="cm95_pbf_build_reports_audit_v1.json") + return p.parse_args() + + +def main(): + a = parse_args() + root = Path(a.report_root) / a.profile + files = sorted( + p for p in root.rglob("*.json") + if not p.name.endswith(".trace.json") + ) + + layer_counts = Counter() + unmapped = Counter() + hard_gate = [] + total_input = 0 + total_output = 0 + relation_groups = 0 + standalone_lights = 0 + named_from_direct_source = 0 + name_conflict_groups = 0 + quantization_fallbacks = 0 + quantization_omissions = 0 + quantization_omission_layers = Counter() + encoder_dropped_features = [] + planned_output = 0 + + for p in files: + obj = json.loads(p.read_text(encoding="utf-8")) + total_input += int(obj.get("input_feature_count") or 0) + total_output += int(obj.get("output_feature_count") or 0) + planned_output += int(obj.get("planned_output_feature_count") or obj.get("output_feature_count") or 0) + layer_counts.update(obj.get("output_layer_counts") or {}) + unmapped.update(obj.get("unmapped_class_counts") or {}) + nav = obj.get("navigation_composites") or {} + relation_groups += int(nav.get("groups") or 0) + standalone_lights += int(nav.get("standalone_lights") or 0) + named_from_direct_source += int(nav.get("named_from_direct_source") or 0) + name_conflict_groups += int(nav.get("name_conflict_groups") or 0) + quantization_fallbacks += len(obj.get("quantization_fallbacks") or []) + omissions = obj.get("quantization_omissions") or [] + quantization_omissions += len(omissions) + for item in omissions: + if isinstance(item, dict): + quantization_omission_layers[str(item.get("layer") or "UNKNOWN")] += 1 + for item in obj.get("encoder_dropped_features") or []: + encoder_dropped_features.append({"file": str(p), **item}) + for item in obj.get("hard_gate_unmapped") or []: + hard_gate.append({"file": str(p), **item}) + + result = { + "schema": "navsea.cm95.build-report-audit/v1", + "profile": a.profile, + "report_file_count": len(files), + "input_rows_considered": total_input, + "planned_output_features": planned_output, + "output_features": total_output, + "output_layer_counts": dict(layer_counts), + "unmapped_class_counts": dict(unmapped), + "navigation_relation_groups": relation_groups, + "standalone_lights": standalone_lights, + "nav_named_from_direct_source": named_from_direct_source, + "nav_name_conflict_groups": name_conflict_groups, + "quantization_fallbacks": quantization_fallbacks, + "quantization_omissions": quantization_omissions, + "quantization_omission_layers": dict(sorted(quantization_omission_layers.items())), + "encoder_dropped_features": encoder_dropped_features, + "hard_gate_unmapped": hard_gate, + "failure_count": len(hard_gate) + name_conflict_groups + len(encoder_dropped_features) + (1 if planned_output != total_output else 0), + "overall": ( + "PASS" + if not hard_gate and name_conflict_groups == 0 and not encoder_dropped_features and planned_output == total_output + else "FAIL" + ), + } + + Path(a.output).write_text( + json.dumps(result, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + print(f"Reports : {len(files)}") + print(f"Input rows : {total_input}") + print(f"Planned output : {planned_output}") + print(f"Output features : {total_output}") + print(f"Navigation composites : {relation_groups}") + print(f"Standalone LIGHTS : {standalone_lights}") + print(f"Direct nav names : {named_from_direct_source}") + print(f"Nav name conflicts : {name_conflict_groups}") + print(f"Hard-gate unmapped : {len(hard_gate)}") + print(f"Quantization fallback : {quantization_fallbacks}") + print(f"Quantization omissions : {quantization_omissions}") + print(f"Encoder dropped : {len(encoder_dropped_features)}") + print(f"OVERALL : {result['overall']}") + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_pbf_output_audit_v1.py b/tools/cm95_pbf_output_audit_v1.py new file mode 100644 index 0000000..34e2e4e --- /dev/null +++ b/tools/cm95_pbf_output_audit_v1.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from __future__ import annotations + +import argparse +from collections import Counter, defaultdict +import json +from pathlib import Path + +import mapbox_vector_tile +import yaml + + +DELIVERY_ALLOWLIST = { + "canonical_object_type", + "class_code", + "chart_fill_pattern", + "chart_fill_style", + "chart_icon_image", + "chart_label_position_code", + "chart_label_subtext", + "chart_label_text", + "chart_line_color", + "chart_line_width", + "chart_symbol_code", + "chart_text_color", + "chart_text_style", + "clearance_height_m", + "depth_value_m", + "display_code", + "least_depth_m", + "light_color_code", + "light_sector_mode", + "arc_id", + "arc_source_code", + "name_ja", + "place_name_en", + "shape_class_code", +} + +SPRITE_FIELDS = {"chart_icon_image", "chart_fill_pattern", "chart_line_pattern", "arc_id"} + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument("--pbf-root", required=True) + p.add_argument("--style", required=True) + p.add_argument("--sprite-json", required=True) + p.add_argument("--policy", default="config/pbf/cm95_tile_policy_v1.yaml") + p.add_argument("--profile", choices=["delivery", "engineering"], default="delivery") + p.add_argument("--output", default="cm95_pbf_output_audit_v1.json") + return p.parse_args() + + +def main(): + a = parse_args() + root = Path(a.pbf_root) + style = json.loads(Path(a.style).read_text(encoding="utf-8")) + sprite = json.loads(Path(a.sprite_json).read_text(encoding="utf-8")) + policy = yaml.safe_load(Path(a.policy).read_text(encoding="utf-8")) + + style_layers = { + layer["source-layer"] + for layer in style.get("layers", []) + if layer.get("source") == "navsea_delivery" and layer.get("source-layer") + } + sprite_keys = set(sprite) + + layer_counts = Counter() + extent_counts = Counter() + unknown_layers = Counter() + property_failures = [] + sprite_failures = [] + decode_failures = [] + feature_ids = defaultdict(set) + duplicate_ids = [] + + files = sorted(root.rglob("*.pbf")) + for path in files: + try: + z = int(path.relative_to(root).parts[0]) + decoded = mapbox_vector_tile.decode(path.read_bytes()) + except Exception as exc: + decode_failures.append({"file": str(path), "error": str(exc)}) + continue + + expected_extent = int( + policy.get("extent_by_zoom", {}).get(str(z), policy.get("default_extent", 4096)) + ) + + for layer_name, payload in decoded.items(): + features = payload.get("features", []) + layer_counts[layer_name] += len(features) + extent = int(payload.get("extent") or 4096) + extent_counts[f"z{z}:{extent}"] += 1 + + if extent != expected_extent: + decode_failures.append( + { + "file": str(path), + "layer": layer_name, + "error": f"extent {extent} != expected {expected_extent}", + } + ) + + if layer_name not in style_layers and not ( + a.profile == "engineering" and layer_name == "cm95_unmapped" + ): + unknown_layers[layer_name] += len(features) + + for f in features: + fid = f.get("id") + if fid is not None: + key = (str(path), layer_name) + if fid in feature_ids[key]: + duplicate_ids.append( + {"file": str(path), "layer": layer_name, "id": fid} + ) + feature_ids[key].add(fid) + + props = f.get("properties") or {} + if a.profile == "delivery": + extras = sorted(set(props) - DELIVERY_ALLOWLIST) + if extras: + property_failures.append( + { + "file": str(path), + "layer": layer_name, + "id": fid, + "extra_properties": extras, + } + ) + + for field in SPRITE_FIELDS: + value = props.get(field) + if value and value not in sprite_keys: + # arc_id may intentionally reference arc sprite; same JSON key contract applies. + sprite_failures.append( + { + "file": str(path), + "layer": layer_name, + "id": fid, + "field": field, + "value": value, + } + ) + + failure_count = ( + len(decode_failures) + + sum(unknown_layers.values()) + + len(property_failures) + + len(sprite_failures) + + len(duplicate_ids) + ) + + result = { + "schema": "navsea.cm95.pbf-output-audit/v1", + "profile": a.profile, + "pbf_file_count": len(files), + "feature_count": sum(layer_counts.values()), + "layer_counts": dict(layer_counts), + "extent_counts": dict(extent_counts), + "unknown_layers": dict(unknown_layers), + "decode_or_extent_failures": decode_failures, + "delivery_property_failures": property_failures, + "sprite_failures": sprite_failures, + "duplicate_feature_ids_within_layer_tile": duplicate_ids, + "failure_count": failure_count, + "overall": "PASS" if failure_count == 0 else "FAIL", + } + + Path(a.output).write_text( + json.dumps(result, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + print(f"PBF files : {result['pbf_file_count']}") + print(f"Features : {result['feature_count']}") + print(f"Layers : {len(layer_counts)}") + print(f"Failures : {failure_count}") + print(f"OVERALL : {result['overall']}") + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_pbf_style_contract_audit_v2.py b/tools/cm95_pbf_style_contract_audit_v2.py new file mode 100644 index 0000000..f9698ee --- /dev/null +++ b/tools/cm95_pbf_style_contract_audit_v2.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""CM95 delivery PBF → NavSea style 消费契约审计 v2。 + +检查每个 delivery feature: +1. source-layer 是否存在于 style; +2. 属性值是否至少能命中一个 style filter(忽略 min/max zoom); +3. 当前 zoom 是否实际可见; +4. 将“契约不匹配”和“因 minzoom/maxzoom 有意隐藏”分开统计。 + +适用于当前 NavSea unified style 使用的 filter 表达式子集。 +""" + +from __future__ import annotations + +import argparse +import json +from collections import Counter, defaultdict +from pathlib import Path +from typing import Any + +import mapbox_vector_tile + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument("--pbf-root", required=True) + p.add_argument("--style", required=True) + p.add_argument("--output", default="cm95_pbf_style_contract_audit_v2.json") + return p.parse_args() + + +def ev(expr: Any, props: dict[str, Any]): + if not isinstance(expr, list): + return expr + if not expr: + return None + op = expr[0] + if op == "get": + return props.get(expr[1]) + if op == "has": + return expr[1] in props + if op == "!": + return not bool(ev(expr[1], props)) + if op == "all": + return all(bool(ev(x, props)) for x in expr[1:]) + if op == "any": + return any(bool(ev(x, props)) for x in expr[1:]) + if op == "==": + return ev(expr[1], props) == ev(expr[2], props) + if op == "!=": + return ev(expr[1], props) != ev(expr[2], props) + if op == "slice": + value = ev(expr[1], props) + if value is None: + return None + start = int(ev(expr[2], props)) + end = int(ev(expr[3], props)) if len(expr) > 3 else None + return str(value)[start:end] + if op == "to-number": + value = ev(expr[1], props) + try: + num = float(value) + return int(num) if num.is_integer() else num + except Exception: + return 0 + if op == "literal": + return expr[1] + if op == "match": + value = ev(expr[1], props) + pairs = expr[2:-1] + default = expr[-1] + for i in range(0, len(pairs), 2): + label = pairs[i] + output = pairs[i + 1] + if isinstance(label, list) and label and label[0] == "literal": + labels = label[1] + if value in labels: + return ev(output, props) + elif isinstance(label, list): + if value in label: + return ev(output, props) + elif value == label: + return ev(output, props) + return ev(default, props) + raise RuntimeError(f"unsupported style filter op: {op}") + + +def decode_layers(path: Path): + decoded = mapbox_vector_tile.decode(path.read_bytes()) + for name, layer in decoded.items(): + yield name, layer + + +def main(): + a = parse_args() + pbf_root = Path(a.pbf_root) + style = json.loads(Path(a.style).read_text(encoding="utf-8")) + + style_by_source_layer = defaultdict(list) + for layer in style.get("layers", []): + if layer.get("source") == "navsea_delivery" and layer.get("source-layer"): + style_by_source_layer[layer["source-layer"]].append(layer) + + files = sorted(pbf_root.rglob("*.pbf")) + contract_unmatched = Counter() + zoom_hidden = Counter() + visible = Counter() + examples = defaultdict(list) + total_features = 0 + + for path in files: + try: + rel = path.relative_to(pbf_root) + z = int(rel.parts[-3]) + except Exception: + raise RuntimeError(f"PBF path must end with z/x/y.pbf: {path}") + + for source_layer, layer in decode_layers(path): + style_layers = style_by_source_layer.get(source_layer, []) + for feature in layer.get("features", []): + total_features += 1 + props = feature.get("properties") or {} + + filter_matches = [] + for sl in style_layers: + flt = sl.get("filter") + if flt is None or bool(ev(flt, props)): + filter_matches.append(sl) + + key = (z, source_layer) + if not filter_matches: + contract_unmatched[key] += 1 + if len(examples[("contract", key)]) < 10: + examples[("contract", key)].append(props) + continue + + zoom_matches = [] + for sl in filter_matches: + minz = sl.get("minzoom") + maxz = sl.get("maxzoom") + if minz is not None and z < minz: + continue + if maxz is not None and z >= maxz: + continue + zoom_matches.append(sl) + + if zoom_matches: + visible[key] += 1 + else: + zoom_hidden[key] += 1 + if len(examples[("zoom", key)]) < 10: + examples[("zoom", key)].append(props) + + result = { + "schema": "navsea.cm95.style-contract-audit/v2", + "pbf_file_count": len(files), + "feature_count": total_features, + "style_source_layer_count": len(style_by_source_layer), + "contract_unmatched_count": sum(contract_unmatched.values()), + "zoom_hidden_count": sum(zoom_hidden.values()), + "visible_count": sum(visible.values()), + "contract_unmatched": [ + {"z": z, "source_layer": sl, "count": count, + "examples": examples.get(("contract", (z, sl)), [])} + for (z, sl), count in sorted(contract_unmatched.items()) + ], + "zoom_hidden": [ + {"z": z, "source_layer": sl, "count": count, + "examples": examples.get(("zoom", (z, sl)), [])} + for (z, sl), count in sorted(zoom_hidden.items()) + ], + } + result["overall"] = "PASS" if result["contract_unmatched_count"] == 0 else "FAIL" + + Path(a.output).write_text( + json.dumps(result, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + print(f"PBF files : {result['pbf_file_count']}") + print(f"Features : {result['feature_count']}") + print(f"Contract unmatched : {result['contract_unmatched_count']}") + print(f"Zoom-hidden (expected) : {result['zoom_hidden_count']}") + print(f"Visible : {result['visible_count']}") + print(f"OVERALL : {result['overall']}") + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_production_failure_audit_v1.py b/tools/cm95_production_failure_audit_v1.py new file mode 100644 index 0000000..99055c4 --- /dev/null +++ b/tools/cm95_production_failure_audit_v1.py @@ -0,0 +1,338 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 Production 失败汇总审计 v1 + +用途 +==== +对 production_run_v1.sqlite 中 FAILED 任务做一次性归类,不修改任何状态。 + +默认 release: +build/releases/cm95-d1-bfa67dd5625f-98f21909a3d1 + +输出: +- cm95_production_failure_audit_v1.json +- cm95_production_failure_tiles_v1.csv +- cm95_production_failure_audit_v1.txt + +重点统计: +1. FAILED 数量 / attempts 分布; +2. hard-gate unmapped 按 object_class 汇总; +3. MVT encoder dropped 按 layer 汇总; +4. 其它 RuntimeError / Exception 首行归类; +5. 从对应 report JSON 补充 unmapped_class_counts、 + encoder_dropped_features、quantization_fallbacks; +6. 按 zoom 统计失败分布。 + +只读: +- 不改 SQLite; +- 不改 report; +- 不删除 PBF; +- 不重置 attempts。 +""" + +from __future__ import annotations + +import argparse +import ast +import csv +import json +import re +import sqlite3 +from collections import Counter, defaultdict +from pathlib import Path +from typing import Any + + +HG_RE = re.compile(r"hard-gate unmapped:\s*(\[[^\n]*\])") +ENC_RE = re.compile( + r"MVT encoder dropped features in tile\s+(\d+)/(\d+)/(\d+):\s*(\[[^\n]*\])" +) + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument( + "--release-dir", + default=r"build\releases\cm95-d1-bfa67dd5625f-98f21909a3d1", + ) + p.add_argument("--profile", default="delivery") + p.add_argument("--output-dir", default=None) + return p.parse_args() + + +def safe_literal(text: str) -> Any: + try: + return ast.literal_eval(text) + except Exception: + return None + + +def read_json(path: Path) -> dict[str, Any]: + if not path.exists(): + return {} + try: + obj = json.loads(path.read_text(encoding="utf-8")) + return obj if isinstance(obj, dict) else {} + except Exception: + return {} + + +def classify_error(last_error: str): + first = (last_error or "").splitlines()[0].strip() + + hg = HG_RE.search(first) + if hg: + items = safe_literal(hg.group(1)) + return "HARD_GATE_UNMAPPED", items if isinstance(items, list) else [] + + enc = ENC_RE.search(first) + if enc: + items = safe_literal(enc.group(4)) + return "ENCODER_DROPPED", items if isinstance(items, list) else [] + + if first.startswith("RuntimeError:"): + return "RUNTIME_OTHER", [] + if first: + return "OTHER_EXCEPTION", [] + return "NO_ERROR_TEXT", [] + + +def main(): + a = parse_args() + release_dir = Path(a.release_dir).resolve() + ledger_path = release_dir / "production_run_v1.sqlite" + if not ledger_path.exists(): + raise SystemExit(f"找不到账本: {ledger_path}") + + outdir = ( + Path(a.output_dir).resolve() + if a.output_dir + else release_dir + ) + outdir.mkdir(parents=True, exist_ok=True) + + conn = sqlite3.connect(f"file:{ledger_path.as_posix()}?mode=ro", uri=True) + conn.row_factory = sqlite3.Row + try: + rows = conn.execute( + """ + SELECT profile,z,x,y,state,attempts,updated_at, + output_feature_count,output_layer_count,written,last_error + FROM tile_job + WHERE profile=? AND state='FAILED' + ORDER BY z,x,y + """, + (a.profile,), + ).fetchall() + finally: + conn.close() + + kind_counts = Counter() + zoom_counts = Counter() + attempts_counts = Counter() + hard_gate_classes = Counter() + encoder_layers = Counter() + first_line_counts = Counter() + + report_hard_gate_classes = Counter() + report_unmapped_classes = Counter() + report_encoder_layers = Counter() + report_quantization_layers = Counter() + + detail_rows = [] + missing_reports = 0 + + for r in rows: + z, x, y = int(r["z"]), int(r["x"]), int(r["y"]) + error = str(r["last_error"] or "") + first = error.splitlines()[0].strip() + kind, parsed = classify_error(error) + + kind_counts[kind] += 1 + zoom_counts[z] += 1 + attempts_counts[int(r["attempts"])] += 1 + first_line_counts[first] += 1 + + if kind == "HARD_GATE_UNMAPPED": + for item in parsed: + if isinstance(item, dict): + cls = str(item.get("object_class") or "") + cnt = int(item.get("count") or 0) + if cls: + hard_gate_classes[cls] += cnt + + if kind == "ENCODER_DROPPED": + for item in parsed: + if isinstance(item, dict): + layer = str(item.get("layer") or "") + if layer: + encoder_layers[layer] += 1 + + report_path = ( + release_dir + / "reports" + / a.profile + / str(z) + / str(x) + / f"{y}.json" + ) + report = read_json(report_path) + if not report: + missing_reports += 1 + + for item in report.get("hard_gate_unmapped", []) or []: + if isinstance(item, dict): + cls = str(item.get("object_class") or "") + cnt = int(item.get("count") or 0) + if cls: + report_hard_gate_classes[cls] += cnt + + for cls, cnt in (report.get("unmapped_class_counts") or {}).items(): + report_unmapped_classes[str(cls)] += int(cnt or 0) + + for item in report.get("encoder_dropped_features", []) or []: + if isinstance(item, dict): + layer = str(item.get("layer") or "") + if layer: + report_encoder_layers[layer] += 1 + + for item in report.get("quantization_fallbacks", []) or []: + if isinstance(item, dict): + layer = str( + item.get("from_layer") + or item.get("layer") + or "UNKNOWN" + ) + report_quantization_layers[layer] += 1 + + detail_rows.append( + { + "profile": a.profile, + "z": z, + "x": x, + "y": y, + "attempts": int(r["attempts"]), + "failure_kind": kind, + "first_error_line": first, + "report_exists": report_path.exists(), + "hard_gate_unmapped": report.get("hard_gate_unmapped", []), + "unmapped_class_counts": report.get("unmapped_class_counts", {}), + "encoder_dropped_features": report.get("encoder_dropped_features", []), + "quantization_fallbacks": report.get("quantization_fallbacks", []), + "report_path": str(report_path), + } + ) + + report = { + "schema": "navsea.cm95.production-failure-audit/v1", + "release_dir": str(release_dir), + "profile": a.profile, + "failed_jobs": len(rows), + "missing_reports": missing_reports, + "failure_kind_counts": dict(sorted(kind_counts.items())), + "zoom_counts": {str(k): v for k, v in sorted(zoom_counts.items())}, + "attempts_counts": {str(k): v for k, v in sorted(attempts_counts.items())}, + "hard_gate_classes_from_error": dict( + sorted(hard_gate_classes.items(), key=lambda kv: (-kv[1], kv[0])) + ), + "hard_gate_classes_from_report": dict( + sorted(report_hard_gate_classes.items(), key=lambda kv: (-kv[1], kv[0])) + ), + "all_unmapped_classes_from_report": dict( + sorted(report_unmapped_classes.items(), key=lambda kv: (-kv[1], kv[0])) + ), + "encoder_dropped_layers_from_error": dict( + sorted(encoder_layers.items(), key=lambda kv: (-kv[1], kv[0])) + ), + "encoder_dropped_layers_from_report": dict( + sorted(report_encoder_layers.items(), key=lambda kv: (-kv[1], kv[0])) + ), + "quantization_fallback_layers_from_report": dict( + sorted(report_quantization_layers.items(), key=lambda kv: (-kv[1], kv[0])) + ), + "distinct_first_error_lines": [ + {"error": k, "tiles": v} + for k, v in first_line_counts.most_common() + ], + "tiles": detail_rows, + } + + json_path = outdir / "cm95_production_failure_audit_v1.json" + csv_path = outdir / "cm95_production_failure_tiles_v1.csv" + txt_path = outdir / "cm95_production_failure_audit_v1.txt" + + json_path.write_text( + json.dumps(report, ensure_ascii=False, indent=2, default=str), + encoding="utf-8", + ) + + with csv_path.open("w", encoding="utf-8-sig", newline="") as f: + fields = [ + "profile", "z", "x", "y", "attempts", + "failure_kind", "first_error_line", + "report_exists", "hard_gate_unmapped", + "unmapped_class_counts", + "encoder_dropped_features", + "quantization_fallbacks", + "report_path", + ] + w = csv.DictWriter(f, fieldnames=fields) + w.writeheader() + for row in detail_rows: + out = dict(row) + for key in ( + "hard_gate_unmapped", + "unmapped_class_counts", + "encoder_dropped_features", + "quantization_fallbacks", + ): + out[key] = json.dumps( + out[key], + ensure_ascii=False, + separators=(",", ":"), + ) + w.writerow(out) + + lines = [ + "CM95 Production 失败汇总审计 v1", + "=" * 72, + f"Release : {release_dir}", + f"Profile : {a.profile}", + f"FAILED : {len(rows)}", + f"Missing reports : {missing_reports}", + "", + "Failure kinds:", + ] + for k, v in kind_counts.most_common(): + lines.append(f" {k:<24} {v}") + + lines += ["", "Hard-gate classes:"] + if report_hard_gate_classes: + for k, v in report_hard_gate_classes.most_common(): + lines.append(f" {k:<16} {v}") + else: + lines.append(" (none)") + + lines += ["", "Encoder dropped layers:"] + if report_encoder_layers: + for k, v in report_encoder_layers.most_common(): + lines.append(f" {k:<28} {v}") + else: + lines.append(" (none)") + + lines += ["", "FAILED by zoom:"] + for z, v in sorted(zoom_counts.items()): + lines.append(f" z{z:<2} {v}") + + txt_path.write_text("\n".join(lines), encoding="utf-8") + + print("\n".join(lines)) + print("") + print(json_path) + print(csv_path) + print(txt_path) + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_production_plan_audit_v1.py b/tools/cm95_production_plan_audit_v1.py new file mode 100644 index 0000000..8eec3a8 --- /dev/null +++ b/tools/cm95_production_plan_audit_v1.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from __future__ import annotations + +import argparse +from collections import Counter +import json +from pathlib import Path + + +def parse_expected(value: str) -> list[int]: + values: list[int] = [] + for token in value.split(','): + token = token.strip() + if not token: + continue + if '-' in token: + a, b = token.split('-', 1) + start, end = int(a), int(b) + if end < start: + raise ValueError(f'invalid expected zoom range: {token}') + values.extend(range(start, end + 1)) + else: + values.append(int(token)) + return sorted(set(values)) + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument('--plan', default='build/production/cm95_production_plan_v1.json') + p.add_argument('--output', default='build/production/cm95_production_plan_audit_v1.json') + p.add_argument('--expected-zooms', default='0-12') + return p.parse_args() + + +def main(): + a = parse_args() + plan = json.loads(Path(a.plan).read_text(encoding='utf-8')) + jobs = plan.get('jobs') or [] + keys = [(int(j['z']), int(j['x']), int(j['y'])) for j in jobs] + unique = set(keys) + by_zoom = Counter(z for z, _, _ in keys) + invalid = [] + for z, x, y in keys: + n = 1 << z + if z < 0 or x < 0 or y < 0 or x >= n or y >= n: + invalid.append({'z': z, 'x': x, 'y': y}) + + source_stats = plan.get('source_stats') or {} + stats_mismatch = [] + for z, count in sorted(by_zoom.items()): + declared = int((source_stats.get(str(z)) or {}).get('tile_count') or 0) + if declared != count: + stats_mismatch.append({'z': z, 'declared': declared, 'actual': count}) + + expected = parse_expected(a.expected_zooms) + planned_zooms = sorted(int(z) for z in (plan.get('zooms') or [])) + missing_plan_zooms = sorted(set(expected) - set(planned_zooms)) + unexpected_plan_zooms = sorted(set(planned_zooms) - set(expected)) + missing_job_zooms = sorted(z for z in expected if by_zoom.get(z, 0) == 0) + + failures = [] + if len(unique) != len(keys): + failures.append('duplicate_jobs') + if invalid: + failures.append('invalid_xyz') + if int(plan.get('job_count') or 0) != len(keys): + failures.append('job_count_mismatch') + if stats_mismatch: + failures.append('source_stats_mismatch') + if missing_plan_zooms: + failures.append('missing_plan_zooms') + if unexpected_plan_zooms: + failures.append('unexpected_plan_zooms') + if missing_job_zooms: + failures.append('missing_job_zooms') + + result = { + 'schema': 'navsea.cm95.production-plan-audit/v1.1', + 'plan_id': plan.get('plan_id'), + 'release_id': plan.get('release_id'), + 'dataset_id': plan.get('dataset_id'), + 'builder_contract_version': plan.get('builder_contract_version'), + 'expected_zooms': expected, + 'planned_zooms': planned_zooms, + 'job_count': len(keys), + 'unique_job_count': len(unique), + 'tile_count_by_zoom': {str(k): v for k, v in sorted(by_zoom.items())}, + 'missing_plan_zooms': missing_plan_zooms, + 'unexpected_plan_zooms': unexpected_plan_zooms, + 'missing_job_zooms': missing_job_zooms, + 'invalid_xyz': invalid, + 'source_stats_mismatch': stats_mismatch, + 'failures': failures, + 'overall': 'PASS' if not failures else 'FAIL', + } + out = Path(a.output) + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding='utf-8') + + print(f"Plan ID : {result['plan_id']}") + print(f"Release ID : {result['release_id']}") + if result.get('builder_contract_version'): + print(f"Builder : {result['builder_contract_version']}") + print(f"Expected zooms : {a.expected_zooms}") + print(f"Jobs : {result['job_count']}") + for z in expected: + stat = source_stats.get(str(z)) or {} + enum_scales = stat.get('enumeration_scales') or [] + ladder = stat.get('scale_ladder') or [] + print(f"z{z} tiles : {by_zoom.get(z, 0)} enum={enum_scales} fallback={ladder}") + print(f"Duplicate jobs : {len(keys)-len(unique)}") + print(f"Invalid XYZ : {len(invalid)}") + print(f"Missing zooms : {len(missing_plan_zooms) + len(missing_job_zooms)}") + print(f"OVERALL : {result['overall']}") + + +if __name__ == '__main__': + main() diff --git a/tools/cm95_style_contract_unmatched_extract_v1.py b/tools/cm95_style_contract_unmatched_extract_v1.py new file mode 100644 index 0000000..8152e06 --- /dev/null +++ b/tools/cm95_style_contract_unmatched_extract_v1.py @@ -0,0 +1,328 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r""" +CM95 Style Contract unmatched Feature 精确提取器 v1 + +用途 +==== +对一个 production release 的 delivery PBF 做只读扫描,使用与 +cm95pbf.style_contract 相同的 Style filter evaluator,提取所有 +contract_unmatched Feature 的精确属性。 + +默认只关注当前已知失败的两个 source-layer: +- place_label_land +- seabed_text_point + +不会修改 PBF、report、ledger 或 release manifest。 + +输出: + build/production/cm95_style_contract_unmatched_features_v1.json + build/production/cm95_style_contract_unmatched_features_v1.txt + +示例: + & ".\.venv\Scripts\python.exe" .\tools\cm95_style_contract_unmatched_extract_v1.py ` + --release-dir .\build\releases\cm95-d1-bfa67dd5625f-f5e95b1e5341 ` + --style .\config\style\style.navsea-delivery-full-semantic-unified-20260808-cm95-v1.json +""" + +from __future__ import annotations + +import argparse +import json +from collections import Counter, defaultdict +from pathlib import Path +from typing import Any + +import mapbox_vector_tile + +try: + from cm95pbf.style_contract import ev +except Exception: + def ev(expr: Any, props: dict[str, Any]): + if not isinstance(expr, list): + return expr + if not expr: + return None + op = expr[0] + if op == "get": + return props.get(expr[1]) + if op == "has": + return expr[1] in props + if op == "!": + return not bool(ev(expr[1], props)) + if op == "all": + return all(bool(ev(x, props)) for x in expr[1:]) + if op == "any": + return any(bool(ev(x, props)) for x in expr[1:]) + if op == "==": + return ev(expr[1], props) == ev(expr[2], props) + if op == "!=": + return ev(expr[1], props) != ev(expr[2], props) + if op == "slice": + value = ev(expr[1], props) + if value is None: + return None + start = int(ev(expr[2], props)) + end = int(ev(expr[3], props)) if len(expr) > 3 else None + return str(value)[start:end] + if op == "to-number": + value = ev(expr[1], props) + try: + num = float(value) + return int(num) if num.is_integer() else num + except Exception: + return 0 + if op == "literal": + return expr[1] + if op == "match": + value = ev(expr[1], props) + pairs = expr[2:-1] + default = expr[-1] + for i in range(0, len(pairs), 2): + label = pairs[i] + output = pairs[i + 1] + if isinstance(label, list) and label and label[0] == "literal": + labels = label[1] + if value in labels: + return ev(output, props) + elif isinstance(label, list): + if value in label: + return ev(output, props) + elif value == label: + return ev(output, props) + return ev(default, props) + raise RuntimeError(f"unsupported style filter op: {op}") + + +DEFAULT_TARGETS = ("place_label_land", "seabed_text_point") + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument("--release-dir", required=True) + p.add_argument("--style", required=True) + p.add_argument( + "--profile", + default="delivery", + help="PBF profile directory under release/pbf (default delivery)", + ) + p.add_argument( + "--source-layer", + action="append", + dest="source_layers", + help="可重复;默认只查 place_label_land 和 seabed_text_point", + ) + p.add_argument( + "--output", + default=r"build\production\cm95_style_contract_unmatched_features_v1.json", + ) + return p.parse_args() + + +def compact_filter_result(style_layer: dict[str, Any], props: dict[str, Any]) -> dict[str, Any]: + flt = style_layer.get("filter") + matched = True if flt is None else bool(ev(flt, props)) + return { + "style_layer_id": style_layer.get("id"), + "filter": flt, + "filter_matched": matched, + "minzoom": style_layer.get("minzoom"), + "maxzoom": style_layer.get("maxzoom"), + } + + +def classify_missing(source_layer: str, props: dict[str, Any]) -> dict[str, Any]: + if source_layer == "place_label_land": + return { + "canonical_object_type": props.get("canonical_object_type"), + "has_place_name_en": "place_name_en" in props, + "place_name_en": props.get("place_name_en"), + "has_chart_label_text": "chart_label_text" in props, + "chart_label_text": props.get("chart_label_text"), + "likely_issue": ( + "NO_RENDERABLE_PLACE_LABEL" + if "place_name_en" not in props and "chart_label_text" not in props + else "OTHER_FILTER_MISMATCH" + ), + } + if source_layer == "seabed_text_point": + return { + "canonical_object_type": props.get("canonical_object_type"), + "has_chart_label_text": "chart_label_text" in props, + "chart_label_text": props.get("chart_label_text"), + "depth_value_m": props.get("depth_value_m"), + "likely_issue": ( + "NO_RENDERABLE_SEABED_LABEL" + if "chart_label_text" not in props + else "OTHER_FILTER_MISMATCH" + ), + } + return { + "canonical_object_type": props.get("canonical_object_type"), + "likely_issue": "GENERIC_UNMATCHED", + } + + +def main(): + args = parse_args() + release_dir = Path(args.release_dir).resolve() + style_path = Path(args.style).resolve() + output_path = Path(args.output).resolve() + output_path.parent.mkdir(parents=True, exist_ok=True) + + pbf_root = release_dir / "pbf" / args.profile + if not pbf_root.exists(): + raise SystemExit(f"找不到 PBF 根目录: {pbf_root}") + if not style_path.exists(): + raise SystemExit(f"找不到 Style: {style_path}") + + targets = set(args.source_layers or DEFAULT_TARGETS) + style = json.loads(style_path.read_text(encoding="utf-8")) + + style_by_source_layer: dict[str, list[dict[str, Any]]] = defaultdict(list) + for layer in style.get("layers", []): + if layer.get("source") == "navsea_delivery" and layer.get("source-layer"): + style_by_source_layer[str(layer["source-layer"])].append(layer) + + rows: list[dict[str, Any]] = [] + counts = Counter() + type_counts = Counter() + property_key_counts = Counter() + + for path in sorted(pbf_root.rglob("*.pbf")): + rel = path.relative_to(pbf_root) + if len(rel.parts) < 3: + continue + z = int(rel.parts[-3]) + x = int(rel.parts[-2]) + y = int(Path(rel.parts[-1]).stem) + + decoded = mapbox_vector_tile.decode(path.read_bytes()) + for source_layer, layer_obj in decoded.items(): + if source_layer not in targets: + continue + + candidates = style_by_source_layer.get(source_layer, []) + for feature in layer_obj.get("features", []): + props = feature.get("properties") or {} + filter_results = [ + compact_filter_result(sl, props) + for sl in candidates + ] + if any(r["filter_matched"] for r in filter_results): + continue + + output_id = feature.get("id") + geom = feature.get("geometry") or {} + geom_type = geom.get("type") if isinstance(geom, dict) else None + + classification = classify_missing(source_layer, props) + row = { + "z": z, + "x": x, + "y": y, + "tile": f"{z}/{x}/{y}", + "source_layer": source_layer, + "output_id": output_id, + "geometry_type": geom_type, + "classification": classification, + "properties": dict(sorted(props.items())), + "style_filter_results": filter_results, + "pbf_path": str(path), + } + rows.append(row) + + counts[(z, source_layer)] += 1 + type_counts[ + ( + source_layer, + str(props.get("canonical_object_type") or ""), + ) + ] += 1 + for key in props: + property_key_counts[(source_layer, key)] += 1 + + result = { + "schema": "navsea.cm95.style-contract-unmatched-features/v1", + "release_dir": str(release_dir), + "style_path": str(style_path), + "profile": args.profile, + "target_source_layers": sorted(targets), + "unmatched_count": len(rows), + "counts_by_zoom_source_layer": [ + {"z": z, "source_layer": sl, "count": count} + for (z, sl), count in sorted(counts.items()) + ], + "canonical_object_type_counts": [ + { + "source_layer": sl, + "canonical_object_type": obj_type, + "count": count, + } + for (sl, obj_type), count in sorted( + type_counts.items(), + key=lambda kv: (kv[0][0], -kv[1], kv[0][1]), + ) + ], + "property_key_counts": [ + {"source_layer": sl, "property": key, "count": count} + for (sl, key), count in sorted( + property_key_counts.items(), + key=lambda kv: (kv[0][0], -kv[1], kv[0][1]), + ) + ], + "features": rows, + } + + output_path.write_text( + json.dumps(result, ensure_ascii=False, indent=2, default=str), + encoding="utf-8", + ) + + txt_path = output_path.with_suffix(".txt") + lines = [ + "CM95 Style Contract unmatched Feature 精确提取器 v1", + "=" * 76, + f"Release : {release_dir}", + f"Style : {style_path}", + f"Unmatched : {len(rows)}", + "", + "Canonical object types:", + ] + for item in result["canonical_object_type_counts"]: + lines.append( + f" {item['source_layer']:<24} " + f"{item['canonical_object_type']:<28} " + f"{item['count']}" + ) + + lines += ["", "Exact unmatched features:"] + for row in rows: + c = row["classification"] + lines.append( + f" {row['tile']:<14} " + f"{row['source_layer']:<24} " + f"id={str(row['output_id']):<12} " + f"type={str(c.get('canonical_object_type')):<24} " + f"issue={c.get('likely_issue')}" + ) + lines.append( + " props=" + + json.dumps( + row["properties"], + ensure_ascii=False, + sort_keys=True, + separators=(",", ":"), + ) + ) + + txt_path.write_text("\n".join(lines), encoding="utf-8") + + print("\n".join(lines)) + print("") + print("JSON:", output_path) + print("TXT :", txt_path) + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_v1_4_5_preflight.py b/tools/cm95_v1_4_5_preflight.py new file mode 100644 index 0000000..4866a05 --- /dev/null +++ b/tools/cm95_v1_4_5_preflight.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +EXPECTED_PROJECT_VERSION = "0.4.5" +EXPECTED_RUNTIME_VERSION = "0.4.5-production-nonrenderable-label-omit" +EXPECTED_BUILDER = "cm95pbf-builder/0.4.5-nonrenderable-label-omit" +EXPECTED_INVALIDATE_COUNT = 16 + + +def fail(msg: str) -> None: + print(f"FAIL: {msg}") + raise SystemExit(2) + + +def main() -> None: + root = Path.cwd() + pyproject = root / "pyproject.toml" + init_py = root / "src" / "cm95pbf" / "__init__.py" + cli_py = root / "src" / "cm95pbf" / "cli.py" + production_py = root / "src" / "cm95pbf" / "production.py" + tiles_path = root / "config" / "pbf" / "cm95_v1_4_5_nonrenderable_label_tiles.txt" + + for path in (pyproject, init_py, cli_py, production_py, tiles_path): + if not path.exists(): + fail(f"缺少文件: {path}") + + pyproject_text = pyproject.read_text(encoding="utf-8") + if f'version = "{EXPECTED_PROJECT_VERSION}"' not in pyproject_text: + fail(f"pyproject 不是 {EXPECTED_PROJECT_VERSION}") + + init_text = init_py.read_text(encoding="utf-8") + if EXPECTED_RUNTIME_VERSION not in init_text: + fail("src/cm95pbf/__init__.py runtime version 不正确") + if EXPECTED_BUILDER not in init_text: + fail("src/cm95pbf/__init__.py builder contract 不正确") + + cli_text = cli_py.read_text(encoding="utf-8") + if "--invalidate-tiles-file" not in cli_text: + fail("CLI 缺少 --invalidate-tiles-file") + + production_text = production_py.read_text(encoding="utf-8") + if '"builder_contract_version": BUILDER_CONTRACT_VERSION' not in production_text: + fail("production plan hash 未纳入 builder_contract_version") + if "_load_explicit_invalidate_tiles" not in production_text: + fail("production migration 缺少 explicit invalidate 实现") + + tiles = [] + for raw in tiles_path.read_text(encoding="utf-8").splitlines(): + line = raw.strip() + if not line or line.startswith("#"): + continue + parts = line.split("/") + if len(parts) != 3: + fail(f"非法 invalidate tile: {line}") + z, x, y = map(int, parts) + if x < 0 or y < 0 or x >= (1 << z) or y >= (1 << z): + fail(f"非法 XYZ: {line}") + tiles.append((z, x, y)) + if len(tiles) != EXPECTED_INVALIDATE_COUNT or len(set(tiles)) != EXPECTED_INVALIDATE_COUNT: + fail(f"invalidate tile 数量应为 {EXPECTED_INVALIDATE_COUNT},实际 {len(tiles)} / unique {len(set(tiles))}") + + # Installed/editable runtime check. + try: + import cm95pbf + from cm95pbf.cli import build_parser + except Exception as exc: + fail(f"无法 import 已安装 cm95pbf: {exc}") + + if getattr(cm95pbf, "__version__", None) != EXPECTED_RUNTIME_VERSION: + fail(f"installed cm95pbf.__version__={getattr(cm95pbf, '__version__', None)!r}") + if getattr(cm95pbf, "BUILDER_CONTRACT_VERSION", None) != EXPECTED_BUILDER: + fail(f"installed BUILDER_CONTRACT_VERSION={getattr(cm95pbf, 'BUILDER_CONTRACT_VERSION', None)!r}") + + parser = build_parser() + migrate = None + for action in parser._actions: + if isinstance(action, argparse._SubParsersAction): + migrate = action.choices.get("migrate-production-release") + break + if migrate is None: + fail("CLI 缺少 migrate-production-release") + options = {opt for action in migrate._actions for opt in action.option_strings} + if "--invalidate-tiles-file" not in options: + fail("installed CLI parser 未注册 --invalidate-tiles-file") + + print("CM95 PBF v1.4.5 preflight") + print("=" * 68) + print(f"Project version : {EXPECTED_PROJECT_VERSION} PASS") + print(f"Runtime version : {EXPECTED_RUNTIME_VERSION} PASS") + print(f"Builder contract : {EXPECTED_BUILDER} PASS") + print("CLI invalidate option : PASS") + print(f"Explicit invalidate tiles: {EXPECTED_INVALIDATE_COUNT} PASS") + print("Plan hash builder binding: PASS") + print("OVERALL : PASS") + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_v1_4_6_preflight.py b/tools/cm95_v1_4_6_preflight.py new file mode 100644 index 0000000..c3fc542 --- /dev/null +++ b/tools/cm95_v1_4_6_preflight.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from __future__ import annotations + +import sys +from pathlib import Path + +EXPECTED_PROJECT_VERSION = "0.4.6" +EXPECTED_RUNTIME_VERSION = "0.4.6-production-spatial-candidate-query" +EXPECTED_BUILDER = "cm95pbf-builder/0.4.6-spatial-candidate-query" + + +def fail(msg: str) -> None: + print(f"FAIL: {msg}") + raise SystemExit(2) + + +def main() -> None: + root = Path.cwd() + pyproject = root / "pyproject.toml" + init_py = root / "src" / "cm95pbf" / "__init__.py" + builder_py = root / "src" / "cm95pbf" / "builder.py" + production_py = root / "src" / "cm95pbf" / "production.py" + japan_policy = root / "config" / "pbf" / "cm95_tile_policy_japan_full_detail_v1.yaml" + japan_disp = root / "config" / "mappings" / "cm95_gap_disposition_japan_dataset_1_v1.yaml" + + for path in (pyproject, init_py, builder_py, production_py, japan_policy, japan_disp): + if not path.exists(): + fail(f"缺少文件: {path}") + + pyproject_text = pyproject.read_text(encoding="utf-8") + if f'version = "{EXPECTED_PROJECT_VERSION}"' not in pyproject_text: + fail(f"pyproject 不是 {EXPECTED_PROJECT_VERSION}") + + init_text = init_py.read_text(encoding="utf-8") + if EXPECTED_RUNTIME_VERSION not in init_text: + fail("runtime version 不正确") + if EXPECTED_BUILDER not in init_text: + fail("builder contract 不正确") + + builder_text = builder_py.read_text(encoding="utf-8") + required_fragments = [ + "chart_point_geometry\", \"spx_point_geom", + "chart_line_geometry\", \"spx_line_geom", + "chart_area_geometry\", \"spx_area_geom", + "FORCE INDEX ({spatial_index})", + "STRAIGHT_JOIN chart_feature f ON f.id=g.feature_id", + "MBRIntersects(", + "geom_rows.sort(", + "chart_sounding_point s FORCE INDEX (spx_sounding_geom)", + "STRAIGHT_JOIN chart_feature f ON f.id=s.feature_id", + "MBRContains(", + "out.sort(", + ] + for fragment in required_fragments: + if fragment not in builder_text: + fail(f"builder 缺少 v1.4.6 query contract: {fragment}") + + # The expensive feature fetch SQL must no longer contain DB-side ORDER BY. + start = builder_text.index("def _fetch_scale_features") + end = builder_text.index("def _fetch_scale_soundings", start) + if "ORDER BY" in builder_text[start:end]: + fail("_fetch_scale_features 仍包含 SQL ORDER BY") + + start2 = builder_text.index("def _fetch_scale_soundings") + end2 = builder_text.index("def _compose_navigation_aids", start2) + if "ORDER BY" in builder_text[start2:end2]: + fail("_fetch_scale_soundings 仍包含 SQL ORDER BY") + + production_text = production_py.read_text(encoding="utf-8") + if '"builder_contract_version": BUILDER_CONTRACT_VERSION' not in production_text: + fail("production plan hash 未纳入 builder_contract_version") + + try: + import cm95pbf + except Exception as exc: + fail(f"无法 import 已安装 cm95pbf: {exc}") + + if getattr(cm95pbf, "__version__", None) != EXPECTED_RUNTIME_VERSION: + fail(f"installed runtime={getattr(cm95pbf, '__version__', None)!r}") + if getattr(cm95pbf, "BUILDER_CONTRACT_VERSION", None) != EXPECTED_BUILDER: + fail(f"installed builder={getattr(cm95pbf, 'BUILDER_CONTRACT_VERSION', None)!r}") + + print("CM95 PBF v1.4.6 preflight") + print("=" * 72) + print(f"Project version : {EXPECTED_PROJECT_VERSION} PASS") + print(f"Runtime version : {EXPECTED_RUNTIME_VERSION} PASS") + print(f"Builder contract : {EXPECTED_BUILDER} PASS") + print("Feature query spatial-first : PASS") + print("POINT/LINE/AREA spatial idx : PASS") + print("Feature SQL ORDER BY removed : PASS") + print("Python deterministic sort : PASS") + print("Sounding spatial-first : PASS") + print("Plan hash builder binding : PASS") + print("Japan G=7500 policy present : PASS") + print("OVERALL : PASS") + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_v1_4_6_query_equivalence.py b/tools/cm95_v1_4_6_query_equivalence.py new file mode 100644 index 0000000..5f500f4 --- /dev/null +++ b/tools/cm95_v1_4_6_query_equivalence.py @@ -0,0 +1,254 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from __future__ import annotations + +import argparse +from pathlib import Path +from time import perf_counter +from typing import Any + +import pymysql +from dotenv import load_dotenv + +from cm93db.config import load_config + + +TABLES = { + "POINT": ("chart_point_geometry", "spx_point_geom"), + "LINE": ("chart_line_geometry", "spx_line_geom"), + "AREA": ("chart_area_geometry", "spx_area_geom"), +} + + +def connect() -> pymysql.connections.Connection: + db = load_config(require_database=True) + return pymysql.connect( + host=db.host, + port=db.port, + user=db.user, + password=db.password, + database=db.database, + charset=db.charset, + cursorclass=pymysql.cursors.DictCursor, + autocommit=False, + connect_timeout=20, + read_timeout=900, + write_timeout=30, + ) + + +def envelope_wkt(bbox: tuple[float, float, float, float]) -> str: + west, south, east, north = bbox + return ( + "POLYGON((" + f"{west:.17g} {south:.17g}," + f"{east:.17g} {south:.17g}," + f"{east:.17g} {north:.17g}," + f"{west:.17g} {north:.17g}," + f"{west:.17g} {south:.17g}" + "))" + ) + + +def fetch_old(conn, dataset_id: int, scale: int, geometry_type: str, bbox): + west, south, east, north = bbox + table, _idx = TABLES[geometry_type] + with conn.cursor() as cur: + cur.execute( + f""" + SELECT f.id AS feature_id + FROM chart_feature f + JOIN {table} g ON g.feature_id=f.id + WHERE f.dataset_id=%s + AND f.native_scale=%s + AND f.geometry_type=%s + AND f.bbox_max_lon >= %s + AND f.bbox_min_lon <= %s + AND f.bbox_max_lat >= %s + AND f.bbox_min_lat <= %s + """, + (dataset_id, scale, geometry_type, west, east, south, north), + ) + return sorted(int(r["feature_id"]) for r in cur.fetchall()) + + +def fetch_new(conn, dataset_id: int, scale: int, geometry_type: str, bbox): + west, south, east, north = bbox + table, idx = TABLES[geometry_type] + wkt = envelope_wkt(bbox) + with conn.cursor() as cur: + cur.execute( + f""" + SELECT f.id AS feature_id + FROM {table} g FORCE INDEX ({idx}) + STRAIGHT_JOIN chart_feature f ON f.id=g.feature_id + WHERE MBRIntersects(g.geom, ST_GeomFromText(%s, 4326)) + AND f.dataset_id=%s + AND f.native_scale=%s + AND f.geometry_type=%s + AND f.bbox_max_lon >= %s + AND f.bbox_min_lon <= %s + AND f.bbox_max_lat >= %s + AND f.bbox_min_lat <= %s + """, + (wkt, dataset_id, scale, geometry_type, west, east, south, north), + ) + return sorted(int(r["feature_id"]) for r in cur.fetchall()) + + +def explain_new(conn, dataset_id: int, scale: int, geometry_type: str, bbox): + west, south, east, north = bbox + table, idx = TABLES[geometry_type] + wkt = envelope_wkt(bbox) + with conn.cursor() as cur: + cur.execute( + f""" + EXPLAIN + SELECT f.id AS feature_id + FROM {table} g FORCE INDEX ({idx}) + STRAIGHT_JOIN chart_feature f ON f.id=g.feature_id + WHERE MBRIntersects(g.geom, ST_GeomFromText(%s, 4326)) + AND f.dataset_id=%s + AND f.native_scale=%s + AND f.geometry_type=%s + AND f.bbox_max_lon >= %s + AND f.bbox_min_lon <= %s + AND f.bbox_max_lat >= %s + AND f.bbox_min_lat <= %s + """, + (wkt, dataset_id, scale, geometry_type, west, east, south, north), + ) + return list(cur.fetchall()) + + +def soundings_old(conn, dataset_id: int, scale: int, bbox): + wkt = envelope_wkt(bbox) + with conn.cursor() as cur: + cur.execute( + """ + SELECT s.id + FROM chart_sounding_point s + JOIN chart_feature f ON f.id=s.feature_id + WHERE f.dataset_id=%s + AND f.native_scale=%s + AND MBRContains(ST_GeomFromText(%s, 4326), s.geom) + """, + (dataset_id, scale, wkt), + ) + return sorted(int(r["id"]) for r in cur.fetchall()) + + +def soundings_new(conn, dataset_id: int, scale: int, bbox): + wkt = envelope_wkt(bbox) + with conn.cursor() as cur: + cur.execute( + """ + SELECT s.id + FROM chart_sounding_point s FORCE INDEX (spx_sounding_geom) + STRAIGHT_JOIN chart_feature f ON f.id=s.feature_id + WHERE MBRContains(ST_GeomFromText(%s, 4326), s.geom) + AND f.dataset_id=%s + AND f.native_scale=%s + """, + (wkt, dataset_id, scale), + ) + return sorted(int(r["id"]) for r in cur.fetchall()) + + + +def soundings_explain_new(conn, dataset_id: int, scale: int, bbox): + wkt = envelope_wkt(bbox) + with conn.cursor() as cur: + cur.execute( + """ + EXPLAIN + SELECT s.id + FROM chart_sounding_point s FORCE INDEX (spx_sounding_geom) + STRAIGHT_JOIN chart_feature f ON f.id=s.feature_id + WHERE MBRContains(ST_GeomFromText(%s, 4326), s.geom) + AND f.dataset_id=%s + AND f.native_scale=%s + """, + (wkt, dataset_id, scale), + ) + return list(cur.fetchall()) + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--dataset-id", type=int, default=1) + parser.add_argument("--scale", type=int, default=100000) + parser.add_argument( + "--bbox", + nargs=4, + type=float, + metavar=("WEST", "SOUTH", "EAST", "NORTH"), + default=(132.53356933593753, 34.15727269301868, 132.72033691406253, 34.31168124115256), + ) + parser.add_argument("--skip-soundings", action="store_true") + args = parser.parse_args() + + load_dotenv(dotenv_path=Path(".env").resolve()) + bbox = tuple(float(v) for v in args.bbox) + + print("CM95 v1.4.6 query equivalence / plan check") + print("=" * 78) + print(f"Dataset : {args.dataset_id}") + print(f"Scale : {args.scale}") + print(f"BBox : {bbox}") + + with connect() as conn: + for geometry_type in ("POINT", "LINE", "AREA"): + t0 = perf_counter() + old_ids = fetch_old(conn, args.dataset_id, args.scale, geometry_type, bbox) + old_seconds = perf_counter() - t0 + t1 = perf_counter() + new_ids = fetch_new(conn, args.dataset_id, args.scale, geometry_type, bbox) + new_seconds = perf_counter() - t1 + if old_ids != new_ids: + old_set = set(old_ids) + new_set = set(new_ids) + print(f"{geometry_type:5} : FAIL old={len(old_ids)} new={len(new_ids)}") + print(f" old_only sample: {sorted(old_set-new_set)[:20]}") + print(f" new_only sample: {sorted(new_set-old_set)[:20]}") + raise SystemExit(2) + + explain = explain_new(conn, args.dataset_id, args.scale, geometry_type, bbox) + first = explain[0] if explain else {} + expected_idx = TABLES[geometry_type][1] + if first.get("table") != "g" or first.get("key") != expected_idx or first.get("type") != "range": + print(f"{geometry_type:5} : FAIL spatial plan={first}") + raise SystemExit(2) + + speedup = (old_seconds / new_seconds) if new_seconds > 0 else float("inf") + print( + f"{geometry_type:5} : PASS ids={len(old_ids)} " + f"old={old_seconds:.3f}s new={new_seconds:.3f}s speedup={speedup:.1f}x " + f"driver={first.get('table')} type={first.get('type')} " + f"key={first.get('key')} rows={first.get('rows')}" + ) + + if not args.skip_soundings: + old_s = soundings_old(conn, args.dataset_id, args.scale, bbox) + new_s = soundings_new(conn, args.dataset_id, args.scale, bbox) + if old_s != new_s: + print(f"SOUND : FAIL old={len(old_s)} new={len(new_s)}") + raise SystemExit(2) + sx = soundings_explain_new(conn, args.dataset_id, args.scale, bbox) + first = sx[0] if sx else {} + if first.get("table") != "s" or first.get("key") != "spx_sounding_geom" or first.get("type") != "range": + print(f"SOUND : FAIL spatial plan={first}") + raise SystemExit(2) + print( + f"SOUND : PASS ids={len(old_s)} semantics=MBRContains unchanged " + f"driver={first.get('table')} type={first.get('type')} " + f"key={first.get('key')} rows={first.get('rows')}" + ) + + conn.rollback() + + print("OVERALL: PASS") + + +if __name__ == "__main__": + main() diff --git a/tools/cm95_v1_4_7_preflight.py b/tools/cm95_v1_4_7_preflight.py new file mode 100644 index 0000000..2af1558 --- /dev/null +++ b/tools/cm95_v1_4_7_preflight.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from __future__ import annotations + +from pathlib import Path + +EXPECTED_PROJECT_VERSION = "0.4.7" +EXPECTED_RUNTIME_VERSION = "0.4.7-production-audited-nav-name-conflict-omission" +EXPECTED_BUILDER = "cm95pbf-builder/0.4.6-spatial-candidate-query" + + +def fail(msg: str) -> None: + print(f"FAIL: {msg}") + raise SystemExit(2) + + +def main() -> None: + root = Path.cwd() + pyproject = root / "pyproject.toml" + init_py = root / "src" / "cm95pbf" / "__init__.py" + release_py = root / "src" / "cm95pbf" / "release.py" + builder_py = root / "src" / "cm95pbf" / "builder.py" + + for path in (pyproject, init_py, release_py, builder_py): + if not path.exists(): + fail(f"缺少文件: {path}") + + if f'version = "{EXPECTED_PROJECT_VERSION}"' not in pyproject.read_text(encoding="utf-8"): + fail("project version 不正确") + + init_text = init_py.read_text(encoding="utf-8") + if EXPECTED_RUNTIME_VERSION not in init_text: + fail("runtime version 不正确") + if EXPECTED_BUILDER not in init_text: + fail("builder contract 被意外改变") + + release_text = release_py.read_text(encoding="utf-8") + required = [ + "AMBIGUOUS_DIRECT_NAMES_OMIT_LABEL_FAIL_CLOSED", + "_collect_nav_name_conflict_expectations", + "_observe_nav_name_conflict_feature", + "_finalize_nav_name_conflict_audit", + "ambiguous_conflict_was_labeled", + 'failures.append("nav_name_conflict_audit")', + '"nav_name_conflict_omissions"', + '"nav_name_conflict_unique_outputs"', + ] + for fragment in required: + if fragment not in release_text: + fail(f"release gate 缺少: {fragment}") + + # Critical invariant: old unconditional nav_name_conflicts hard failure must be gone. + if 'failures.append("nav_name_conflicts")' in release_text: + fail("仍存在旧 nav_name_conflicts unconditional hard-fail") + + # Critical invariant: PBF builder stays byte-semantics compatible with v1.4.6 contract. + builder_text = builder_py.read_text(encoding="utf-8") + for fragment in [ + '"POINT": ("chart_point_geometry", "spx_point_geom")', + '"LINE": ("chart_line_geometry", "spx_line_geom")', + '"AREA": ("chart_area_geometry", "spx_area_geom")', + "FORCE INDEX ({spatial_index})", + "STRAIGHT_JOIN chart_feature f ON f.id=g.feature_id", + ]: + if fragment not in builder_text: + fail(f"v1.4.6 builder contract 缺少: {fragment}") + + try: + import cm95pbf + except Exception as exc: + fail(f"无法 import cm95pbf: {exc}") + + if getattr(cm95pbf, "__version__", None) != EXPECTED_RUNTIME_VERSION: + fail(f"installed runtime={getattr(cm95pbf, '__version__', None)!r}") + if getattr(cm95pbf, "BUILDER_CONTRACT_VERSION", None) != EXPECTED_BUILDER: + fail(f"installed builder={getattr(cm95pbf, 'BUILDER_CONTRACT_VERSION', None)!r}") + + print("CM95 PBF v1.4.7 preflight") + print("=" * 72) + print(f"Project version : {EXPECTED_PROJECT_VERSION} PASS") + print(f"Runtime version : {EXPECTED_RUNTIME_VERSION} PASS") + print(f"Builder contract REUSED : {EXPECTED_BUILDER} PASS") + print("Existing v1.4.6 plan reusable : PASS") + print("Ambiguous name policy : OMIT LABEL / FAIL CLOSED PASS") + print("Trace/report count gate : PASS") + print("PBF label-absence gate : PASS") + print("No PBF rebuild required : PASS") + print("OVERALL : PASS") + + +if __name__ == "__main__": + main() diff --git a/web/cm95_web.py b/web/cm95_web.py new file mode 100644 index 0000000..928aa78 --- /dev/null +++ b/web/cm95_web.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import argparse +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler +from pathlib import Path +from urllib.parse import urlparse + + +def parse_args(): + p = argparse.ArgumentParser(description="CM95 local PBF Web test server") + + # This script is expected to live in: + # D:\React\cm93-mysql-importer-starter\web\ + # + # Therefore the project root is automatically the parent directory. + p.add_argument( + "--release-id", + default="cm95-d1-62a85bd40d3a-6bc3c1352da3", + help="CM95 production release ID", + ) + p.add_argument("--host", default="127.0.0.1") + p.add_argument("--port", type=int, default=8080) + return p.parse_args() + + +def main(): + args = parse_args() + + web_root = Path(__file__).resolve().parent + project_root = web_root.parent + + release_dir = ( + project_root + / "build" + / "releases" + / args.release_id + ) + pbf_root = release_dir / "pbf" / "delivery" + + index_path = web_root / "index.html" + style_path = web_root / "style.json" + + if not pbf_root.is_dir(): + raise SystemExit( + "PBF directory not found:\n" + f"{pbf_root}\n\n" + "Expected project layout:\n" + f"{project_root}\\build\\releases\\{args.release_id}\\pbf\\delivery" + ) + + if not index_path.is_file(): + raise SystemExit(f"index.html not found: {index_path}") + + if not style_path.is_file(): + raise SystemExit(f"style.json not found: {style_path}") + + class Handler(BaseHTTPRequestHandler): + def send_bytes(self, data: bytes, content_type: str, status=200): + self.send_response(status) + self.send_header("Content-Type", content_type) + self.send_header("Content-Length", str(len(data))) + self.send_header("Cache-Control", "no-cache") + self.send_header("Access-Control-Allow-Origin", "*") + self.end_headers() + self.wfile.write(data) + + def do_GET(self): + path = urlparse(self.path).path + + if path in ("/", "/index.html"): + self.send_bytes( + index_path.read_bytes(), + "text/html; charset=utf-8", + ) + return + + if path == "/style.json": + self.send_bytes( + style_path.read_bytes(), + "application/json; charset=utf-8", + ) + return + + if path.startswith("/pbf/") and path.endswith(".pbf"): + parts = path[len("/pbf/"):].split("/") + + if len(parts) != 3: + self.send_error(404) + return + + z, x, yfile = parts + y = yfile[:-4] + + if not (z.isdigit() and x.isdigit() and y.isdigit()): + self.send_error(404) + return + + pbf = pbf_root / z / x / yfile + + if not pbf.is_file(): + self.send_error(404, "PBF tile not found") + return + + self.send_bytes( + pbf.read_bytes(), + "application/vnd.mapbox-vector-tile", + ) + return + + self.send_error(404) + + def log_message(self, fmt, *args): + print(f"{self.address_string()} - {fmt % args}") + + server = ThreadingHTTPServer((args.host, args.port), Handler) + + print("") + print("CM95 Web Test") + print("=" * 70) + print(f"Project : {project_root}") + print(f"Web : {web_root}") + print(f"Release : {release_dir}") + print(f"PBF : {pbf_root}") + print(f"Style : {style_path}") + print(f"URL : http://{args.host}:{args.port}/") + print("") + print("Ctrl+C to stop.") + + try: + server.serve_forever() + except KeyboardInterrupt: + pass + finally: + server.server_close() + + +if __name__ == "__main__": + main() + diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..7ac2bb3 --- /dev/null +++ b/web/index.html @@ -0,0 +1,67 @@ + + + + + + CM95 PBF Test + + + + + + + +
+ +
+ CM95 v1.4.5
+ +
+ + + + diff --git a/web/style.json b/web/style.json new file mode 100644 index 0000000..936b19d --- /dev/null +++ b/web/style.json @@ -0,0 +1,2496 @@ +{ + "version": 8, + "name": "CM95 v1.4.5 Local Web Validation", + "sprite": "https://pbf.jpcn.ccwu.cc/sprite/sprite", + "glyphs": "https://pbf.jpcn.ccwu.cc/fonts/{fontstack}/{range}.pbf", + "sources": { + "mapple": { + "type": "raster", + "minzoom": 0, + "maxzoom": 19, + "tileSize": 256, + "tiles": [ + "https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png" + ], + "attribution": "© 昭文社" + }, + "tide": { + "type": "vector", + "minzoom": 8, + "maxzoom": 8, + "tiles": [ + "https://tile.mapple-on.jp/tide-mvt/{z}/{x}/{y}.pbf?ver=20251001" + ], + "attribution": "© 日本水路協会" + }, + "navsea_delivery": { + "type": "vector", + "minzoom": 0, + "maxzoom": 12, + "tiles": [ + "http://127.0.0.1:8080/pbf/{z}/{x}/{y}.pbf" + ], + "attribution": "CM95 v1.4.5 local validation" + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "rgba(255,255,255,1)" + } + }, + { + "id": "base-raster", + "type": "raster", + "source": "mapple", + "paint": { + "raster-opacity": 1, + "raster-saturation": 0, + "raster-contrast": 0.05 + } + }, + { + "id": "tide-spots", + "type": "symbol", + "source": "tide", + "source-layer": "tide", + "layout": { + "icon-allow-overlap": true, + "icon-image": "tide_spot" + } + }, + { + "id": "sea-area-fill", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "match", + [ + "get", + "chart_fill_style" + ], + [ + "depth_zone_0-2m", + "depth_zone_0-5m", + "depth_zone_0-10m", + "depth_zone_0-20m", + "depth_zone_2-5m", + "depth_zone_2-10m", + "depth_zone_2-20m", + "depth_zone_5-10m", + "depth_zone_5-20m", + "depth_zone_10-20m", + "depth_zone_20-100m", + "depth_zone_20-200m", + "depth_zone_100-200m", + "depth_zone_200-500m", + "depth_zone_500-1000m", + "depth_zone_1000-2000m", + "depth_zone_2000-3000m", + "depth_zone_3000-4000m", + "depth_zone_4000-5000m", + "depth_zone_5000-6000m", + "depth_zone_6000-7000m", + "depth_zone_7000-8000m", + "depth_zone_8000-9000m", + "depth_zone_over_9000m", + "water_area" + ], + true, + false + ], + [ + "match", + [ + "get", + "canonical_object_type" + ], + [ + "0-2m", + "0-5m", + "0-10m", + "0-20m", + "2-5m", + "2-10m", + "2-20m", + "5-10m", + "5-20m", + "10-20m", + "20-100m", + "20-200m", + "100-200m", + "200-500m", + "500-1000m", + "1000-2000m", + "2000-3000m", + "3000-4000m", + "4000-5000m", + "5000-6000m", + "6000-7000m", + "7000-8000m", + "8000-9000m", + "over_9000m" + ], + true, + false + ] + ], + "paint": { + "fill-color": [ + "match", + [ + "get", + "canonical_object_type" + ], + "0-2m", + "rgba(240,250,255,1)", + "0-5m", + "rgba(240,250,255,1)", + "0-10m", + "rgba(230,250,255,1)", + "0-20m", + "rgba(220,250,251,1)", + "2-5m", + "rgba(240,250,255,1)", + "2-10m", + "rgba(230,250,255,1)", + "2-20m", + "rgba(220,250,255,1)", + "5-10m", + "rgba(230,250,255,1)", + "5-20m", + "rgba(220,250,255,1)", + "10-20m", + "rgba(220,250,255,1)", + "20-100m", + "rgba(200,240,255,1)", + "20-200m", + "rgba(200,230,255,1)", + "100-200m", + "rgba(200,230,255,1)", + "200-500m", + "rgba(180,220,255,1)", + "500-1000m", + "rgba(171,192,255,1)", + "1000-2000m", + "rgba(163,181,255,1)", + "2000-3000m", + "rgba(132,169,255,1)", + "3000-4000m", + "rgba(89,155,255,1)", + "4000-5000m", + "rgba(90,140,255,1)", + "5000-6000m", + "rgba(100,132,255,1)", + "6000-7000m", + "rgba(128,128,255,1)", + "7000-8000m", + "rgba(139,118,255,1)", + "8000-9000m", + "rgba(150,100,255,1)", + "over_9000m", + "rgba(160,100,255,1)", + "river_area", + "rgba(129,195,226,1)", + "lake_area", + "rgba(129,195,226,1)", + "inland_water_area", + "rgba(129,195,226,1)", + "tidal_flat", + "rgba(143,191,147,1)", + [ + "match", + [ + "get", + "chart_fill_style" + ], + "depth_zone_0-2m", + "rgba(240,250,255,1)", + "depth_zone_0-5m", + "rgba(240,250,255,1)", + "depth_zone_0-10m", + "rgba(230,250,255,1)", + "depth_zone_0-20m", + "rgba(220,250,251,1)", + "depth_zone_2-5m", + "rgba(240,250,255,1)", + "depth_zone_2-10m", + "rgba(230,250,255,1)", + "depth_zone_2-20m", + "rgba(220,250,255,1)", + "depth_zone_5-10m", + "rgba(230,250,255,1)", + "depth_zone_5-20m", + "rgba(220,250,255,1)", + "depth_zone_10-20m", + "rgba(220,250,255,1)", + "depth_zone_20-100m", + "rgba(200,240,255,1)", + "depth_zone_20-200m", + "rgba(200,230,255,1)", + "depth_zone_100-200m", + "rgba(200,230,255,1)", + "depth_zone_200-500m", + "rgba(180,220,255,1)", + "depth_zone_500-1000m", + "rgba(171,192,255,1)", + "depth_zone_1000-2000m", + "rgba(163,181,255,1)", + "depth_zone_2000-3000m", + "rgba(132,169,255,1)", + "depth_zone_3000-4000m", + "rgba(89,155,255,1)", + "depth_zone_4000-5000m", + "rgba(90,140,255,1)", + "depth_zone_5000-6000m", + "rgba(100,132,255,1)", + "depth_zone_6000-7000m", + "rgba(128,128,255,1)", + "depth_zone_7000-8000m", + "rgba(139,118,255,1)", + "depth_zone_8000-9000m", + "rgba(150,100,255,1)", + "depth_zone_over_9000m", + "rgba(160,100,255,1)", + "water_area", + "rgba(129,195,226,1)", + "rgba(160,100,255,1)" + ] + ] + } + }, + { + "id": "tidal-flat", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "==", + [ + "get", + "chart_fill_style" + ], + "tidal_flat" + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "tidal_flat" + ] + ], + "paint": { + "fill-color": "rgba(143,191,147,1)" + } + }, + { + "id": "river-water", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "==", + [ + "get", + "chart_fill_style" + ], + "river_water" + ], + [ + "match", + [ + "get", + "canonical_object_type" + ], + [ + "river_area", + "lake_area", + "inland_water_area" + ], + true, + false + ] + ], + "paint": { + "fill-color": "rgba(129,195,226,1)" + } + }, + { + "id": "unsurveyed-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "==", + [ + "get", + "chart_fill_style" + ], + "unsurveyed_area" + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "unsurveyed_area" + ] + ], + "paint": { + "fill-color": "#efe3a8", + "fill-opacity": 0.55 + } + }, + { + "id": "shoal-danger-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "==", + [ + "get", + "chart_fill_style" + ], + "shoal_danger_area" + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "shoal_danger_area" + ] + ], + "paint": { + "fill-color": "#f0a85d", + "fill-opacity": 0.45 + } + }, + { + "id": "coast-structures-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "baseline_area", + "filter": [ + "any", + [ + "==", + [ + "get", + "chart_fill_style" + ], + "coast_structure_area" + ], + [ + "match", + [ + "get", + "canonical_object_type" + ], + [ + "breakwater", + "floating_facility_pier", + "removed_structure_remains" + ], + true, + false + ] + ], + "paint": { + "fill-color": "#8e887d", + "fill-opacity": 0.85 + } + }, + { + "id": "hazard-polygons", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "anchor_caution_hazard_area", + "paint": { + "fill-pattern": [ + "coalesce", + [ + "get", + "chart_fill_pattern" + ], + "" + ] + } + }, + { + "id": "navigation-hazard-polygons", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "navigation_hazard_area", + "paint": { + "fill-pattern": [ + "coalesce", + [ + "get", + "chart_fill_pattern" + ], + "" + ] + } + }, + { + "id": "fishery-areas", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "fixed_fishing_gear_area", + "paint": { + "fill-pattern": [ + "coalesce", + [ + "get", + "chart_fill_pattern" + ], + "" + ] + } + }, + { + "id": "fishery-areas-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "fixed_fishing_gear_area", + "paint": { + "line-color": "rgba(198,77,187,1)", + "line-width": 1 + } + }, + { + "id": "anchorage-areas", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "anchorage_area", + "paint": { + "fill-color": "rgba(0,0,0,0)" + } + }, + { + "id": "facility-zones", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "facility_boundary_area", + "paint": { + "fill-pattern": [ + "coalesce", + [ + "get", + "chart_fill_pattern" + ], + "" + ] + } + }, + { + "id": "submerged-structures", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "submerged_reef_area", + "paint": { + "fill-color": "#7d7f95", + "fill-opacity": 0.45, + "fill-outline-color": "#55586f" + } + }, + { + "id": "bridge-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "bridge_structure", + "paint": { + "fill-color": "rgba(0,0,0,0)" + } + }, + { + "id": "bridge-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "bridge_structure", + "paint": { + "line-color": "rgba(95,106,95,1)", + "line-width": 2 + } + }, + { + "id": "land-structures-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "onshore_structure_area", + "paint": { + "fill-color": "#8a6d3b", + "fill-opacity": 0.8 + } + }, + { + "id": "land-area", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "land_area", + "paint": { + "fill-color": "rgba(210,200,128,1)" + } + }, + { + "id": "land-hole", + "type": "fill", + "source": "navsea_delivery", + "source-layer": "hole_area", + "paint": { + "fill-color": "rgba(0,0,0,0)" + } + }, + { + "id": "bathymetry-support", + "type": "line", + "source": "navsea_delivery", + "source-layer": "bathymetry_line", + "paint": { + "line-width": [ + "match", + [ + "get", + "depth_value_m" + ], + 10, + 1, + 20, + 1, + 40, + 1, + 60, + 1, + 80, + 1, + 100, + 1, + 150, + 1, + 200, + 1, + 300, + 1, + 400, + 1, + 500, + 1, + 600, + 1, + 700, + 1, + 800, + 1, + 900, + 1, + 1000, + 1, + 1500, + 1, + 2000, + 1, + 2500, + 1, + 3000, + 1, + 3500, + 1, + 4000, + 1, + 4500, + 1, + 5000, + 1, + 5500, + 1, + 6000, + 1, + 8000, + 1, + 10000, + 1, + 0.5 + ], + "line-color": [ + "step", + [ + "get", + "depth_value_m" + ], + "rgba(126,230,146,1)", + 10, + "rgba(106,210,126,1)", + 11, + "rgba(126,230,146,1)", + 20, + "rgba(106,210,126,1)", + 21, + "rgba(126,230,146,1)", + 30, + "rgba(144,220,255,1)", + 40, + "rgba(113,193,235,1)", + 41, + "rgba(133,213,255,1)", + 45, + "rgba(122,206,255,1)", + 50, + "rgba(111,199,255,1)", + 55, + "rgba(100,192,255,1)", + 60, + "rgba(69,164,235,1)", + 61, + "rgba(89,184,255,1)", + 65, + "rgba(78,177,255,1)", + 70, + "rgba(67,170,255,1)", + 75, + "rgba(56,163,255,1)", + 80, + "rgba(24,136,235,1)", + 81, + "rgba(44,156,255,1)", + 85, + "rgba(22,142,255,1)", + 90, + "rgba(33,149,255,1)", + 95, + "rgba(11,135,255,1)", + 100, + "rgba(0,108,235,1)", + 101, + "rgba(0,128,255,1)", + 110, + "rgba(0,115,255,1)", + 120, + "rgba(0,102,255,1)", + 130, + "rgba(0,90,255,1)", + 140, + "rgba(0,77,255,1)", + 150, + "rgba(0,44,235,1)", + 151, + "rgba(0,64,255,1)", + 160, + "rgba(0,51,255,1)", + 170, + "rgba(0,38,255,1)", + 180, + "rgba(0,26,255,1)", + 190, + "rgba(0,13,255,1)", + 200, + "rgba(0,0,235,1)", + 201, + "rgba(0,0,255,1)", + 300, + "rgba(0,0,219,1)", + 301, + "rgba(0,0,239,1)", + 400, + "rgba(0,0,203,1)", + 401, + "rgba(0,0,223,1)", + 500, + "rgba(0,0,187,1)", + 501, + "rgba(0,0,207,1)", + 600, + "rgba(0,0,172,1)", + 601, + "rgba(0,0,192,1)", + 700, + "rgba(0,0,156,1)", + 701, + "rgba(0,0,176,1)", + 800, + "rgba(0,0,140,1)", + 801, + "rgba(0,0,160,1)", + 900, + "rgba(0,0,124,1)", + 901, + "rgba(0,0,144,1)", + 1000, + "rgba(0,0,108,1)", + 1001, + "rgba(0,0,128,1)", + 1100, + "rgba(0,6,122,1)", + 1200, + "rgba(0,13,115,1)", + 1300, + "rgba(0,19,109,1)", + 1400, + "rgba(0,26,102,1)", + 1500, + "rgba(20,50,116,1)", + 1501, + "rgba(0,32,96,1)", + 1600, + "rgba(0,39,90,1)", + 1700, + "rgba(0,45,83,1)", + 1800, + "rgba(0,51,77,1)", + 1900, + "rgba(0,58,70,1)", + 2000, + "rgba(0,51,77,1)", + 2001, + "rgba(0,51,77,1)", + 2100, + "rgba(0,56,72,1)", + 2200, + "rgba(0,61,67,1)", + 2300, + "rgba(0,67,61,1)", + 2400, + "rgba(0,72,56,1)", + 2500, + "rgba(10,87,61,1)", + 2501, + "rgba(0,77,51,1)", + 2600, + "rgba(0,82,46,1)", + 2700, + "rgba(0,87,41,1)", + 2800, + "rgba(0,92,36,1)", + 2900, + "rgba(0,97,31,1)", + 3000, + "rgba(10,112,36,1)", + 3001, + "rgba(0,102,26,1)", + 3100, + "rgba(0,108,20,1)", + 3200, + "rgba(0,113,15,1)", + 3300, + "rgba(0,112,10,1)", + 3400, + "rgba(0,123,5,1)", + 3500, + "rgba(10,138,10,1)", + 3501, + "rgba(0,128,0,1)", + 3600, + "rgba(2,124,2,1)", + 3700, + "rgba(3,121,3,1)", + 3800, + "rgba(5,117,5,1)", + 3900, + "rgba(6,114,6,1)", + 4000, + "rgba(18,120,18,1)", + 4001, + "rgba(18,110,18,1)", + 4100, + "rgba(10,107,10,1)", + 4200, + "rgba(11,103,11,1)", + 4300, + "rgba(13,100,13,1)", + 4400, + "rgba(14,96,14,1)", + 4500, + "rgba(26,103,26,1)", + 4501, + "rgba(16,93,16,1)", + 4600, + "rgba(18,89,18,1)", + 4700, + "rgba(19,26,19,1)", + 4800, + "rgba(21,82,21,1)", + 4900, + "rgba(22,79,22,1)", + 5000, + "rgba(34,85,34,1)", + 5001, + "rgba(24,75,24,1)", + 5100, + "rgba(26,72,26,1)", + 5200, + "rgba(27,68,27,1)", + 5300, + "rgba(29,65,29,1)", + 5400, + "rgba(30,61,30,1)", + 5500, + "rgba(42,68,42,1)", + 5501, + "rgba(32,58,32,1)", + 5600, + "rgba(34,54,34,1)", + 5700, + "rgba(35,51,35,1)", + 5800, + "rgba(37,47,37,1)", + 5900, + "rgba(38,44,38,1)", + 6000, + "rgba(50,50,50,1)", + 6001, + "rgba(40,40,40,1)", + 6500, + "rgba(58,30,58,1)", + 7000, + "rgba(75,20,75,1)", + 7500, + "rgba(93,10,93,1)", + 8000, + "rgba(120,10,120,1)", + 8001, + "rgba(110,0,110,1)", + 8500, + "rgba(117,0,117,1)", + 9000, + "rgba(123,0,123,1)", + 9500, + "rgba(130,0,130,1)", + 10000, + "rgba(147,0,147,1)", + 10001, + "rgba(137,0,137,1)", + 10500, + "rgba(143,0,143,1)" + ] + } + }, + { + "id": "depth-contours", + "type": "line", + "source": "navsea_delivery", + "source-layer": "depth_contour", + "paint": { + "line-color": "rgba(136,152,139,1)", + "line-width": 1 + } + }, + { + "id": "depth-contour-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "depth_contour", + "minzoom": 11, + "layout": { + "symbol-placement": "line", + "symbol-spacing": 200, + "text-allow-overlap": true, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10, + "text-rotation-alignment": "viewport" + }, + "filter": [ + "all", + [ + "==", + [ + "get", + "chart_text_style" + ], + "depth_text" + ], + [ + "has", + "chart_label_text" + ] + ], + "paint": { + "text-color": "rgba(7,7,7,1)" + } + }, + { + "id": "bathymetry-depth-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "bathymetry_line", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + [ + "get", + "chart_text_style" + ], + "depth_text" + ], + [ + "has", + "chart_label_text" + ] + ], + "layout": { + "text-allow-overlap": true, + "symbol-placement": "line", + "symbol-spacing": 200, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10, + "text-rotation-alignment": "viewport" + }, + "paint": { + "text-color": "rgba(7,7,7,1)" + } + }, + { + "id": "subsea-cables", + "type": "line", + "source": "navsea_delivery", + "source-layer": "seabed_line", + "paint": { + "line-color": "#814d99", + "line-width": 1.3, + "line-dasharray": [ + 3, + 1.2 + ] + } + }, + { + "id": "coast-structures-line", + "type": "line", + "source": "navsea_delivery", + "source-layer": "baseline_line", + "paint": { + "line-color": "#5f5a50", + "line-width": 1.4 + } + }, + { + "id": "land-structures-line", + "type": "line", + "source": "navsea_delivery", + "source-layer": "onshore_structure_line", + "paint": { + "line-color": "rgba(147,116,39,1)", + "line-width": 2 + } + }, + { + "id": "water-boundary", + "type": "line", + "source": "navsea_delivery", + "source-layer": "depth_zone_739", + "paint": { + "line-color": "#4f8ca7", + "line-width": 1.1 + } + }, + { + "id": "regulatory-boundary", + "type": "line", + "source": "navsea_delivery", + "source-layer": "depth_zone_741", + "paint": { + "line-color": "#cb5c46", + "line-width": 1.2, + "line-dasharray": [ + 2, + 2 + ] + } + }, + { + "id": "height-limit-line", + "type": "line", + "source": "navsea_delivery", + "source-layer": "clearance_limit_line", + "paint": { + "line-color": "#ad3b6a", + "line-width": 1.1 + } + }, + { + "id": "clip-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "baseline_outline", + "paint": { + "line-color": "rgba(95,106,95,1)", + "line-width": 2 + } + }, + { + "id": "danger-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "hazard_boundary_outline", + "paint": { + "line-color": "rgba(95,106,95,1)", + "line-width": 3, + "line-dasharray": [ + 3, + 2 + ] + } + }, + { + "id": "navigation-hazard-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "navigation_hazard_outline", + "paint": { + "line-width": [ + "coalesce", + [ + "get", + "chart_line_width" + ], + 1 + ], + "line-color": [ + "coalesce", + [ + "get", + "chart_line_color" + ], + "rgba(136,152,139,1)" + ] + } + }, + { + "id": "anchor-danger-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "anchor_caution_hazard_outline", + "paint": { + "line-width": [ + "coalesce", + [ + "get", + "chart_line_width" + ], + 1 + ], + "line-color": [ + "coalesce", + [ + "get", + "chart_line_color" + ], + "rgba(136,152,139,1)" + ] + } + }, + { + "id": "anchorage-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "anchorage_outline", + "paint": { + "line-color": [ + "coalesce", + [ + "get", + "chart_line_color" + ], + "rgba(136,152,139,1)" + ], + "line-width": [ + "coalesce", + [ + "get", + "chart_line_width" + ], + 2 + ], + "line-dasharray": [ + 2, + 1 + ] + } + }, + { + "id": "facility-zone-outline", + "type": "line", + "source": "navsea_delivery", + "source-layer": "facility_boundary_outline", + "paint": { + "line-color": [ + "coalesce", + [ + "get", + "chart_line_color" + ], + "rgba(136,152,139,1)" + ], + "line-width": [ + "coalesce", + [ + "get", + "chart_line_width" + ], + 1 + ] + } + }, + { + "id": "special-pattern-line-754", + "type": "line", + "source": "navsea_delivery", + "source-layer": "clip_outline_754", + "paint": { + "line-pattern": [ + "coalesce", + [ + "get", + "chart_line_pattern" + ], + "" + ], + "line-width": 8 + } + }, + { + "id": "hazard-points", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_hazard_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + } + }, + { + "id": "anchorage-symbols", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "anchorage_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + } + }, + { + "id": "anchor-hazard-points", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "anchor_caution_hazard_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "all", + [ + "!", + [ + "has", + "class_code" + ] + ], + [ + "!=", + [ + "get", + "chart_symbol_code" + ], + "obstruction" + ], + [ + "!=", + [ + "get", + "chart_symbol_code" + ], + "hazard_mark" + ], + [ + "!=", + [ + "get", + "chart_symbol_code" + ], + "fish_reef" + ] + ] + }, + { + "id": "anchor-hazard-points-428", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "anchor_caution_hazard_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + } + }, + { + "id": "nav-light-flare", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-size": 1.0, + "icon-image": [ + "match", + [ + "get", + "light_color_code" + ], + "green", + "flare_green", + "red", + "flare_red", + "yellow", + "flare_yellow_white", + "white", + "flare_yellow_white", + "amber", + "flare_yellow_white", + "orange", + "flare_yellow_white", + "flare_yellow_white" + ] + }, + "filter": [ + "all", + [ + "has", + "light_color_code" + ], + [ + "any", + [ + "all", + [ + "has", + "shape_class_code" + ], + [ + "match", + [ + "to-number", + [ + "get", + "shape_class_code" + ] + ], + 301, + true, + 302, + true, + 303, + true, + 306, + true, + 311, + true, + 312, + true, + 315, + true, + 316, + true, + 318, + true, + 320, + true, + 322, + true, + 324, + true, + 326, + true, + 328, + true, + 332, + true, + 334, + true, + false + ] + ], + [ + "all", + [ + "has", + "display_code" + ], + [ + "match", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "301", + true, + "302", + true, + "303", + true, + "306", + true, + "311", + true, + "312", + true, + "315", + true, + "316", + true, + "318", + true, + "320", + true, + "322", + true, + "324", + true, + "326", + true, + "328", + true, + "332", + true, + "334", + true, + false + ] + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "minor_light" + ] + ] + ] + }, + { + "id": "nav-light-arc", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "visibility": "visible", + "icon-allow-overlap": true, + "icon-rotation-alignment": "map", + "icon-image": [ + "case", + [ + "has", + "arc_id" + ], + [ + "get", + "arc_id" + ], + [ + "match", + [ + "get", + "light_color_code" + ], + "green", + "arc_green", + "red", + "arc_red", + "arc_yellow_white" + ] + ] + }, + "filter": [ + "all", + [ + "==", + [ + "get", + "chart_symbol_code" + ], + "lighthouse" + ], + [ + "has", + "light_color_code" + ] + ] + }, + { + "id": "nav-marks-harbor-lighthouses", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-size": 1.08, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "any", + [ + "all", + [ + "has", + "display_code" + ], + [ + "==", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "301" + ] + ], + [ + "all", + [ + "!", + [ + "has", + "display_code" + ] + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "harbor_lighthouse" + ] + ] + ] + }, + { + "id": "nav-marks-breakwater-lighthouses", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-size": 1.08, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "any", + [ + "all", + [ + "has", + "display_code" + ], + [ + "==", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "302" + ] + ], + [ + "all", + [ + "!", + [ + "has", + "display_code" + ] + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "breakwater_lighthouse" + ] + ] + ] + }, + { + "id": "nav-marks-small-lights", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "any", + [ + "all", + [ + "has", + "display_code" + ], + [ + "match", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "303", + true, + "305", + true, + "306", + true, + "307", + true, + "308", + true, + "309", + true, + false + ] + ], + [ + "all", + [ + "!", + [ + "has", + "display_code" + ] + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "minor_light" + ] + ] + ] + }, + { + "id": "nav-marks-light-beacons", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "any", + [ + "all", + [ + "has", + "display_code" + ], + [ + "==", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "311" + ] + ], + [ + "all", + [ + "!", + [ + "has", + "display_code" + ] + ], + [ + "==", + [ + "get", + "canonical_object_type" + ], + "light_beacon" + ] + ] + ] + }, + { + "id": "nav-marks", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "all", + [ + "!", + [ + "all", + [ + "has", + "display_code" + ], + [ + "match", + [ + "slice", + [ + "get", + "display_code" + ], + 0, + 3 + ], + "301", + true, + "302", + true, + "303", + true, + "305", + true, + "306", + true, + "307", + true, + "308", + true, + "309", + true, + "311", + true, + false + ] + ] + ], + [ + "!=", + [ + "get", + "canonical_object_type" + ], + "harbor_lighthouse" + ], + [ + "!=", + [ + "get", + "canonical_object_type" + ], + "breakwater_lighthouse" + ], + [ + "!=", + [ + "get", + "canonical_object_type" + ], + "minor_light" + ], + [ + "!=", + [ + "get", + "canonical_object_type" + ], + "light_beacon" + ] + ] + }, + { + "id": "facility-points", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "facility_boundary_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + } + }, + { + "id": "pilot-station-points", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "pilot_station_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + } + }, + { + "id": "landmark-points", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "onshore_structure_point", + "layout": { + "icon-allow-overlap": true, + "icon-ignore-placement": true, + "icon-image": [ + "coalesce", + [ + "get", + "chart_icon_image" + ], + "" + ] + }, + "filter": [ + "any", + [ + "has", + "class_code" + ], + [ + "match", + [ + "get", + "canonical_object_type" + ], + "chimney", + true, + "tower_yagura_windmill", + true, + "maritime_office", + true, + "fishing_cooperative", + true, + "mountain_top", + true, + "other_landmark_monument", + true, + false + ] + ] + }, + { + "id": "landmark-point-fallback", + "type": "circle", + "source": "navsea_delivery", + "source-layer": "onshore_structure_point", + "filter": [ + "all", + [ + "!", + [ + "has", + "class_code" + ] + ], + [ + "match", + [ + "get", + "canonical_object_type" + ], + "chimney", + false, + "tower_yagura_windmill", + false, + "maritime_office", + false, + "fishing_cooperative", + false, + "mountain_top", + false, + "other_landmark_monument", + false, + true + ] + ], + "paint": { + "circle-radius": 3, + "circle-color": "#695641", + "circle-stroke-color": "#fff9ee", + "circle-stroke-width": 0.8 + } + }, + { + "id": "bottom-material-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "seabed_text_point", + "minzoom": 11, + "filter": [ + "all", + [ + "has", + "chart_label_text" + ], + [ + "!=", + [ + "get", + "canonical_object_type" + ], + "spot_sounding" + ] + ], + "layout": { + "text-allow-overlap": true, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10 + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + } + }, + { + "id": "spot-sounding-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "seabed_text_point", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + [ + "get", + "canonical_object_type" + ], + "spot_sounding" + ], + [ + "has", + "chart_label_text" + ] + ], + "layout": { + "text-allow-overlap": false, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10 + }, + "paint": { + "text-color": "rgba(7,7,7,1)" + } + }, + { + "id": "height-limit-points", + "type": "circle", + "source": "navsea_delivery", + "source-layer": "clearance_limit_point", + "paint": { + "circle-radius": 3.5, + "circle-color": "#ab355f", + "circle-stroke-color": "#ffffff", + "circle-stroke-width": 0.8 + } + }, + { + "id": "height-limit-name-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "clearance_limit_point", + "minzoom": 11, + "filter": [ + "has", + "name_ja" + ], + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "name_ja" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 12, + "text-anchor": "bottom" + }, + "paint": { + "text-color": "rgba(255,0,0,1)" + } + }, + { + "id": "height-limit-value-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "clearance_limit_point", + "minzoom": 11, + "filter": [ + "has", + "chart_label_text" + ], + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "concat", + "高さ", + [ + "get", + "chart_label_text" + ], + "m" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 12, + "text-anchor": "top" + }, + "paint": { + "text-color": "rgba(255,0,0,1)" + } + }, + { + "id": "nav-mark-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10, + "text-offset": [ + "match", + [ + "get", + "chart_label_position_code" + ], + "tl", + [ + "literal", + [ + 2, + 2.5 + ] + ], + "t", + [ + "literal", + [ + 0, + 2.5 + ] + ], + "tr", + [ + "literal", + [ + -2, + 2.5 + ] + ], + "l", + [ + "literal", + [ + 2, + 0.5 + ] + ], + "c", + [ + "literal", + [ + 0, + 0.5 + ] + ], + "r", + [ + "literal", + [ + -2, + 0.5 + ] + ], + "bl", + [ + "literal", + [ + 2, + -1.5 + ] + ], + "b", + [ + "literal", + [ + 0, + -1.5 + ] + ], + "br", + [ + "literal", + [ + -2, + -1.5 + ] + ], + [ + "literal", + [ + 0, + 0.5 + ] + ] + ], + "text-anchor": [ + "match", + [ + "get", + "chart_label_position_code" + ], + "tl", + "top-left", + "t", + "top", + "tr", + "top-right", + "l", + "left", + "c", + "center", + "r", + "right", + "bl", + "bottom-left", + "b", + "bottom", + "br", + "bottom-right", + "center" + ] + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + }, + "filter": [ + "has", + "chart_label_text" + ] + }, + { + "id": "nav-light-abbr-labels", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "navigation_marks", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "chart_label_subtext" + ], + "text-font": [ + "NotoSansCJK-Regular" + ], + "text-size": 10, + "text-offset": [ + "match", + [ + "get", + "chart_label_position_code" + ], + "tl", + [ + "literal", + [ + 2, + 1.5 + ] + ], + "t", + [ + "literal", + [ + 0, + 1.5 + ] + ], + "tr", + [ + "literal", + [ + -2, + 1.5 + ] + ], + "l", + [ + "literal", + [ + 2, + -0.5 + ] + ], + "c", + [ + "literal", + [ + 0, + -0.5 + ] + ], + "r", + [ + "literal", + [ + -2, + -0.5 + ] + ], + "bl", + [ + "literal", + [ + 2, + -2.5 + ] + ], + "b", + [ + "literal", + [ + 0, + -2.5 + ] + ], + "br", + [ + "literal", + [ + -2, + -2.5 + ] + ], + [ + "literal", + [ + 0, + -0.5 + ] + ] + ], + "text-anchor": [ + "match", + [ + "get", + "chart_label_position_code" + ], + "tl", + "top-left", + "t", + "top", + "tr", + "top-right", + "l", + "left", + "c", + "center", + "r", + "right", + "bl", + "bottom-left", + "b", + "bottom", + "br", + "bottom-right", + "center" + ] + }, + "paint": { + "text-color": [ + "case", + [ + "==", + [ + "get", + "chart_text_color" + ], + "#000000" + ], + "rgba(0,0,0,1)", + [ + "coalesce", + [ + "get", + "chart_text_color" + ], + "rgba(0,0,0,1)" + ] + ] + }, + "filter": [ + "has", + "chart_label_subtext" + ] + }, + { + "id": "place-labels-sea-en", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "place_label_sea", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "place_name_en" + ], + "text-font": [ + "NotoSerifCJK-Regular" + ], + "text-size": 10, + "text-anchor": "top" + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + }, + "filter": [ + "has", + "place_name_en" + ] + }, + { + "id": "place-labels-sea-ja", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "place_label_sea", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSerifCJK-Regular" + ], + "text-size": 10, + "text-anchor": "bottom" + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + }, + "filter": [ + "has", + "chart_label_text" + ] + }, + { + "id": "place-labels-land-en", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "place_label_land", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "place_name_en" + ], + "text-font": [ + "NotoSerifCJK-Regular" + ], + "text-size": 10, + "text-anchor": "top" + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + }, + "filter": [ + "has", + "place_name_en" + ] + }, + { + "id": "place-labels-land-ja", + "type": "symbol", + "source": "navsea_delivery", + "source-layer": "place_label_land", + "layout": { + "text-allow-overlap": true, + "text-max-width": 100, + "text-field": [ + "get", + "chart_label_text" + ], + "text-font": [ + "NotoSerifCJK-Regular" + ], + "text-size": 10, + "text-anchor": "bottom" + }, + "paint": { + "text-color": "rgba(0,0,0,1)" + }, + "filter": [ + "has", + "chart_label_text" + ] + } + ] +} \ No newline at end of file diff --git a/使用说明.txt b/使用说明.txt new file mode 100644 index 0000000..d9cf265 --- /dev/null +++ b/使用说明.txt @@ -0,0 +1,31 @@ +CM95 Japan STEP 8 继续执行包 + +解压到: +D:\React\cm93-mysql-importer-starter\ + +然后执行: + +cd D:\React\cm93-mysql-importer-starter + +powershell -ExecutionPolicy Bypass ` + -File .\scripts\cm95_japan_continue_from_step8.ps1 + +本脚本: +- 不 DROP MySQL; +- 不重新 import 1492 个 Cell; +- 重新跑 gap audit / closure; +- 使用 Dataset 1 专属 disposition,把 25 个新增 variant 显式归入 pending; +- 使用 Japan full-detail policy,在 z12 优先消费 G=1:7,500; +- 从零重建 FID manifest; +- 从零生成新的 production plan; +- 全量 build PBF; +- finalize-production。 + +技术 closure 预期: +Observed gap variants = 165 +Unclassified = 0 +Pending = 137 variants / 90009 rows +OVERALL classification = PASS + +重要: +最终 semantic_completeness 仍然是 PENDING_REVIEW。 diff --git a/替换与下一步说明.md b/替换与下一步说明.md new file mode 100644 index 0000000..29c1605 --- /dev/null +++ b/替换与下一步说明.md @@ -0,0 +1,86 @@ +# CM95 PBF Stage 1 Mapping v1 使用说明 + +本包是 CM95 → NavSea PBF 的 PBF-02 初版实施产物。 + +## 文件 + +```text +config/mappings/cm95_to_navsea_v1.yaml +docs/CM95到NavSea映射设计报告_v1.md +docs/cm95_mapping_contract_check_v1.json +tools/cm95_nav_aid_relation_audit_v1.py +tools/cm95_mapping_contract_check_v1.py +``` + +## 当前状态 + +- 映射覆盖选定 AOI 全部 80 个 object_class + geometry_type 组合。 +- 当前 unified style source-layer 静态检查 PASS。 +- 当前 semantic sprite 常量引用静态检查 PASS。 +- 生产 importer / schema 未修改。 +- 还没有生成正式 PBF。 +- 下一门禁是对全 AOI 的 `_cm93_relation20_raw` 助航对象合成关系做验证。 + +## 复制位置 + +将本包内目录整体合并到 CM95 仓库根目录: + +```text +D:\React\cm93-mysql-importer-starter\ +``` + +即得到: + +```text +D:\React\cm93-mysql-importer-starter\config\mappings\cm95_to_navsea_v1.yaml +D:\React\cm93-mysql-importer-starter\docs\CM95到NavSea映射设计报告_v1.md +D:\React\cm93-mysql-importer-starter\tools\cm95_nav_aid_relation_audit_v1.py +D:\React\cm93-mysql-importer-starter\tools\cm95_mapping_contract_check_v1.py +``` + +## 下一步只需运行 relation20 审计 + +```powershell +cd D:\React\cm93-mysql-importer-starter + +& ".\.venv\Scripts\python.exe" .\tools\cm95_nav_aid_relation_audit_v1.py ` + --host 127.0.0.1 ` + --port 3306 ` + --user root ` + --database cm93_chart ` + --dataset-id 1 +``` + +输入 MySQL 密码。 + +输出: + +```text +cm95_nav_aid_relation_audit_v1.json +cm95_nav_aid_relation_groups_v1.csv +cm95_nav_aid_relation_audit_v1.txt +``` + +把 JSON 上传给 ChatGPT。 + +## 不要修改 + +此阶段不修改: + +```text +src/cm93db/geometry.py +src/cm93db/importer.py +sql/001_schema_mysql57.sql +``` + +## relation20 通过后 + +下一阶段直接进入: + +```text +PBF-03 +CM95 MySQL +→ semantic mapping +→ navigation aid composition +→ z10/914/385 single-tile MVT/PBF generator +``` diff --git a/替换与执行说明.md b/替换与执行说明.md new file mode 100644 index 0000000..15b2360 --- /dev/null +++ b/替换与执行说明.md @@ -0,0 +1,29 @@ +# CM95 PBF Production v1.4.7 替换与执行说明 + +## 解压 + +把 ZIP 根目录直接覆盖到: + +`D:\React\cm93-mysql-importer-starter\` + +## 执行 + +```powershell +cd D:\React\cm93-mysql-importer-starter + +powershell -ExecutionPolicy Bypass ` + -File .\scripts\cm95_japan_v1_4_7_finalize_existing.ps1 +``` + +## 重要 + +这次: + +- 不 DROP MySQL; +- 不 import; +- 不 build-production; +- 不重新生成 27,038 个 jobs; +- 不创建新的 PBF release; +- 直接对现有 release `cm95-d1-62a85bd40d3a-6bc3c1352da3` 重新 finalize。 + +v1.4.7 保持 v1.4.6 builder contract,因此现有 Plan/PBF 合法复用。 diff --git a/替换说明.md b/替换说明.md new file mode 100644 index 0000000..ba535c6 --- /dev/null +++ b/替换说明.md @@ -0,0 +1,54 @@ +# 替换说明 + +本包只修改/新增文档与长期回归工具,不修改已验收通过的生产逻辑。 + +## 完整替换 + +将包内: + +- `README.md` +- `AGENTS.md` + +完整覆盖仓库根目录同名文件。 + +## 新增目录/文件 + +整体复制: + +- `docs/CM93_Importer冻结基线_v1.md` +- `tools/cm93_mysql_final_geometry_audit.py` +- `tools/cm93_mysql_non_geometry_final_audit.py` +- `tools/update_manifest_sha256.ps1` + +## 不要修改 + +本包没有也不应覆盖: + +- `src/cm93db/geometry.py` +- `src/cm93db/importer.py` +- `sql/001_schema_mysql57.sql` + +## 替换后 + +在仓库根目录执行: + +```powershell +powershell -ExecutionPolicy Bypass -File .\tools\update_manifest_sha256.ps1 + +git status +git diff -- README.md AGENTS.md docs tools MANIFEST.sha256 +``` + +确认无误后: + +```powershell +git add README.md AGENTS.md docs tools MANIFEST.sha256 +git commit -m "Freeze validated CM93 importer baseline docs and audits" +git push origin main +``` + +不要移动或重写现有 tag: + +```text +cm93-mysql-importer-baseline-v1 +```